diff --git a/pom.xml b/pom.xml index 42ab70c..8fc48d9 100644 --- a/pom.xml +++ b/pom.xml @@ -5,9 +5,19 @@ 4.0.0 Hadder Hadder - 1.1.0 - + 1.1.3 Hadder + 2019 + Hadder is a multi-purpose Discord bot. + https://github.com/BigBotNetwork/Hadder + + + + GNU Affero General Public License v3.0 + https://www.gnu.org/licenses/agpl-3.0.en.html + repo + + UTF-8 @@ -56,7 +66,7 @@ net.dv8tion JDA - 4.1.1_108 + 4.1.1_113 org.json @@ -81,7 +91,7 @@ org.kohsuke github-api - 1.106 + 1.108 com.sedmelluq @@ -91,7 +101,7 @@ com.fasterxml.jackson.core jackson-annotations - 2.10.2 + 2.10.3 @@ -132,7 +142,7 @@ maven-site-plugin - 3.8.2 + 3.9.0 maven-project-info-reports-plugin diff --git a/src/main/java/com/bbn/hadder/Hadder.java b/src/main/java/com/bbn/hadder/Hadder.java index 57a7cb0..99f9b3d 100644 --- a/src/main/java/com/bbn/hadder/Hadder.java +++ b/src/main/java/com/bbn/hadder/Hadder.java @@ -126,7 +126,9 @@ public class Hadder { new EchoCommand(), new ServerStatsCommand(), new ProfileCommand(), - new CodeCommand()), config, helpCommand); + new CodeCommand(), + new MoveAllCommand(), + new CoronaCommand()), config, helpCommand); builder.addEventListeners( new MentionListener(rethink), diff --git a/src/main/java/com/bbn/hadder/audio/AudioManager.java b/src/main/java/com/bbn/hadder/audio/AudioManager.java index 363581c..512f460 100644 --- a/src/main/java/com/bbn/hadder/audio/AudioManager.java +++ b/src/main/java/com/bbn/hadder/audio/AudioManager.java @@ -162,5 +162,4 @@ public class AudioManager { s = s - (minutes * 60); return (hours == 0 ? "" : hours + ":") + String.format("%02d", minutes) + ":" + String.format("%02d", s); } - } diff --git a/src/main/java/com/bbn/hadder/commands/fun/ClydeCommand.java b/src/main/java/com/bbn/hadder/commands/fun/ClydeCommand.java index 29e01e4..50f2bcf 100644 --- a/src/main/java/com/bbn/hadder/commands/fun/ClydeCommand.java +++ b/src/main/java/com/bbn/hadder/commands/fun/ClydeCommand.java @@ -66,9 +66,7 @@ public class ClydeCommand implements Command { } webhook.delete().queue(); e.getMessage().delete().queue(); - } else { - e.getTextChannel().sendMessage(e.getMessageEditor().getMessage(MessageEditor.MessageType.NO_SELF_PERMISSION).build()).queue(); - } + } else e.getTextChannel().sendMessage(e.getMessageEditor().getMessage(MessageEditor.MessageType.NO_SELF_PERMISSION).build()).queue(); } else e.getHelpCommand().sendHelp(this, e); } diff --git a/src/main/java/com/bbn/hadder/commands/general/InviteCommand.java b/src/main/java/com/bbn/hadder/commands/general/InviteCommand.java index 6127fce..68e3f68 100644 --- a/src/main/java/com/bbn/hadder/commands/general/InviteCommand.java +++ b/src/main/java/com/bbn/hadder/commands/general/InviteCommand.java @@ -16,7 +16,6 @@ package com.bbn.hadder.commands.general; -import com.bbn.hadder.Hadder; import com.bbn.hadder.commands.Command; import com.bbn.hadder.commands.CommandEvent; import com.bbn.hadder.utils.MessageEditor; @@ -32,8 +31,8 @@ public class InviteCommand implements Command { "", "commands.general.invite.success.description", "(https://discordapp.com/oauth2/authorize?client_id=" - + Hadder.shardManager.getGuilds().get(0).getSelfMember().getId() - + "&scope=bot&permissions=470133879)") + + e.getJDA().getSelfUser().getId() + + "&scope=bot&permissions=1043852663)") .build()).queue(); } diff --git a/src/main/java/com/bbn/hadder/commands/misc/CoronaCommand.java b/src/main/java/com/bbn/hadder/commands/misc/CoronaCommand.java new file mode 100644 index 0000000..3f24ea5 --- /dev/null +++ b/src/main/java/com/bbn/hadder/commands/misc/CoronaCommand.java @@ -0,0 +1,69 @@ +/* + * 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.misc; + +import com.bbn.hadder.commands.Command; +import com.bbn.hadder.commands.CommandEvent; +import com.bbn.hadder.utils.MessageEditor; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import org.json.JSONObject; + +import java.io.IOException; + +public class CoronaCommand implements Command { + + @Override + public void executed(String[] args, CommandEvent e) { + OkHttpClient client = new OkHttpClient(); + Request request = new Request.Builder().url("https://api.covid.stream/latest/numbers").build(); + + try { + Response response = client.newCall(request).execute(); + JSONObject json = new JSONObject(response.body().string()).getJSONObject("data"); + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append("`Confirmed cases:` **").append(json.get("totalConfirmedNumbers")).append("**\n").append("`Deaths:` **").append(json.get("totalDeathNumbers")).append("** \n").append("`Recovered:` **").append(json.get("totalRecoveredNumbers")).append("** \n"); + e.getTextChannel().sendMessage(e.getMessageEditor().getMessage(MessageEditor.MessageType.INFO).setDescription(stringBuilder).build()).queue(); + } catch (IOException ex) { + e.getTextChannel().sendMessage(e.getMessageEditor().getMessage(MessageEditor.MessageType.ERROR) + .setTitle("API Error") + .setDescription("Try again later!") + .build()).queue(); + } + } + + @Override + public String[] labels() { + return new String[]{"corona"}; + } + + @Override + public String description() { + return "commands.misc.corona.help.description"; + } + + @Override + public String usage() { + return null; + } + + @Override + public String example() { + return null; + } +} diff --git a/src/main/java/com/bbn/hadder/commands/misc/GitHubCommand.java b/src/main/java/com/bbn/hadder/commands/misc/GitHubCommand.java index 606c9bb..fa9ad54 100644 --- a/src/main/java/com/bbn/hadder/commands/misc/GitHubCommand.java +++ b/src/main/java/com/bbn/hadder/commands/misc/GitHubCommand.java @@ -54,12 +54,10 @@ public class GitHubCommand implements Command { String website = "None"; try { bio = json.getString("bio"); - } catch (JSONException ignored) { - } + } catch (JSONException ignored) {} try { location = json.getString("location"); - } catch (JSONException ignored) { - } + } catch (JSONException ignored) {} if (!json.getString("blog").equals("")) website = json.getString("blog"); diff --git a/src/main/java/com/bbn/hadder/commands/misc/MoveAllCommand.java b/src/main/java/com/bbn/hadder/commands/misc/MoveAllCommand.java new file mode 100644 index 0000000..519e681 --- /dev/null +++ b/src/main/java/com/bbn/hadder/commands/misc/MoveAllCommand.java @@ -0,0 +1,60 @@ +/* + * 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.misc; +import com.bbn.hadder.commands.Command; +import com.bbn.hadder.commands.CommandEvent; +import com.bbn.hadder.core.Perm; +import com.bbn.hadder.core.Perms; +import com.bbn.hadder.utils.MessageEditor; + +@Perms(Perm.VOICE_MOVE_OTHERS) +public class MoveAllCommand implements Command { + + @Override + public void executed(String[] args, CommandEvent e) { + if (args.length == 2) { + int count = e.getGuild().getVoiceChannelById(args[0]).getMembers().size(); + e.getGuild().getVoiceChannelById(args[0]).getMembers().forEach( + member -> e.getGuild().moveVoiceMember(member, e.getGuild().getVoiceChannelById(args[1])).queue() + ); + e.getChannel().sendMessage(e.getMessageEditor().getMessage(MessageEditor.MessageType.INFO, + "commands.misc.moveall.success.title", "", + "commands.misc.moveall.success.description", String.valueOf(count)) + .build()).queue(); + } else e.getHelpCommand().sendHelp(this, e); + } + + @Override + public String[] labels() { + return new String[]{"moveall", "move-all", "ma"}; + } + + @Override + public String description() { + return "commands.misc.moveall.help.description"; + } + + @Override + public String usage() { + return "[source-channel] [target-channel]"; + } + + @Override + public String example() { + return "452806287307046923 452858405212782623"; + } +} diff --git a/src/main/java/com/bbn/hadder/commands/moderation/RulesCommand.java b/src/main/java/com/bbn/hadder/commands/moderation/RulesCommand.java index 48d54d2..756c327 100644 --- a/src/main/java/com/bbn/hadder/commands/moderation/RulesCommand.java +++ b/src/main/java/com/bbn/hadder/commands/moderation/RulesCommand.java @@ -56,7 +56,7 @@ public class RulesCommand implements Command { try { TextChannel channel = e1.getGuild().getTextChannelsByName(e1.getMessage().getContentRaw(), true).get(0); createRules(e, e1, channel); - } catch (NullPointerException ex) { + } catch (NullPointerException | IndexOutOfBoundsException ex) { e.getTextChannel().sendMessage( e.getMessageEditor().getMessage( MessageEditor.MessageType.ERROR, diff --git a/src/main/java/com/bbn/hadder/core/Config.java b/src/main/java/com/bbn/hadder/core/Config.java index b8fc4cf..2af7ff2 100644 --- a/src/main/java/com/bbn/hadder/core/Config.java +++ b/src/main/java/com/bbn/hadder/core/Config.java @@ -70,17 +70,22 @@ public class Config { .key("Tokens").object() .key("BotToken").value(null) .key("Giphy").value(null) + .key("GitHub").value(null) .key("MythicalBotList").value(null) .key("BotsForDiscord").value(null) .key("DiscordBotList").value(null) - .key("DiscordBestBots").value(null) .key("DiscordBoats").value(null) .key("YetAnotherBotList").value(null) - .value("DiscordExtremeList").value(null) - .value("DiscordBotReviews").value(null) - .value("DiscordBots").value(null) - .value("BotListSpace").value(null) - .endObject().endObject().toString(); + .key("DiscordExtremeList").value(null) + .key("DiscordBotReviews").value(null) + .key("DiscordBots").value(null) + .key("BotListSpace").value(null) + .key("DiscordBots2").value(null) + .key("CloudList").value(null) + .key("Arcane").value(null) + .endObject() + .key("Clyde").value("Clyde") + .endObject().toString(); } public String getBotToken() { @@ -143,10 +148,6 @@ public class Config { return config.getJSONObject("Tokens").getString("DiscordExtremeList"); } - public String getDiscordBotReviewsToken() { - return config.getJSONObject("Tokens").getString("DiscordBotReviews"); - } - public String getDiscordBotsToken() { return config.getJSONObject("Tokens").getString("DiscordBots"); } @@ -163,6 +164,10 @@ public class Config { return config.getJSONObject("Tokens").getString("CloudList"); } + public String getArcaneToken() { + return config.getJSONObject("Tokens").getString("Arcane"); + } + public String getClydeName() { return config.getString("Clyde"); } diff --git a/src/main/java/com/bbn/hadder/core/Perm.java b/src/main/java/com/bbn/hadder/core/Perm.java index 0eea910..2c5b4bb 100644 --- a/src/main/java/com/bbn/hadder/core/Perm.java +++ b/src/main/java/com/bbn/hadder/core/Perm.java @@ -26,54 +26,60 @@ public enum Perm { public boolean check(CommandEvent e) { return e.getConfig().getOwners().contains(e.getAuthor().getIdLong()); } - }, + }, MANAGE_MESSAGES { @Override public boolean check(CommandEvent e) { return e.getMember().hasPermission(Permission.MESSAGE_MANAGE) || e.getConfig().getOwners().contains(e.getAuthor().getIdLong()); } - }, + }, BAN_MEMBERS { @Override public boolean check(CommandEvent e) { return e.getMember().hasPermission(Permission.BAN_MEMBERS) || e.getConfig().getOwners().contains(e.getAuthor().getIdLong()); } - }, + }, KICK_MEMBERS { @Override public boolean check(CommandEvent e) { return e.getMember().hasPermission(Permission.KICK_MEMBERS) || e.getConfig().getOwners().contains(e.getAuthor().getIdLong()); } - }, + }, MANAGE_SERVER { @Override public boolean check(CommandEvent e) { return e.getMember().hasPermission(Permission.MANAGE_SERVER) || e.getConfig().getOwners().contains(e.getAuthor().getIdLong()); } - }, + }, MANAGE_ROLES { @Override public boolean check(CommandEvent e) { return e.getMember().hasPermission(Permission.MANAGE_ROLES) || e.getConfig().getOwners().contains(e.getAuthor().getIdLong()); } - }, + }, MANAGE_NICKNAMES { @Override public boolean check(CommandEvent e) { return e.getMember().hasPermission(Permission.NICKNAME_MANAGE) || e.getConfig().getOwners().contains(e.getAuthor().getIdLong()); } - }, + }, ADMINISTRATOR { @Override public boolean check(CommandEvent e) { return e.getMember().hasPermission(Permission.ADMINISTRATOR) || e.getConfig().getOwners().contains(e.getAuthor().getIdLong()); } - }, + }, MANAGE_WEBHOOKS { @Override public boolean check(CommandEvent e) { return e.getMember().hasPermission(Permission.MANAGE_WEBHOOKS) || e.getConfig().getOwners().contains(e.getAuthor().getIdLong()); } + }, + VOICE_MOVE_OTHERS { + @Override + public boolean check(CommandEvent e) { + return e.getMember().hasPermission(Permission.VOICE_MOVE_OTHERS) || e.getConfig().getOwners().contains(e.getAuthor().getIdLong()); + } }; public abstract boolean check(CommandEvent e); diff --git a/src/main/java/com/bbn/hadder/listener/CommandListener.java b/src/main/java/com/bbn/hadder/listener/CommandListener.java index aeb8615..286d320 100644 --- a/src/main/java/com/bbn/hadder/listener/CommandListener.java +++ b/src/main/java/com/bbn/hadder/listener/CommandListener.java @@ -25,6 +25,7 @@ import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.Permission; import net.dv8tion.jda.api.entities.ChannelType; import net.dv8tion.jda.api.events.message.MessageReceivedEvent; +import net.dv8tion.jda.api.exceptions.ErrorResponseException; import net.dv8tion.jda.api.hooks.ListenerAdapter; import java.awt.*; @@ -64,13 +65,17 @@ public class CommandListener extends ListenerAdapter { } } } else { - e.getAuthor().openPrivateChannel().complete().sendMessage(new EmbedBuilder() - .setTitle("No permission") - .setDescription("I need the `MESSAGE EMBED LINKS` permission in order to work!") - .setColor(Color.RED) - .setFooter("Hadder", "https://bigbotnetwork.com/images/Hadder.png") - .setTimestamp(Instant.now()) - .build()).queue(); + try { + e.getAuthor().openPrivateChannel().complete().sendMessage(new EmbedBuilder() + .setTitle("No permission") + .setDescription("I need the `MESSAGE EMBED LINKS` permission in order to work!") + .setColor(Color.RED) + .setFooter("Hadder", "https://bigbotnetwork.com/images/Hadder.png") + .setTimestamp(Instant.now()) + .build()).queue(); + } catch (ErrorResponseException ex) { + e.getTextChannel().sendMessage("I need the `MESSAGE EMBED LINKS` permission in order to work!").queue(); + } } } else { e.getAuthor().openPrivateChannel().complete().sendMessage(new EmbedBuilder() diff --git a/src/main/java/com/bbn/hadder/listener/MentionListener.java b/src/main/java/com/bbn/hadder/listener/MentionListener.java index 276a02f..7fb9e11 100644 --- a/src/main/java/com/bbn/hadder/listener/MentionListener.java +++ b/src/main/java/com/bbn/hadder/listener/MentionListener.java @@ -50,7 +50,7 @@ public class MentionListener extends ListenerAdapter { MavenXpp3Reader reader = new MavenXpp3Reader(); Model model = null; try { - model = reader.read(this.getClass().getClassLoader().getResourceAsStream("pom.xml")); + model = reader.read(getClass().getResourceAsStream("pom.xml")); } catch (IOException | XmlPullParserException ex) { ex.printStackTrace(); } diff --git a/src/main/java/com/bbn/hadder/utils/BotList.java b/src/main/java/com/bbn/hadder/utils/BotList.java index cf5890b..3abfe8d 100644 --- a/src/main/java/com/bbn/hadder/utils/BotList.java +++ b/src/main/java/com/bbn/hadder/utils/BotList.java @@ -40,6 +40,7 @@ public class BotList { private static String BotListSpace = "https://api.botlist.space/v1/bots/637002314162372639"; private static String DiscordBots2 = "https://discord.bots.gg/api/v1/bots/637002314162372639/stats"; private static String CloudList = "https://www.cloudlist.xyz/api/stats/637002314162372639"; + private static String ArcaneBotCenter = "https://arcane-botcenter.xyz/api/637002314162372639/stats"; private Config config; @@ -57,6 +58,7 @@ public class BotList { json.put("users", Hadder.shardManager.getUsers().size()); json.put("shard_count", Hadder.shardManager.getShards().size()); json.put("shardCount", Hadder.shardManager.getShards().size()); + json.put("member_count", Hadder.shardManager.getUsers().size()); RequestBody body = RequestBody.create(MediaType.parse("application/json"), json.toString()); @@ -209,6 +211,21 @@ public class BotList { } catch (IOException e) { e.printStackTrace(); } + + // Arcane Bot Center + + Request arcane = new Request.Builder() + .url(ArcaneBotCenter) + .post(body) + .addHeader("Authorization", config.getArcaneToken()) + .build(); + + try { + new OkHttpClient().newCall(arcane).execute().close(); + System.out.println("Successfully posted count to the Arcane Bot Center!"); + } catch (IOException e) { + e.printStackTrace(); + } } } }