Skip to content

Commit

Permalink
Implement attenuation
Browse files Browse the repository at this point in the history
  • Loading branch information
MichailiK committed Apr 14, 2024
1 parent 1a1641e commit 490a077
Show file tree
Hide file tree
Showing 8 changed files with 183 additions and 16 deletions.
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>com.jagrosh</groupId>
<artifactId>JMusicBot</artifactId>
<version>0.4.0-on-lavaplayer-afec211</version>
<version>SNAPSHOT</version>
<packaging>jar</packaging>

<repositories>
Expand Down
1 change: 1 addition & 0 deletions src/main/java/com/jagrosh/jmusicbot/JMusicBot.java
Original file line number Diff line number Diff line change
Expand Up @@ -202,6 +202,7 @@ private static CommandClient createCommandClient(BotConfig config, SettingsManag
new ShuffleCmd(bot),
new SkipCmd(bot),

new AttenuationCmd(bot),
new ForceRemoveCmd(bot),
new ForceskipCmd(bot),
new MoveTrackCmd(bot),
Expand Down
92 changes: 84 additions & 8 deletions src/main/java/com/jagrosh/jmusicbot/audio/AudioHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,15 @@
import com.jagrosh.jmusicbot.queue.AbstractQueue;
import com.jagrosh.jmusicbot.settings.QueueType;
import com.jagrosh.jmusicbot.settings.RepeatMode;
import com.jagrosh.jmusicbot.utils.OtherUtil;
import com.sedmelluq.discord.lavaplayer.player.AudioPlayer;
import com.sedmelluq.discord.lavaplayer.player.event.AudioEventAdapter;
import com.sedmelluq.discord.lavaplayer.track.AudioTrack;
import com.sedmelluq.discord.lavaplayer.track.AudioTrackEndReason;
import com.sedmelluq.discord.lavaplayer.track.playback.AudioFrame;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;

import java.util.*;

import com.jagrosh.jmusicbot.settings.Settings;
import com.jagrosh.jmusicbot.utils.FormatUtil;
import com.sedmelluq.discord.lavaplayer.source.youtube.YoutubeAudioTrack;
Expand All @@ -36,15 +36,20 @@
import net.dv8tion.jda.api.JDA;
import net.dv8tion.jda.api.MessageBuilder;
import net.dv8tion.jda.api.audio.AudioSendHandler;
import net.dv8tion.jda.api.audio.SpeakingMode;
import net.dv8tion.jda.api.audio.hooks.ConnectionListener;
import net.dv8tion.jda.api.audio.hooks.ConnectionStatus;
import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.User;
import org.jetbrains.annotations.NotNull;
import org.slf4j.LoggerFactory;

/**
*
* @author John Grosh <[email protected]>
*/
public class AudioHandler extends AudioEventAdapter implements AudioSendHandler
public class AudioHandler extends AudioEventAdapter implements AudioSendHandler, ConnectionListener
{
public final static String PLAY_EMOJI = "\u25B6"; // ▶
public final static String PAUSE_EMOJI = "\u23F8"; // ⏸
Expand All @@ -59,12 +64,17 @@ public class AudioHandler extends AudioEventAdapter implements AudioSendHandler

private AudioFrame lastFrame;
private AbstractQueue<QueuedTrack> queue;
private final List<Long> speakingUsers = new ArrayList<>();
private int volume;
private int attenuation;

protected AudioHandler(PlayerManager manager, Guild guild, AudioPlayer player)
protected AudioHandler(PlayerManager manager, Guild guild, AudioPlayer player, int volume, int attenuation)
{
this.manager = manager;
this.audioPlayer = player;
this.guildId = guild.getIdLong();
this.volume = volume;
this.attenuation = attenuation;

this.setQueueType(manager.getBot().getSettingsManager().getSettings(guildId).getQueueType());
}
Expand Down Expand Up @@ -163,6 +173,40 @@ public boolean playFromDefault()
return true;
}

public void setVolume(int volume)
{
this.volume = volume;
determineVolume();
}

public int getVolume()
{
return volume;
}

public void setAttenuation(int attenuation)
{
this.attenuation = attenuation;
determineVolume();
}

public int getAttenuation()
{
return attenuation;
}

private void determineVolume()
{
if (attenuation == 0) {
audioPlayer.setVolume(volume);
return;
}
if (speakingUsers.isEmpty())
audioPlayer.setVolume(volume);
else
audioPlayer.setVolume((int) (volume * ((float) attenuation / 100)));
}

// Audio Events
@Override
public void onTrackEnd(AudioPlayer player, AudioTrack track, AudioTrackEndReason endReason)
Expand Down Expand Up @@ -270,7 +314,39 @@ public String getStatusEmoji()
{
return audioPlayer.isPaused() ? PAUSE_EMOJI : PLAY_EMOJI;
}


// Connection Listener methods
@Override
public void onPing(long l) {
LoggerFactory.getLogger("AudioHandler").info("Ping for audio connection in "+guildId+" is "+l+"ms");
}

@Override
public void onStatusChange(@NotNull ConnectionStatus connectionStatus) {
// unused
}

@Override
public void onUserSpeaking(@NotNull User user, boolean b) {
// ignored
}

@Override
public void onUserSpeaking(@NotNull User user, @NotNull EnumSet<SpeakingMode> modes) {
LoggerFactory.getLogger("AudioHandler").info("User "+user.getName()+" speak state changed with modes "+modes);
if (modes.contains(SpeakingMode.VOICE))
{
if (!speakingUsers.contains(user.getIdLong()))
speakingUsers.add(user.getIdLong());
}
else
{
speakingUsers.remove(user.getIdLong());
}

determineVolume();
}

// Audio Send Handler methods
/*@Override
public boolean canProvide()
Expand All @@ -292,7 +368,7 @@ public byte[] provide20MsAudio()
return data;
}*/

@Override
public boolean canProvide()
{
Expand Down
6 changes: 4 additions & 2 deletions src/main/java/com/jagrosh/jmusicbot/audio/PlayerManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

import com.dunctebot.sourcemanagers.DuncteBotSources;
import com.jagrosh.jmusicbot.Bot;
import com.jagrosh.jmusicbot.settings.Settings;
import com.sedmelluq.discord.lavaplayer.player.AudioPlayer;
import com.sedmelluq.discord.lavaplayer.player.DefaultAudioPlayerManager;
import com.sedmelluq.discord.lavaplayer.source.AudioSourceManagers;
Expand Down Expand Up @@ -60,11 +61,12 @@ public AudioHandler setUpHandler(Guild guild)
AudioHandler handler;
if(guild.getAudioManager().getSendingHandler()==null)
{
Settings settings = bot.getSettingsManager().getSettings(guild);
AudioPlayer player = createPlayer();
player.setVolume(bot.getSettingsManager().getSettings(guild).getVolume());
handler = new AudioHandler(this, guild, player);
handler = new AudioHandler(this, guild, player, settings.getVolume(), settings.getAttenuation());
player.addListener(handler);
guild.getAudioManager().setSendingHandler(handler);
guild.getAudioManager().setConnectionListener(handler);
}
else
handler = (AudioHandler) guild.getAudioManager().getSendingHandler();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,8 @@ protected void execute(CommandEvent event)
try
{
event.getGuild().getAudioManager().openAudioConnection(userState.getChannel());
event.getGuild().getAudioManager().setSelfDeafened(true);
if (settings.getAttenuation() == 0)
event.getGuild().getAudioManager().setSelfDeafened(true);
}
catch(PermissionException ex)
{
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
/*
* Copyright 2016 John Grosh <[email protected]>.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.jagrosh.jmusicbot.commands.dj;

import com.jagrosh.jdautilities.command.CommandEvent;
import com.jagrosh.jmusicbot.Bot;
import com.jagrosh.jmusicbot.audio.AudioHandler;
import com.jagrosh.jmusicbot.commands.DJCommand;
import com.jagrosh.jmusicbot.settings.Settings;
import com.jagrosh.jmusicbot.utils.FormatUtil;

/**
*
* @author John Grosh <[email protected]>
*/
public class AttenuationCmd extends DJCommand
{
public AttenuationCmd(Bot bot)
{
super(bot);
this.name = "attenuation";
this.aliases = bot.getConfig().getAliases(this.name);
this.help = "sets or shows attenuation";
this.arguments = "[0-100]";
}

@Override
public void doCommand(CommandEvent event)
{
AudioHandler handler = (AudioHandler)event.getGuild().getAudioManager().getSendingHandler();
Settings settings = event.getClient().getSettingsFor(event.getGuild());
int attenuation = handler.getAttenuation();
if(event.getArgs().isEmpty())
{
event.reply(FormatUtil.volumeIcon(attenuation)+" Current attenuation is `"+attenuation+"`");
}
else
{
int nattenuation;
try{
nattenuation = Integer.parseInt(event.getArgs());
}catch(NumberFormatException e){
nattenuation = -1;
}
if(nattenuation<0 || nattenuation>150)
event.reply(event.getClient().getError()+" Attenuation must be a valid integer between 0 and 100!");
else
{
handler.setAttenuation(nattenuation);
settings.setAttenuation(nattenuation);
event.getGuild().getAudioManager().setSelfDeafened(nattenuation == 0);
event.reply(FormatUtil.volumeIcon(nattenuation)+" Attenuation changed from `"+attenuation+"` to `"+nattenuation+"`");
}
}
}

}
18 changes: 16 additions & 2 deletions src/main/java/com/jagrosh/jmusicbot/settings/Settings.java
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,9 @@ public class Settings implements GuildSettingsProvider
private QueueType queueType;
private String prefix;
private double skipRatio;
private int attenuation;

public Settings(SettingsManager manager, String textId, String voiceId, String roleId, int volume, String defaultPlaylist, RepeatMode repeatMode, String prefix, double skipRatio, QueueType queueType)
public Settings(SettingsManager manager, String textId, String voiceId, String roleId, int volume, String defaultPlaylist, RepeatMode repeatMode, String prefix, double skipRatio, QueueType queueType, int attenuation)
{
this.manager = manager;
try
Expand Down Expand Up @@ -73,9 +74,10 @@ public Settings(SettingsManager manager, String textId, String voiceId, String r
this.prefix = prefix;
this.skipRatio = skipRatio;
this.queueType = queueType;
this.attenuation = attenuation;
}

public Settings(SettingsManager manager, long textId, long voiceId, long roleId, int volume, String defaultPlaylist, RepeatMode repeatMode, String prefix, double skipRatio, QueueType queueType)
public Settings(SettingsManager manager, long textId, long voiceId, long roleId, int volume, String defaultPlaylist, RepeatMode repeatMode, String prefix, double skipRatio, QueueType queueType, int attenuation)
{
this.manager = manager;
this.textId = textId;
Expand All @@ -87,6 +89,7 @@ public Settings(SettingsManager manager, long textId, long voiceId, long roleId,
this.prefix = prefix;
this.skipRatio = skipRatio;
this.queueType = queueType;
this.attenuation = attenuation;
}

// Getters
Expand Down Expand Up @@ -141,6 +144,11 @@ public Collection<String> getPrefixes()
return prefix == null ? Collections.emptySet() : Collections.singleton(prefix);
}

public int getAttenuation()
{
return attenuation;
}

// Setters
public void setTextChannel(TextChannel tc)
{
Expand Down Expand Up @@ -195,4 +203,10 @@ public void setQueueType(QueueType queueType)
this.queueType = queueType;
this.manager.writeSettings();
}

public void setAttenuation(int attenuation)
{
this.attenuation = attenuation;
this.manager.writeSettings();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,8 @@ public SettingsManager()
o.has("repeat_mode") ? o.getEnum(RepeatMode.class, "repeat_mode"): RepeatMode.OFF,
o.has("prefix") ? o.getString("prefix") : null,
o.has("skip_ratio") ? o.getDouble("skip_ratio") : -1,
o.has("queue_type") ? o.getEnum(QueueType.class, "queue_type") : QueueType.FAIR));
o.has("queue_type") ? o.getEnum(QueueType.class, "queue_type") : QueueType.FAIR,
o.has("attenuation") ? o.getInt("attenuation") : 0));
});
} catch (NoSuchFileException e) {
// create an empty json file
Expand Down Expand Up @@ -95,7 +96,7 @@ public Settings getSettings(long guildId)

private Settings createDefaultSettings()
{
return new Settings(this, 0, 0, 0, 100, null, RepeatMode.OFF, null, -1, QueueType.FAIR);
return new Settings(this, 0, 0, 0, 100, null, RepeatMode.OFF, null, -1, QueueType.FAIR, 0);
}

protected void writeSettings()
Expand All @@ -122,6 +123,8 @@ protected void writeSettings()
o.put("skip_ratio", s.getSkipRatio());
if(s.getQueueType() != QueueType.FAIR)
o.put("queue_type", s.getQueueType().name());
if(s.getAttenuation() != 0)
o.put("attenuation", s.getAttenuation());
obj.put(Long.toString(key), o);
});
try {
Expand Down

0 comments on commit 490a077

Please sign in to comment.