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 {