diff --git a/pom.xml b/pom.xml
index f046f2294..95f7a6c63 100644
--- a/pom.xml
+++ b/pom.xml
@@ -3,7 +3,7 @@
4.0.0
com.jagrosh
JMusicBot
- 0.4.0-on-lavaplayer-afec211
+ SNAPSHOT
jar
diff --git a/src/main/java/com/jagrosh/jmusicbot/JMusicBot.java b/src/main/java/com/jagrosh/jmusicbot/JMusicBot.java
index 66071a1fa..a57f9d8b6 100644
--- a/src/main/java/com/jagrosh/jmusicbot/JMusicBot.java
+++ b/src/main/java/com/jagrosh/jmusicbot/JMusicBot.java
@@ -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),
diff --git a/src/main/java/com/jagrosh/jmusicbot/audio/AudioHandler.java b/src/main/java/com/jagrosh/jmusicbot/audio/AudioHandler.java
index 310389dbe..f9e6d7477 100644
--- a/src/main/java/com/jagrosh/jmusicbot/audio/AudioHandler.java
+++ b/src/main/java/com/jagrosh/jmusicbot/audio/AudioHandler.java
@@ -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;
@@ -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
*/
-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"; // ⏸
@@ -59,12 +64,17 @@ public class AudioHandler extends AudioEventAdapter implements AudioSendHandler
private AudioFrame lastFrame;
private AbstractQueue queue;
+ private final List 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());
}
@@ -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)
@@ -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 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()
@@ -292,7 +368,7 @@ public byte[] provide20MsAudio()
return data;
}*/
-
+
@Override
public boolean canProvide()
{
diff --git a/src/main/java/com/jagrosh/jmusicbot/audio/PlayerManager.java b/src/main/java/com/jagrosh/jmusicbot/audio/PlayerManager.java
index f4a5605ce..73dd73d81 100644
--- a/src/main/java/com/jagrosh/jmusicbot/audio/PlayerManager.java
+++ b/src/main/java/com/jagrosh/jmusicbot/audio/PlayerManager.java
@@ -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;
@@ -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();
diff --git a/src/main/java/com/jagrosh/jmusicbot/commands/MusicCommand.java b/src/main/java/com/jagrosh/jmusicbot/commands/MusicCommand.java
index e03f073af..af21de728 100644
--- a/src/main/java/com/jagrosh/jmusicbot/commands/MusicCommand.java
+++ b/src/main/java/com/jagrosh/jmusicbot/commands/MusicCommand.java
@@ -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)
{
diff --git a/src/main/java/com/jagrosh/jmusicbot/commands/dj/AttenuationCmd.java b/src/main/java/com/jagrosh/jmusicbot/commands/dj/AttenuationCmd.java
new file mode 100644
index 000000000..bfcb72555
--- /dev/null
+++ b/src/main/java/com/jagrosh/jmusicbot/commands/dj/AttenuationCmd.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2016 John Grosh .
+ *
+ * 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
+ */
+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+"`");
+ }
+ }
+ }
+
+}
diff --git a/src/main/java/com/jagrosh/jmusicbot/settings/Settings.java b/src/main/java/com/jagrosh/jmusicbot/settings/Settings.java
index d9fb84545..d2eddac0c 100644
--- a/src/main/java/com/jagrosh/jmusicbot/settings/Settings.java
+++ b/src/main/java/com/jagrosh/jmusicbot/settings/Settings.java
@@ -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
@@ -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;
@@ -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
@@ -141,6 +144,11 @@ public Collection getPrefixes()
return prefix == null ? Collections.emptySet() : Collections.singleton(prefix);
}
+ public int getAttenuation()
+ {
+ return attenuation;
+ }
+
// Setters
public void setTextChannel(TextChannel tc)
{
@@ -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();
+ }
}
diff --git a/src/main/java/com/jagrosh/jmusicbot/settings/SettingsManager.java b/src/main/java/com/jagrosh/jmusicbot/settings/SettingsManager.java
index 72f744c0e..9620dbb38 100644
--- a/src/main/java/com/jagrosh/jmusicbot/settings/SettingsManager.java
+++ b/src/main/java/com/jagrosh/jmusicbot/settings/SettingsManager.java
@@ -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
@@ -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()
@@ -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 {