v1.1.0 #378

Merged
greg6775 merged 32 commits from greg-dev into master 2020-02-20 21:02:19 +01:00
31 changed files with 168 additions and 186 deletions

View file

@ -5,7 +5,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>Hadder</groupId> <groupId>Hadder</groupId>
<artifactId>Hadder</artifactId> <artifactId>Hadder</artifactId>
<version>1.0.3</version> <version>1.1.0</version>
<name>Hadder</name> <name>Hadder</name>
@ -66,7 +66,7 @@
<dependency> <dependency>
<groupId>com.rethinkdb</groupId> <groupId>com.rethinkdb</groupId>
<artifactId>rethinkdb-driver</artifactId> <artifactId>rethinkdb-driver</artifactId>
<version>2.3.3</version> <version>2.4.0</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.slf4j</groupId> <groupId>org.slf4j</groupId>

View file

@ -136,23 +136,18 @@ public class Rethink {
.with("blacklisted", "none")); .with("blacklisted", "none"));
} }
// TODO
public boolean hasStarboardChannel(String guild_id) {
return !this.getByID("server", guild_id, "starboard").equals("");
}
// TODO
public void insertStarboardMessage(String message_id, String guild_id, String starboard_message_id) { public void insertStarboardMessage(String message_id, String guild_id, String starboard_message_id) {
this.insert("stars", r.hashMap("id", message_id).with("guild", guild_id).with("starboardmsg", starboard_message_id)); this.insert("stars", r.hashMap("id", message_id).with("guild", guild_id).with("starboardmsg", starboard_message_id));
} }
// TODO
public String getStarboardMessage(String message_id) { public String getStarboardMessage(String message_id) {
return (String) this.getByID("stars", message_id, "starboardmsg"); return (String) this.getByID("stars", message_id, "starboardmsg");
} }
// TODO
public void removeStarboardMessage(String message_id) { public void removeStarboardMessage(String message_id) {
this.remove("stars", "id", message_id); this.remove("stars", "id", message_id);
} }
// TODO
public boolean hasStarboardMessage(String message_id) { public boolean hasStarboardMessage(String message_id) {
try { try {
this.getByID("stars", message_id, "guild"); this.getByID("stars", message_id, "guild");
@ -162,7 +157,6 @@ public class Rethink {
} }
} }
public void pushServer(RethinkServer server) { public void pushServer(RethinkServer server) {
JSONObject object = new JSONObject(); JSONObject object = new JSONObject();
for (Field field : server.getClass().getDeclaredFields()) { for (Field field : server.getClass().getDeclaredFields()) {

View file

@ -24,15 +24,15 @@ public class RethinkServer {
private Rethink rethink; private Rethink rethink;
String accept_emote = ""; public String accept_emote = "";
String decline_emote = ""; public String decline_emote = "";
String id; public String id;
boolean invite_detect = false; public boolean invite_detect = false;
String message_id = ""; public String message_id = "";
String neededstars = "3"; public String neededstars = "3";
String prefix = "h."; public String prefix = "h.";
String role_id = ""; public String role_id = "";
String starboard = ""; public String starboard = "";
public RethinkServer(JSONObject object, Rethink rethink) { public RethinkServer(JSONObject object, Rethink rethink) {
for (Field field : this.getClass().getDeclaredFields()) { for (Field field : this.getClass().getDeclaredFields()) {
@ -68,7 +68,7 @@ public class RethinkServer {
return id; return id;
} }
public boolean isInviteDetect() { public boolean hasInviteDetect() {
return invite_detect; return invite_detect;
} }
@ -116,6 +116,10 @@ public class RethinkServer {
this.starboard = starboard; this.starboard = starboard;
} }
public boolean hasStarboardChannel() {
return !"".equals(starboard);
}
public void updateRules(String message_id, String role_id, String accept_emote, String decline_emote) { public void updateRules(String message_id, String role_id, String accept_emote, String decline_emote) {
this.setMessageID(message_id); this.setMessageID(message_id);
this.setRoleID(role_id); this.setRoleID(role_id);

View file

@ -24,10 +24,10 @@ public class RethinkUser {
private Rethink rethink; private Rethink rethink;
String id; public String id;
String prefix = "h."; public String prefix = "h.";
String language = "en"; public String language = "en";
String blacklisted = "none"; public String blacklisted = "none";
public RethinkUser(JSONObject object, Rethink rethink) { public RethinkUser(JSONObject object, Rethink rethink) {
for (Field field : this.getClass().getDeclaredFields()) { for (Field field : this.getClass().getDeclaredFields()) {

View file

@ -76,6 +76,7 @@ public class AudioManager {
@Override @Override
public void trackLoaded(AudioTrack track) { public void trackLoaded(AudioTrack track) {
if (getTrackManager(guild).getQueuedTracks().isEmpty()) {
getTrackManager(guild).queue(track, event.getMember()); getTrackManager(guild).queue(track, event.getMember());
msg.editMessage(event.getMessageEditor().getMessage(MessageEditor.MessageType.INFO, msg.editMessage(event.getMessageEditor().getMessage(MessageEditor.MessageType.INFO,
"commands.music.play.success.loading.title", "", "commands.music.play.success.loading.title", "",
@ -87,6 +88,19 @@ public class AudioManager {
TimeUnit.MILLISECONDS.toMinutes(track.getInfo().length) % TimeUnit.HOURS.toMinutes(1), TimeUnit.MILLISECONDS.toMinutes(track.getInfo().length) % TimeUnit.HOURS.toMinutes(1),
TimeUnit.MILLISECONDS.toSeconds(track.getInfo().length) % TimeUnit.MINUTES.toSeconds(1)), true) TimeUnit.MILLISECONDS.toSeconds(track.getInfo().length) % TimeUnit.MINUTES.toSeconds(1)), true)
.build()).queue(); .build()).queue();
} else {
getTrackManager(guild).queue(track, event.getMember());
msg.editMessage(event.getMessageEditor().getMessage(MessageEditor.MessageType.INFO,
"commands.music.play.success.queueing.title", "",
"", "")
.addField(event.getMessageEditor().getTerm("commands.music.play.success.title"), track.getInfo().title, false)
.addField(event.getMessageEditor().getTerm("commands.music.play.success.author"), track.getInfo().author, true)
.addField(event.getMessageEditor().getTerm("commands.music.play.success.length"),
String.format("%02d:%02d:%02d", TimeUnit.MILLISECONDS.toHours(track.getInfo().length),
TimeUnit.MILLISECONDS.toMinutes(track.getInfo().length) % TimeUnit.HOURS.toMinutes(1),
TimeUnit.MILLISECONDS.toSeconds(track.getInfo().length) % TimeUnit.MINUTES.toSeconds(1)), true)
.build()).queue();
}
} }
@Override @Override

View file

@ -18,15 +18,20 @@ package com.bbn.hadder.audio;
import com.sedmelluq.discord.lavaplayer.player.AudioPlayer; import com.sedmelluq.discord.lavaplayer.player.AudioPlayer;
import com.sedmelluq.discord.lavaplayer.track.playback.AudioFrame; import com.sedmelluq.discord.lavaplayer.track.playback.AudioFrame;
import net.dv8tion.jda.api.audio.AudioReceiveHandler;
import net.dv8tion.jda.api.audio.AudioSendHandler; import net.dv8tion.jda.api.audio.AudioSendHandler;
import net.dv8tion.jda.api.audio.CombinedAudio;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
public class AudioPlayerSendHandler implements AudioSendHandler { public class AudioPlayerSendHandler implements AudioSendHandler, AudioReceiveHandler {
private final AudioPlayer audioPlayer; private final AudioPlayer audioPlayer;
private AudioFrame lastFrame; private AudioFrame lastFrame;
private final Queue<byte[]> queue = new ConcurrentLinkedQueue<>();
public AudioPlayerSendHandler(AudioPlayer audioPlayer) { public AudioPlayerSendHandler(AudioPlayer audioPlayer) {
this.audioPlayer = audioPlayer; this.audioPlayer = audioPlayer;
@ -34,16 +39,22 @@ public class AudioPlayerSendHandler implements AudioSendHandler {
@Override @Override
public boolean canProvide() { public boolean canProvide() {
if (lastFrame == null) { if (audioPlayer.getPlayingTrack() == null)
return !queue.isEmpty();
else if (lastFrame == null) {
lastFrame = audioPlayer.provide(); lastFrame = audioPlayer.provide();
}
return lastFrame != null; return lastFrame != null;
} }
return false;
}
@Nullable @Nullable
@Override @Override
public ByteBuffer provide20MsAudio() { public ByteBuffer provide20MsAudio() {
if (audioPlayer.getPlayingTrack() == null) {
byte[] data = queue.poll();
return data == null ? null : ByteBuffer.wrap(data);
} else {
if (lastFrame == null) { if (lastFrame == null) {
lastFrame = audioPlayer.provide(); lastFrame = audioPlayer.provide();
} }
@ -53,9 +64,24 @@ public class AudioPlayerSendHandler implements AudioSendHandler {
return ByteBuffer.wrap(data); return ByteBuffer.wrap(data);
} }
}
@Override
public boolean canReceiveCombined() {
return queue.size() < 10;
}
@Override
public void handleCombinedAudio(CombinedAudio combinedAudio) {
if (combinedAudio.getUsers().isEmpty())
return;
byte[] data = combinedAudio.getAudioData(1.0f);
queue.add(data);
}
@Override @Override
public boolean isOpus() { public boolean isOpus() {
return true; return audioPlayer.getPlayingTrack() != null;
} }
} }

View file

@ -63,17 +63,19 @@ public class TrackManager extends AudioEventAdapter {
@Override @Override
public void onTrackEnd(AudioPlayer player, AudioTrack track, AudioTrackEndReason endReason) { public void onTrackEnd(AudioPlayer player, AudioTrack track, AudioTrackEndReason endReason) {
Guild g = queue.poll().getAuthor().getGuild();
this.lastTrack = track;
if (loop) { if (loop) {
this.lastTrack = track;
player.playTrack(lastTrack.makeClone()); player.playTrack(lastTrack.makeClone());
} else if (queue.isEmpty()) { } else {
Guild g = queue.poll().getAuthor().getGuild();
manager.getPlayer(g).stopTrack();
if (!queue.isEmpty()) player.playTrack(queue.element().getTrack().makeClone());
else {
manager.players.remove(g.getId()); manager.players.remove(g.getId());
manager.getPlayer(g).destroy(); manager.getPlayer(g).destroy();
manager.getTrackManager(g).purgeQueue(); manager.getTrackManager(g).purgeQueue();
g.getAudioManager().closeAudioConnection(); g.getAudioManager().closeAudioConnection();
} else { }
player.playTrack(queue.element().getTrack());
} }
} }
@ -98,8 +100,4 @@ public class TrackManager extends AudioEventAdapter {
{ {
this.loop = repeating; this.loop = repeating;
} }
public AudioInfo getTrackInfo(AudioTrack track) {
return queue.stream().filter(audioInfo -> audioInfo.getTrack().equals(track)).findFirst().orElse(null);
}
} }

View file

@ -41,11 +41,12 @@ public class CodeCommand implements Command {
"commands.misc.code.success.description") "commands.misc.code.success.description")
.addField("Code", "[" + args[0] + "](https://discord.gg/" + args[0] + ")", true) .addField("Code", "[" + args[0] + "](https://discord.gg/" + args[0] + ")", true)
.addField("Guild Name", json.getJSONObject("guild").getString("name"), true) .addField("Guild Name", json.getJSONObject("guild").getString("name"), true)
.addBlankField(true)
.addField("Verification Level", String.valueOf(json.getJSONObject("guild").getInt("verification_level")), true)
.addField("Guild ID", json.getJSONObject("guild").getString("id"), true) .addField("Guild ID", json.getJSONObject("guild").getString("id"), true)
.addField("Verification Level", json.getJSONObject("guild").getString("verification_level"), true) .addBlankField(true)
.setThumbnail("https://cdn.discordapp.com/icons/" + json.getJSONObject("guild").getString("id") + "/" + json.getJSONObject("guild").getString("icon") + ".png") .setThumbnail("https://cdn.discordapp.com/icons/" + json.getJSONObject("guild").getString("id") + "/" + json.getJSONObject("guild").getString("icon") + ".png")
.build()).queue(); .build()).queue();
e.getTextChannel().sendMessage(json.toString()).queue();
} catch (JSONException ex) { } catch (JSONException ex) {
e.getTextChannel().sendMessage(e.getMessageEditor().getMessage(MessageEditor.MessageType.ERROR, e.getTextChannel().sendMessage(e.getMessageEditor().getMessage(MessageEditor.MessageType.ERROR,
"commands.misc.code.error.title", "commands.misc.code.error.title",

View file

@ -74,9 +74,7 @@ public class ScreenShareCommand implements Command {
.setDescription("http://discordapp.com/channels/" + e.getGuild().getId() + "/" + vcs.get(0).getId() + "/").build()).queue(); .setDescription("http://discordapp.com/channels/" + e.getGuild().getId() + "/" + vcs.get(0).getId() + "/").build()).queue();
} }
} }
} else { } else e.getHelpCommand().sendHelp(this, e);
e.getHelpCommand().sendHelp(this, e);
}
} }
@Override @Override

View file

@ -43,6 +43,7 @@ public class ServerStatsCommand implements Command {
.addField("Member Count", String.valueOf(e.getGuild().getMemberCount()), true) .addField("Member Count", String.valueOf(e.getGuild().getMemberCount()), true)
.addField("Explicit Content Level", e.getGuild().getExplicitContentLevel().getKey() + ": " + e.getGuild().getExplicitContentLevel(), true) .addField("Explicit Content Level", e.getGuild().getExplicitContentLevel().getKey() + ": " + e.getGuild().getExplicitContentLevel(), true)
.addField("Features", e.getGuild().getFeatures().toString().replaceAll("\\[", "`").replaceAll(",", "`, `").replaceAll("]", "`"), true) .addField("Features", e.getGuild().getFeatures().toString().replaceAll("\\[", "`").replaceAll(",", "`, `").replaceAll("]", "`"), true)
.addBlankField(true)
.setThumbnail(e.getGuild().getIconUrl()) .setThumbnail(e.getGuild().getIconUrl())
.setImage(e.getGuild().getBannerUrl()); .setImage(e.getGuild().getBannerUrl());

View file

@ -58,8 +58,6 @@ public class BanCommand implements Command {
"commands.moderation.ban.error.title", "commands.moderation.ban.error.title",
"commands.moderation.ban.yourself.error.description").build()).queue(); "commands.moderation.ban.yourself.error.description").build()).queue();
} }
} else if (e.getMessage().getMentionedMembers().size() == 0) {
e.getHelpCommand().sendHelp(this, e);
} else if (e.getMessage().getMentionedMembers().size() > 1) { } else if (e.getMessage().getMentionedMembers().size() > 1) {
for (int i = 0; i < e.getMessage().getMentionedMembers().size(); i++) { for (int i = 0; i < e.getMessage().getMentionedMembers().size(); i++) {
Member member = e.getMessage().getMentionedMembers().get(i); Member member = e.getMessage().getMentionedMembers().get(i);
@ -89,7 +87,7 @@ public class BanCommand implements Command {
"", "",
"commands.moderation.ban.massban.success.description", "commands.moderation.ban.massban.success.description",
String.valueOf(e.getMessage().getMentionedMembers().size())).build()).queue(); String.valueOf(e.getMessage().getMentionedMembers().size())).build()).queue();
} } else e.getHelpCommand().sendHelp(this, e);
} }
@Override @Override

View file

@ -92,9 +92,7 @@ public class ClearCommand implements Command {
} else { } else {
e.getTextChannel().sendMessage(e.getMessageEditor().getMessage(MessageEditor.MessageType.NO_SELF_PERMISSION).build()).queue(); e.getTextChannel().sendMessage(e.getMessageEditor().getMessage(MessageEditor.MessageType.NO_SELF_PERMISSION).build()).queue();
} }
} else { } else e.getHelpCommand().sendHelp(this, e);
e.getHelpCommand().sendHelp(this, e);
}
} }
@Override @Override

View file

@ -31,7 +31,7 @@ public class InviteDetectCommand implements Command {
String opinion = args[0].toLowerCase(); String opinion = args[0].toLowerCase();
switch (opinion) { switch (opinion) {
case "on": case "on":
if (!e.getRethinkServer().isInviteDetect()) { if (!e.getRethinkServer().hasInviteDetect()) {
e.getRethinkServer().setInviteDetect(true); e.getRethinkServer().setInviteDetect(true);
e.getTextChannel().sendMessage( e.getTextChannel().sendMessage(
e.getMessageEditor().getMessage( e.getMessageEditor().getMessage(
@ -50,7 +50,7 @@ public class InviteDetectCommand implements Command {
break; break;
case "off": case "off":
if (e.getRethinkServer().isInviteDetect()) { if (e.getRethinkServer().hasInviteDetect()) {
e.getRethinkServer().setInviteDetect(false); e.getRethinkServer().setInviteDetect(false);
e.getTextChannel().sendMessage(e.getMessageEditor().getMessage( e.getTextChannel().sendMessage(e.getMessageEditor().getMessage(
MessageEditor.MessageType.INFO, MessageEditor.MessageType.INFO,
@ -69,9 +69,7 @@ public class InviteDetectCommand implements Command {
default: default:
e.getHelpCommand().sendHelp(this, e); e.getHelpCommand().sendHelp(this, e);
} }
} else { } else e.getHelpCommand().sendHelp(this, e);
e.getHelpCommand().sendHelp(this, e);
}
} }
@Override @Override

View file

@ -54,8 +54,6 @@ public class KickCommand implements Command {
} else { } else {
e.getTextChannel().sendMessage(e.getMessageEditor().getMessage(MessageEditor.MessageType.ERROR, "commands.moderation.kick.error.title", "commands.moderation.kick.yourself.error.description").build()).queue(); e.getTextChannel().sendMessage(e.getMessageEditor().getMessage(MessageEditor.MessageType.ERROR, "commands.moderation.kick.error.title", "commands.moderation.kick.yourself.error.description").build()).queue();
} }
} else if (e.getMessage().getMentionedMembers().size() == 0) {
e.getHelpCommand().sendHelp(this, e);
} else if (e.getMessage().getMentionedMembers().size() > 1) { } else if (e.getMessage().getMentionedMembers().size() > 1) {
for (int i = 0; i < e.getMessage().getMentionedMembers().size(); i++) { for (int i = 0; i < e.getMessage().getMentionedMembers().size(); i++) {
Member member = e.getMessage().getMentionedMembers().get(i); Member member = e.getMessage().getMentionedMembers().get(i);
@ -74,7 +72,7 @@ public class KickCommand implements Command {
} }
} }
e.getTextChannel().sendMessage(e.getMessageEditor().getMessage(MessageEditor.MessageType.INFO, "commands.moderation.kick.success.title", "", "commands.moderation.kick.masskick.success.description", String.valueOf(e.getMessage().getMentionedMembers().size())).build()).queue(); e.getTextChannel().sendMessage(e.getMessageEditor().getMessage(MessageEditor.MessageType.INFO, "commands.moderation.kick.success.title", "", "commands.moderation.kick.masskick.success.description", String.valueOf(e.getMessage().getMentionedMembers().size())).build()).queue();
} } else e.getHelpCommand().sendHelp(this, e);
} }
@Override @Override

View file

@ -54,9 +54,7 @@ public class NickCommand implements Command {
"commands.moderation.nick.success.description", e.getMessage().getMentionedMembers().get(0).getUser().getAsTag() "commands.moderation.nick.success.description", e.getMessage().getMentionedMembers().get(0).getUser().getAsTag()
).build()).queue(); ).build()).queue();
} }
} else { } else e.getHelpCommand().sendHelp(this, e);
e.getHelpCommand().sendHelp(this, e);
}
} else { } else {
e.getTextChannel().sendMessage(e.getMessageEditor().getMessage(MessageEditor.MessageType.NO_SELF_PERMISSION).build()).queue(); e.getTextChannel().sendMessage(e.getMessageEditor().getMessage(MessageEditor.MessageType.NO_SELF_PERMISSION).build()).queue();
} }
@ -81,9 +79,7 @@ public class NickCommand implements Command {
).build()).queue(); ).build()).queue();
} }
} }
} else if (e.getMessage().getMentionedMembers().size() == 0) { } else if (e.getMessage().getMentionedUsers().size() > 1) {
e.getHelpCommand().sendHelp(this, e);
} else {
for (int i = 0; i < e.getMessage().getMentionedMembers().size(); i++) { for (int i = 0; i < e.getMessage().getMentionedMembers().size(); i++) {
Member member = e.getMessage().getMentionedMembers().get(i); Member member = e.getMessage().getMentionedMembers().get(i);
if (!e.getJDA().getSelfUser().getId().equals(member.getId())) { if (!e.getJDA().getSelfUser().getId().equals(member.getId())) {
@ -99,7 +95,7 @@ public class NickCommand implements Command {
"", "",
"commands.moderation.nick.myself.success.description", String.valueOf(e.getMessage().getMentionedMembers().size()) "commands.moderation.nick.myself.success.description", String.valueOf(e.getMessage().getMentionedMembers().size())
).build()).queue(); ).build()).queue();
} } else e.getHelpCommand().sendHelp(this, e);
} else { } else {
e.getTextChannel().sendMessage(e.getMessageEditor().getMessage(MessageEditor.MessageType.NO_SELF_PERMISSION).build()).queue(); e.getTextChannel().sendMessage(e.getMessageEditor().getMessage(MessageEditor.MessageType.NO_SELF_PERMISSION).build()).queue();
} }

View file

@ -34,7 +34,7 @@ public class PrefixCommand implements Command {
e.getTextChannel().sendMessage(e.getMessageEditor().getMessage( e.getTextChannel().sendMessage(e.getMessageEditor().getMessage(
MessageEditor.MessageType.INFO, MessageEditor.MessageType.INFO,
"commands.moderation.prefix.success.title", "commands.moderation.prefix.success.title",
"", "",
"commands.moderation.prefix.success.description", "commands.moderation.prefix.success.description",
args[0]).build() args[0]).build()
).queue(); ).queue();
@ -45,9 +45,7 @@ public class PrefixCommand implements Command {
"", "",
"commands.moderation.prefix.error.description").build()).queue(); "commands.moderation.prefix.error.description").build()).queue();
} }
} else { } else e.getHelpCommand().sendHelp(this, e);
e.getHelpCommand().sendHelp(this, e);
}
} }
@Override @Override

View file

@ -86,17 +86,16 @@ public class RegionChangeCommand implements Command {
case "us-south": case "us-south":
setRegion(Region.US_SOUTH, "US South", e); setRegion(Region.US_SOUTH, "US South", e);
break; break;
/*case "south-korea": case "south-korea":
setRegion(Region.SOUTH_KOREA, "South Korea", e); setRegion(Region.SOUTH_KOREA, "South Korea", e);
break; break;
TODO: Publish when JDA v4.2.0 is released*/
default: default:
e.getTextChannel().sendMessage( e.getTextChannel().sendMessage(
e.getMessageEditor().getMessage( e.getMessageEditor().getMessage(
MessageEditor.MessageType.INFO, MessageEditor.MessageType.INFO,
"commands.moderation.regionchange.regions.title", "commands.moderation.regionchange.regions.title",
"") "")
.setDescription("**LOCKED:**\n`amsterdam` `frankfurt` `eu-west` `eu-central` `london`\n\n**UNLOCKED:**\n`europe` `brazil` `hongkong` `india` `japan` `singapore` `south-africa` `sydney` `us-central` `us-east` `us-west` `us-south`") .setDescription("**LOCKED:**\n`amsterdam` `frankfurt` `eu-west` `eu-central` `london` `south korea`\n\n**UNLOCKED:**\n`europe` `brazil` `hongkong` `india` `japan` `singapore` `south-africa` `sydney` `us-central` `us-east` `us-west` `us-south`")
.build()).queue(); .build()).queue();
break; break;
} }
@ -124,7 +123,7 @@ public class RegionChangeCommand implements Command {
@Override @Override
public String[] labels() { public String[] labels() {
return new String[]{"changeregion", "cr", "change-region"}; return new String[]{"changeregion", "cr", "change-region", "region"};
} }
@Override @Override

View file

@ -95,9 +95,7 @@ public class RoleCommand implements Command {
} else { } else {
e.getTextChannel().sendMessage(e.getMessageEditor().getMessage(MessageEditor.MessageType.NO_SELF_PERMISSION).build()).queue(); e.getTextChannel().sendMessage(e.getMessageEditor().getMessage(MessageEditor.MessageType.NO_SELF_PERMISSION).build()).queue();
} }
} else { } else e.getHelpCommand().sendHelp(this, e);
e.getHelpCommand().sendHelp(this, e);
}
} }
@Override @Override

View file

@ -39,12 +39,10 @@ public class StarboardCommand implements Command {
if (channel!=null) { if (channel!=null) {
e.getRethinkServer().setStarboard(channel.getId()); e.getRethinkServer().setStarboard(channel.getId());
} }
} else { } else e.getHelpCommand().sendHelp(this, e);
e.getHelpCommand().sendHelp(this, e);
}
} }
if (args.length==2) { if (args.length == 2) {
e.getRethinkServer().setNeededStars(args[1]); e.getRethinkServer().setNeededStars(args[1]);
} }

View file

@ -16,68 +16,33 @@
package com.bbn.hadder.commands.music; package com.bbn.hadder.commands.music;
import com.bbn.hadder.audio.AudioPlayerSendHandler;
import com.bbn.hadder.commands.Command; import com.bbn.hadder.commands.Command;
import com.bbn.hadder.commands.CommandEvent; import com.bbn.hadder.commands.CommandEvent;
import com.bbn.hadder.core.Perm; import com.bbn.hadder.utils.MessageEditor;
import com.bbn.hadder.core.Perms;
import net.dv8tion.jda.api.audio.*;
import net.dv8tion.jda.api.entities.Guild; import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.managers.AudioManager; import net.dv8tion.jda.api.managers.AudioManager;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.nio.ByteBuffer;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
@Perms(Perm.BOT_OWNER)
public class EchoCommand implements Command { public class EchoCommand implements Command {
@Override @Override
public void executed(String[] args, CommandEvent event) { public void executed(String[] args, CommandEvent e) {
Guild guild = event.getMember().getVoiceState().getChannel().getGuild(); Guild guild = e.getMember().getVoiceState().getChannel().getGuild();
AudioManager audioManager = guild.getAudioManager(); AudioManager audioManager = guild.getAudioManager();
EchoHandler handler = new EchoHandler(); AudioPlayerSendHandler handler = new AudioPlayerSendHandler(e.getAudioManager().getPlayer(e.getGuild()));
if (!audioManager.isConnected()) { if (!audioManager.isConnected()) {
audioManager.setSendingHandler(handler); audioManager.setSendingHandler(handler);
audioManager.setReceivingHandler(handler); audioManager.setReceivingHandler(handler);
audioManager.openAudioConnection(event.getMember().getVoiceState().getChannel()); audioManager.openAudioConnection(e.getMember().getVoiceState().getChannel());
e.getTextChannel().sendMessage(e.getMessageEditor().getMessage(MessageEditor.MessageType.INFO,
"commands.music.echo.success.title",
"commands.music.echo.success.description")
.build()).queue();
} else { } else {
audioManager.closeAudioConnection(); audioManager.closeAudioConnection();
} }
} }
public static class EchoHandler implements AudioSendHandler, AudioReceiveHandler {
private final Queue<byte[]> queue = new ConcurrentLinkedQueue<>();
@Override
public boolean canProvide() {
return !queue.isEmpty();
}
@Nullable
@Override
public ByteBuffer provide20MsAudio() {
byte[] data = queue.poll();
return data == null ? null : ByteBuffer.wrap(data); // Wrap this in a java.nio.ByteBuffer
}
@Override
public boolean canReceiveCombined() {
return queue.size() < 10;
}
@Override
public void handleCombinedAudio(@Nonnull CombinedAudio combinedAudio) {
if (combinedAudio.getUsers().isEmpty())
return;
byte[] data = combinedAudio.getAudioData(1.0f); // volume at 100% = 1.0 (50% = 0.5 / 55% = 0.55)
queue.add(data);
}
}
@Override @Override
public String[] labels() { public String[] labels() {
return new String[]{"echo"}; return new String[]{"echo"};
@ -85,7 +50,7 @@ public class EchoCommand implements Command {
@Override @Override
public String description() { public String description() {
return null; return "commands.music.echo.help.description";
} }
@Override @Override
@ -97,5 +62,4 @@ public class EchoCommand implements Command {
public String example() { public String example() {
return null; return null;
} }
} }

View file

@ -1,5 +1,17 @@
/* /*
* @author Hax / Hax6775 / Schlauer_Hax * Copyright 2019-2020 GregTCLTK and Schlauer-Hax
*
* Licensed under the GNU Affero General Public License, Version 3.0;
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.gnu.org/licenses/agpl-3.0.en.html
*
* 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.bbn.hadder.commands.music; package com.bbn.hadder.commands.music;
@ -83,7 +95,7 @@ public class RecordCommand implements Command {
@Override @Override
public String[] labels() { public String[] labels() {
return new String[]{"echo"}; return new String[]{"record"};
} }
@Override @Override

View file

@ -33,7 +33,7 @@ public class SkipCommand implements Command {
} else { } else {
e.getTextChannel().sendMessage(e.getMessageEditor().getMessage(MessageEditor.MessageType.ERROR, e.getTextChannel().sendMessage(e.getMessageEditor().getMessage(MessageEditor.MessageType.ERROR,
"commands.music.skip.error.connected.title", "commands.music.skip.error.connected.title",
"commands.music.skip.error.connected.description ").build()).queue(); "commands.music.skip.error.connected.description").build()).queue();
} }
} else { } else {
e.getTextChannel().sendMessage(e.getMessageEditor().getMessage(MessageEditor.MessageType.ERROR, e.getTextChannel().sendMessage(e.getMessageEditor().getMessage(MessageEditor.MessageType.ERROR,

View file

@ -43,7 +43,6 @@ public class EvalCommand implements Command {
} catch (ScriptException ex) { } catch (ScriptException ex) {
ex.printStackTrace(); ex.printStackTrace();
} }
engine.put("msg".toLowerCase(), e.getMessage()); engine.put("msg".toLowerCase(), e.getMessage());
engine.put("shardmanager".toLowerCase(), Hadder.shardManager); engine.put("shardmanager".toLowerCase(), Hadder.shardManager);
engine.put("rethink".toLowerCase(), e.getRethink()); engine.put("rethink".toLowerCase(), e.getRethink());
@ -97,9 +96,7 @@ public class EvalCommand implements Command {
}, 0, TimeUnit.MILLISECONDS); }, 0, TimeUnit.MILLISECONDS);
} else { } else e.getHelpCommand().sendHelp(this, e);
e.getHelpCommand().sendHelp(this, e);
}
} }
@Override @Override

View file

@ -41,9 +41,7 @@ public class GuildLeaveCommand implements Command {
} catch (Exception ex) { } catch (Exception ex) {
e.getTextChannel().sendMessage(e.getMessageEditor().getMessage(MessageEditor.MessageType.ERROR, "commands.owner.guildleave.error.title", "", "commands.owner.guildleave.help.description", guild.getName()).build()).queue(); e.getTextChannel().sendMessage(e.getMessageEditor().getMessage(MessageEditor.MessageType.ERROR, "commands.owner.guildleave.error.title", "", "commands.owner.guildleave.help.description", guild.getName()).build()).queue();
} }
} else { } else e.getHelpCommand().sendHelp(this, e);
e.getHelpCommand().sendHelp(this, e);
}
} }
@Override @Override

View file

@ -54,9 +54,7 @@ public class LanguageCommand implements Command {
.build()).queue(); .build()).queue();
break; break;
} }
} else { } else e.getHelpCommand().sendHelp(this, e);
e.getHelpCommand().sendHelp(this, e);
}
} }
public void setLanguage(String language_code, String language, CommandEvent e) { public void setLanguage(String language_code, String language, CommandEvent e) {

View file

@ -32,9 +32,7 @@ public class UserPrefixCommand implements Command {
.build()) .build())
.queue(); .queue();
e.getRethinkUser().push(); e.getRethinkUser().push();
} else { } else e.getHelpCommand().sendHelp(this, e);
e.getHelpCommand().sendHelp(this, e);
}
} }
@Override @Override

View file

@ -33,12 +33,6 @@ public enum Perm {
return e.getMember().hasPermission(Permission.MESSAGE_MANAGE) || e.getConfig().getOwners().contains(e.getAuthor().getIdLong()); return e.getMember().hasPermission(Permission.MESSAGE_MANAGE) || e.getConfig().getOwners().contains(e.getAuthor().getIdLong());
} }
}, },
EMBED_MESSAGES {
@Override
public boolean check(CommandEvent e) {
return e.getMember().hasPermission(Permission.MESSAGE_EMBED_LINKS) || e.getConfig().getOwners().contains(e.getAuthor().getIdLong());
}
},
BAN_MEMBERS { BAN_MEMBERS {
@Override @Override
public boolean check(CommandEvent e) { public boolean check(CommandEvent e) {

View file

@ -41,11 +41,11 @@ public class InviteLinkListener extends ListenerAdapter {
@Override @Override
public void onMessageReceived(@Nonnull MessageReceivedEvent e) { public void onMessageReceived(@Nonnull MessageReceivedEvent e) {
RethinkServer rethinkServer = new RethinkServer(rethink.getObjectByID("server", e.getGuild().getId()), rethink);
if (e.isFromType(ChannelType.TEXT)) { if (e.isFromType(ChannelType.TEXT)) {
if (e.getMessage().getContentRaw().contains("discord.gg/") && (!e.getMember().hasPermission(Permission.ADMINISTRATOR) && rethinkServer.isInviteDetect())) { RethinkServer rethinkServer = new RethinkServer(rethink.getObjectByID("server", e.getGuild().getId()), rethink);
if (e.getMessage().getContentRaw().contains("discord.gg/") && (!e.getMember().hasPermission(Permission.ADMINISTRATOR) && rethinkServer.hasInviteDetect())) {
checkInvite(e.getMessage(), "discord.gg/"); checkInvite(e.getMessage(), "discord.gg/");
} else if (e.getMessage().getContentRaw().contains("discordapp.com/invite") && (!e.getMember().hasPermission(Permission.ADMINISTRATOR) && rethinkServer.isInviteDetect())) { } else if (e.getMessage().getContentRaw().contains("discordapp.com/invite") && !e.getMember().hasPermission(Permission.ADMINISTRATOR) && rethinkServer.hasInviteDetect()) {
checkInvite(e.getMessage(), "discordapp.com/invite/"); checkInvite(e.getMessage(), "discordapp.com/invite/");
} }
} }
@ -69,11 +69,11 @@ public class InviteLinkListener extends ListenerAdapter {
@Override @Override
public void onMessageUpdate(@Nonnull MessageUpdateEvent e) { public void onMessageUpdate(@Nonnull MessageUpdateEvent e) {
RethinkServer rethinkServer = new RethinkServer(rethink.getObjectByID("server", e.getGuild().getId()), rethink);
if (e.isFromType(ChannelType.TEXT)) { if (e.isFromType(ChannelType.TEXT)) {
if (e.getMessage().getContentRaw().contains("discord.gg/") && !e.getMember().hasPermission(Permission.ADMINISTRATOR) && rethinkServer.isInviteDetect()) { RethinkServer rethinkServer = new RethinkServer(rethink.getObjectByID("server", e.getGuild().getId()), rethink);
if (e.getMessage().getContentRaw().contains("discord.gg/") && !e.getMember().hasPermission(Permission.ADMINISTRATOR) && rethinkServer.hasInviteDetect()) {
checkInvite(e.getMessage(), "discord.gg/"); checkInvite(e.getMessage(), "discord.gg/");
} else if (e.getMessage().getContentRaw().contains("discordapp.com/invite") && !e.getMember().hasPermission(Permission.ADMINISTRATOR) && rethinkServer.isInviteDetect()) { } else if (e.getMessage().getContentRaw().contains("discordapp.com/invite") && !e.getMember().hasPermission(Permission.ADMINISTRATOR) && rethinkServer.hasInviteDetect()) {
checkInvite(e.getMessage(), "discordapp.com/invite/"); checkInvite(e.getMessage(), "discordapp.com/invite/");
} }
} }

View file

@ -50,7 +50,7 @@ public class StarboardListener extends ListenerAdapter {
if (e.getReaction().getReactionEmote().getName().equals("")) { if (e.getReaction().getReactionEmote().getName().equals("")) {
RethinkServer rethinkServer = new RethinkServer(rethink.getObjectByID("server", e.getGuild().getId()), rethink); RethinkServer rethinkServer = new RethinkServer(rethink.getObjectByID("server", e.getGuild().getId()), rethink);
if (!rethink.hasStarboardMessage(e.getMessageId())) { if (!rethink.hasStarboardMessage(e.getMessageId())) {
if (rethink.hasStarboardChannel(e.getGuild().getId())) { if (rethinkServer.hasStarboardChannel()) {
e.getTextChannel().retrieveMessageById(e.getMessageId()).queue( e.getTextChannel().retrieveMessageById(e.getMessageId()).queue(
msg -> { msg -> {
int stars = 0; int stars = 0;

View file

@ -30,7 +30,7 @@ public class VoiceLeaveListener extends ListenerAdapter {
@Override @Override
public void onGuildVoiceLeave(GuildVoiceLeaveEvent e) { public void onGuildVoiceLeave(GuildVoiceLeaveEvent e) {
if (audioManager.hasPlayer(e.getGuild()) && e.getChannelLeft().getMembers().equals(e.getGuild().getSelfMember())) { if (!e.getMember().getUser().isBot() && audioManager.hasPlayer(e.getGuild()) && e.getChannelLeft().getMembers().size() == 1 && e.getChannelLeft().getMembers().get(0).equals(e.getGuild().getSelfMember())) {
audioManager.players.remove(e.getGuild().getId()); audioManager.players.remove(e.getGuild().getId());
audioManager.getPlayer(e.getGuild()).destroy(); audioManager.getPlayer(e.getGuild()).destroy();
audioManager.getTrackManager(e.getGuild()).purgeQueue(); audioManager.getTrackManager(e.getGuild()).purgeQueue();

View file

@ -117,17 +117,17 @@ commands.moderation.clear.message.error.title = No messages\!
commands.moderation.clear.message.error.description = There are no messages in this channel. commands.moderation.clear.message.error.description = There are no messages in this channel.
commands.moderation.clear.help.description = Deletes the specified number of messages. commands.moderation.clear.help.description = Deletes the specified number of messages.
commands.moderation.prefix.success.title = %extra% Successfully set %extra% commands.moderation.prefix.success.title = %extra% Successfully set %extra%
commands.moderation.prefix.success.description = I successfully set the new prefix for the guild to `%extra%`. commands.moderation.prefix.success.description = I successfully set the new prefix for the server to `%extra%`.
commands.moderation.prefix.error.description = The prefix must not contain **"** commands.moderation.prefix.error.description = The prefix must not contain **"**
commands.moderation.prefix.help.description = Sets the Guild-Prefix. commands.moderation.prefix.help.description = Sets the Guild-Prefix.
commands.moderation.invitedetect.activate.success.title = Successfully activated commands.moderation.invitedetect.activate.success.title = Successfully activated
commands.moderation.invitedetect.activate.success.description = I successfully activated the invite link detection for this guild. commands.moderation.invitedetect.activate.success.description = I successfully activated the invite link detection for this server.
commands.moderation.invitedetect.activate.error.title = Already activated commands.moderation.invitedetect.activate.error.title = Already activated
commands.moderation.invitedetect.activate.error.description = The invite link detection is already activated on this guild. commands.moderation.invitedetect.activate.error.description = The invite link detection is already activated on this server.
commands.moderation.invitedetect.deactivate.success.title = Successfully deactivated commands.moderation.invitedetect.deactivate.success.title = Successfully deactivated
commands.moderation.invitedetect.deactivate.success.description = I successfully deactivated the invite link detection for this guild. commands.moderation.invitedetect.deactivate.success.description = I successfully deactivated the invite link detection for this server.
commands.moderation.invitedetect.deactivate.error.title = Already deactivated commands.moderation.invitedetect.deactivate.error.title = Already deactivated
commands.moderation.invitedetect.deactivate.error.description = The invite link detection is already deactivated on this guild. commands.moderation.invitedetect.deactivate.error.description = The invite link detection is already deactivated on this server.
commands.moderation.invitedetect.help.description = Activate or deactivate the Discord invite link detection. commands.moderation.invitedetect.help.description = Activate or deactivate the Discord invite link detection.
commands.moderation.kick.success.title = %extra% Successfully kicked %extra% commands.moderation.kick.success.title = %extra% Successfully kicked %extra%
commands.moderation.kick.success.description = I successfully kicked %extra%. commands.moderation.kick.success.description = I successfully kicked %extra%.
@ -160,11 +160,11 @@ commands.moderation.rules.rules.description = The channel was successfully set t
commands.moderation.rules.role.title = Role to assign/remove commands.moderation.rules.role.title = Role to assign/remove
commands.moderation.rules.role.description = The rules were successfully set. Please send me the name of the role which the user receives/loses after he accepted the rules. commands.moderation.rules.role.description = The rules were successfully set. Please send me the name of the role which the user receives/loses after he accepted the rules.
commands.moderation.rules.role.error.title = Role does not exist commands.moderation.rules.role.error.title = Role does not exist
commands.moderation.rules.role.error.description = The specified role does not exist on this guild. commands.moderation.rules.role.error.description = The specified role does not exist on this server.
commands.moderation.rules.role.permission.error.title = No permission commands.moderation.rules.role.permission.error.title = No permission
commands.moderation.rules.role.permission.error.description = You cannot select this role because you cannot interact with it. commands.moderation.rules.role.permission.error.description = You cannot select this role because you cannot interact with it.
commands.moderation.rules.guild.error.title = Wrong Guild commands.moderation.rules.guild.error.title = Wrong Guild
commands.moderation.rules.guild.error.description = The mentioned channel must be on this guild\! commands.moderation.rules.guild.error.description = The mentioned channel must be on this server\!
commands.moderation.rules.emote.accept.title = Custom Accept Emote commands.moderation.rules.emote.accept.title = Custom Accept Emote
commands.moderation.rules.emote.accept.description = The role has been successfully set to %extra%. Now send me the emote on which your user should react to to get verified. commands.moderation.rules.emote.accept.description = The role has been successfully set to %extra%. Now send me the emote on which your user should react to to get verified.
commands.moderation.rules.emote.decline.title = Custom Decline Emote commands.moderation.rules.emote.decline.title = Custom Decline Emote
@ -223,6 +223,7 @@ commands.music.leave.help.description = Leaves your voice channel.
commands.music.play.load.title = %extra% Now loading %extra% commands.music.play.load.title = %extra% Now loading %extra%
commands.music.play.load.description = Trying to load the song... commands.music.play.load.description = Trying to load the song...
commands.music.play.success.loading.title = %extra% Now playing %extra% commands.music.play.success.loading.title = %extra% Now playing %extra%
commands.music.play.success.queueing.title = %extra% Added to queue %extra%
commands.music.play.success.title = Title commands.music.play.success.title = Title
commands.music.play.success.author = Author commands.music.play.success.author = Author
commands.music.play.success.length = Length commands.music.play.success.length = Length
@ -276,6 +277,9 @@ commands.music.loop.success.unloop.description = I will no longer repeat the cur
commands.music.loop.error.connected.title = No channel commands.music.loop.error.connected.title = No channel
commands.music.loop.error.connected.description = You have to be in the same voice channel as the bot to set the repeat status. commands.music.loop.error.connected.description = You have to be in the same voice channel as the bot to set the repeat status.
commands.music.loop.help.description = Repeats a song/queue. commands.music.loop.help.description = Repeats a song/queue.
commands.music.echo.success.title = Successfully activated
commands.music.echo.success.description = I will now repeat everything I can hear in your voice channel
commands.music.echo.help.description = Sends your voice through Hadder.
commands.nsfw.gif.error.title = GIF not showing? Click here commands.nsfw.gif.error.title = GIF not showing? Click here
commands.nsfw.img.error.title = Image not showing? Click here commands.nsfw.img.error.title = Image not showing? Click here
@ -303,8 +307,8 @@ commands.owner.eval.help.description = Execute the given code
commands.owner.guildleave.success.title = Successfully left commands.owner.guildleave.success.title = Successfully left
commands.owner.guildleave.success.description = I successfully left %extra%. commands.owner.guildleave.success.description = I successfully left %extra%.
commands.owner.guildleave.error.title = Can not leave commands.owner.guildleave.error.title = Can not leave
commands.owner.guildleave.error.description = I can not leave from this guild. Maybe this isn't a ID? commands.owner.guildleave.error.description = I can not leave from this server. Maybe this isn't a ID?
commands.owner.guildleave.help.description = Quit from a guild commands.owner.guildleave.help.description = Quit from a server
commands.owner.reboot.help.description = Restart the bot commands.owner.reboot.help.description = Restart the bot
commands.owner.shutdown.success.title = Shutdown commands.owner.shutdown.success.title = Shutdown
commands.owner.shutdown.help.description = Shuts the Bot down commands.owner.shutdown.help.description = Shuts the Bot down
@ -319,6 +323,6 @@ commands.owner.blacklist.help.description = Blacklist a user for specific comman
commands.settings.language.success.title = Language set commands.settings.language.success.title = Language set
commands.settings.language.success.description = `%extra%` is your new language now. commands.settings.language.success.description = `%extra%` is your new language now.
commands.settings.language.help.description = Sets the new primary language for a user. commands.settings.language.help.description = Sets the new primary language for a user.
commands.settings.prefix.success.title = %extra% Successfully set %extra% commands.settings.prefix.success.title = Successfully set prefix
commands.settings.prefix.success.description = I successfully set the new prefix for you to `%extra%`. commands.settings.prefix.success.description = I successfully set the new prefix for you to `%extra%`.
commands.settings.prefix.help.description = Sets a new prefix. commands.settings.prefix.help.description = Sets a new prefix.