diff --git a/.gradle/2.13/taskArtifacts/cache.properties.lock b/.gradle/2.13/taskArtifacts/cache.properties.lock index 0a03c04..fd54d85 100644 Binary files a/.gradle/2.13/taskArtifacts/cache.properties.lock and b/.gradle/2.13/taskArtifacts/cache.properties.lock differ diff --git a/.gradle/2.13/taskArtifacts/fileHashes.bin b/.gradle/2.13/taskArtifacts/fileHashes.bin index 406a999..276a456 100644 Binary files a/.gradle/2.13/taskArtifacts/fileHashes.bin and b/.gradle/2.13/taskArtifacts/fileHashes.bin differ diff --git a/.gradle/2.13/taskArtifacts/fileSnapshots.bin b/.gradle/2.13/taskArtifacts/fileSnapshots.bin index 5dfd675..2845386 100644 Binary files a/.gradle/2.13/taskArtifacts/fileSnapshots.bin and b/.gradle/2.13/taskArtifacts/fileSnapshots.bin differ diff --git a/.gradle/2.13/taskArtifacts/taskArtifacts.bin b/.gradle/2.13/taskArtifacts/taskArtifacts.bin index 372eb31..da67c1a 100644 Binary files a/.gradle/2.13/taskArtifacts/taskArtifacts.bin and b/.gradle/2.13/taskArtifacts/taskArtifacts.bin differ diff --git a/.idea/libraries/Gradle__com_mashape_unirest_unirest_java_1_4_9.xml b/.idea/libraries/Gradle__com_mashape_unirest_unirest_java_1_4_9.xml index 6121314..e39de13 100644 --- a/.idea/libraries/Gradle__com_mashape_unirest_unirest_java_1_4_9.xml +++ b/.idea/libraries/Gradle__com_mashape_unirest_unirest_java_1_4_9.xml @@ -2,8 +2,11 @@ + - + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__com_sedmelluq_lavaplayer_1_2_39.xml b/.idea/libraries/Gradle__com_sedmelluq_lavaplayer_1_2_39.xml deleted file mode 100644 index 46b8c65..0000000 --- a/.idea/libraries/Gradle__com_sedmelluq_lavaplayer_1_2_39.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Gradle__commons_codec_commons_codec_1_9.xml b/.idea/libraries/Gradle__commons_codec_commons_codec_1_9.xml index ea493a9..ead3f32 100644 --- a/.idea/libraries/Gradle__commons_codec_commons_codec_1_9.xml +++ b/.idea/libraries/Gradle__commons_codec_commons_codec_1_9.xml @@ -2,8 +2,11 @@ + - + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__commons_logging_commons_logging_1_2.xml b/.idea/libraries/Gradle__commons_logging_commons_logging_1_2.xml index 7a70d30..9d03aca 100644 --- a/.idea/libraries/Gradle__commons_logging_commons_logging_1_2.xml +++ b/.idea/libraries/Gradle__commons_logging_commons_logging_1_2.xml @@ -2,8 +2,11 @@ + - + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__mysql_mysql_connector_java_5_1_38.xml b/.idea/libraries/Gradle__mysql_mysql_connector_java_5_1_38.xml index 1bad8c9..b66e8b8 100644 --- a/.idea/libraries/Gradle__mysql_mysql_connector_java_5_1_38.xml +++ b/.idea/libraries/Gradle__mysql_mysql_connector_java_5_1_38.xml @@ -2,8 +2,11 @@ + - + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_apache_commons_commons_collections4_4_1.xml b/.idea/libraries/Gradle__org_apache_commons_commons_collections4_4_1.xml index b4c6feb..0fdac3b 100644 --- a/.idea/libraries/Gradle__org_apache_commons_commons_collections4_4_1.xml +++ b/.idea/libraries/Gradle__org_apache_commons_commons_collections4_4_1.xml @@ -2,8 +2,11 @@ + - + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_apache_commons_commons_lang3_3_5.xml b/.idea/libraries/Gradle__org_apache_commons_commons_lang3_3_5.xml index 7b1f75e..5ee8c1f 100644 --- a/.idea/libraries/Gradle__org_apache_commons_commons_lang3_3_5.xml +++ b/.idea/libraries/Gradle__org_apache_commons_commons_lang3_3_5.xml @@ -2,8 +2,11 @@ + - + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_apache_httpcomponents_httpasyncclient_4_1_1.xml b/.idea/libraries/Gradle__org_apache_httpcomponents_httpasyncclient_4_1_1.xml index 21d2822..8c7ef75 100644 --- a/.idea/libraries/Gradle__org_apache_httpcomponents_httpasyncclient_4_1_1.xml +++ b/.idea/libraries/Gradle__org_apache_httpcomponents_httpasyncclient_4_1_1.xml @@ -2,8 +2,11 @@ + - + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_apache_httpcomponents_httpclient_4_5_2.xml b/.idea/libraries/Gradle__org_apache_httpcomponents_httpclient_4_5_2.xml index 217c1cf..3152057 100644 --- a/.idea/libraries/Gradle__org_apache_httpcomponents_httpclient_4_5_2.xml +++ b/.idea/libraries/Gradle__org_apache_httpcomponents_httpclient_4_5_2.xml @@ -2,8 +2,11 @@ + - + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_apache_httpcomponents_httpcore_4_4_4.xml b/.idea/libraries/Gradle__org_apache_httpcomponents_httpcore_4_4_4.xml index 8fa2fc3..8fe3436 100644 --- a/.idea/libraries/Gradle__org_apache_httpcomponents_httpcore_4_4_4.xml +++ b/.idea/libraries/Gradle__org_apache_httpcomponents_httpcore_4_4_4.xml @@ -2,8 +2,11 @@ + - + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_apache_httpcomponents_httpcore_nio_4_4_4.xml b/.idea/libraries/Gradle__org_apache_httpcomponents_httpcore_nio_4_4_4.xml index f255260..4edbd94 100644 --- a/.idea/libraries/Gradle__org_apache_httpcomponents_httpcore_nio_4_4_4.xml +++ b/.idea/libraries/Gradle__org_apache_httpcomponents_httpcore_nio_4_4_4.xml @@ -2,8 +2,11 @@ + - + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_apache_httpcomponents_httpmime_4_5_2.xml b/.idea/libraries/Gradle__org_apache_httpcomponents_httpmime_4_5_2.xml index 9b958e8..2c132b6 100644 --- a/.idea/libraries/Gradle__org_apache_httpcomponents_httpmime_4_5_2.xml +++ b/.idea/libraries/Gradle__org_apache_httpcomponents_httpmime_4_5_2.xml @@ -2,8 +2,11 @@ + - + + + \ No newline at end of file diff --git a/.idea/libraries/Gradle__org_json_json_20160810.xml b/.idea/libraries/Gradle__org_json_json_20160810.xml index 26de386..976804c 100644 --- a/.idea/libraries/Gradle__org_json_json_20160810.xml +++ b/.idea/libraries/Gradle__org_json_json_20160810.xml @@ -2,8 +2,11 @@ + - + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 9793229..0548357 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,19 +1,6 @@ - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/.idea/modules/Rixa_main.iml b/.idea/modules/Rixa_main.iml index c32c2c9..fb1c457 100644 --- a/.idea/modules/Rixa_main.iml +++ b/.idea/modules/Rixa_main.iml @@ -1,6 +1,6 @@ - + @@ -9,11 +9,10 @@ - + - - - + + @@ -29,7 +28,6 @@ - @@ -37,5 +35,6 @@ + \ No newline at end of file diff --git a/.idea/modules/Rixa_test.iml b/.idea/modules/Rixa_test.iml index 3ecf3b6..a954436 100644 --- a/.idea/modules/Rixa_test.iml +++ b/.idea/modules/Rixa_test.iml @@ -1,6 +1,6 @@ - + @@ -10,11 +10,10 @@ - + - - - + + @@ -30,7 +29,6 @@ - @@ -38,6 +36,7 @@ + \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 453e2fa..4ce36d1 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,41 +2,12 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + @@ -63,6 +34,9 @@ + + + @@ -81,13 +55,39 @@ + + + musicrole + joinpm + music + greetings + addPerm + setTitle + "http://rixa.io" + pplay + Staff + sendHelp + The configuration + getMessage( + Adding to queue + leave + log_channel + testin + testing + + + setTitle(String.format("Help: %s", title)) + ; + the configuration + + - - - @@ -575,15 +579,8 @@ - - - - - - - + - @@ -600,15 +597,11 @@ + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - @@ -1029,27 +753,19 @@ - - - - - - - + + + + @@ -1070,57 +786,71 @@ + + + + + + + + + + + + + + + + + + - - - - - - @@ -1146,136 +876,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -1322,27 +913,6 @@ - - - - - - - - @@ -1364,9 +934,6 @@ - - - - - - - - - @@ -1434,64 +995,38 @@ - - - - - @@ -1517,12 +1052,14 @@ - + + + - @@ -1535,32 +1072,31 @@ - - - - + + - - - + - - + - + + + + + @@ -1569,7 +1105,7 @@ - + @@ -1580,14 +1116,14 @@ - + + - - - + + @@ -1615,399 +1151,328 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - + - - + - + - - - + + - + - - - - - - + + - + - - - + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/build.gradle b/build.gradle index 5fef19d..6710a9a 100644 --- a/build.gradle +++ b/build.gradle @@ -24,11 +24,11 @@ repositories { } dependencies { - compile 'net.dv8tion:JDA:3.1.1_212' + compile 'net.dv8tion:JDA:3.1.1_215' compile 'mysql:mysql-connector-java:5.1.38' - compile 'com.sedmelluq:lavaplayer:1.2.39' - compile group: 'edu.cmu.sphinx', name: 'sphinx4-core', version:'5prealpha-SNAPSHOT' - compile group: 'edu.cmu.sphinx', name: 'sphinx4-data', version:'5prealpha-SNAPSHOT' + compile 'com.sedmelluq:lavaplayer:1.2.42' + compile 'org.twitter4j:twitter4j-core:4.0.3' + compile 'org.twitter4j:twitter4j-stream:4.0.6' } compileJava.options.encoding = 'UTF-8' diff --git a/src/main/java/me/savvy/rixa/Rixa.java b/src/main/java/me/savvy/rixa/Rixa.java index ab03467..45cc03e 100644 --- a/src/main/java/me/savvy/rixa/Rixa.java +++ b/src/main/java/me/savvy/rixa/Rixa.java @@ -14,8 +14,11 @@ import me.savvy.rixa.data.database.sql.DatabaseManager; import me.savvy.rixa.data.filemanager.ConfigManager; import me.savvy.rixa.data.filemanager.LanguageManager; import me.savvy.rixa.events.BotEvent; +import me.savvy.rixa.events.MemberEvent; import me.savvy.rixa.events.MessageEvent; +import me.savvy.rixa.modules.reactions.handlers.React; import me.savvy.rixa.modules.reactions.handlers.ReactionManager; +import me.savvy.rixa.modules.reactions.react.ConfigReaction; import me.savvy.rixa.modules.reactions.react.HelpReaction; import net.dv8tion.jda.core.AccountType; import net.dv8tion.jda.core.JDA; @@ -60,7 +63,7 @@ public class Rixa { dbManager.createTable(); getInstance().setLanguageManager(new LanguageManager()); try { - int shards = 3; + int shards = 5; for(int i = 0; i < shards; i++) { Logger.getLogger("Rixa").info("Loading shard #" + i); JDABuilder jda = new JDABuilder(AccountType.BOT) @@ -68,6 +71,7 @@ public class Rixa { .setEventManager(new AnnotatedEventManager()) .addEventListener(new MessageEvent()) .addEventListener(new BotEvent()) + .addEventListener(new MemberEvent()) .setGame(Game.of(config.getConfig().getString("botGame"))) .setAutoReconnect(true) .setStatus(OnlineStatus.ONLINE) @@ -84,8 +88,8 @@ public class Rixa { new InfoCommand(), new ServerInfoCommand(), new HelpCommand(), new DeleteMessagesCommand(), new PingCommand(), new PurgeMessagesCommand(), new BatchMoveCommand(), new MuteCommand(), new MusicCommand(), - new ConfigCommand()}); - ReactionManager.registerReaction(new HelpReaction()); + new ConfigCommand(), new UrbanDictionaryCommand(), /*new InviteCommand()*/}); + register(new React[] {new HelpReaction(), new ConfigReaction()}); data = new Data(DataType.SQL); } @@ -115,6 +119,12 @@ public class Rixa { } } + private static void register(React react[]) { + for (React reaction: react) { + ReactionManager.registerReaction(reaction); + } + } + public static Rixa getInstance() { return instance; } @@ -130,4 +140,8 @@ public class Rixa { public ConfigManager getConfig() { return config; } + + public List getShardsList() { + return shardsList; + } } diff --git a/src/main/java/me/savvy/rixa/action/Action.java b/src/main/java/me/savvy/rixa/action/Action.java new file mode 100644 index 0000000..527a6cb --- /dev/null +++ b/src/main/java/me/savvy/rixa/action/Action.java @@ -0,0 +1,17 @@ +package me.savvy.rixa.action; + +import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent; + +/** + * Created by savit on 6/24/2017. + */ +public interface Action { + + String getName(); + + String getDescription(); + + void execute(); + + void execute(GuildMessageReceivedEvent event); +} diff --git a/src/main/java/me/savvy/rixa/action/ActionManager.java b/src/main/java/me/savvy/rixa/action/ActionManager.java new file mode 100644 index 0000000..052f7f3 --- /dev/null +++ b/src/main/java/me/savvy/rixa/action/ActionManager.java @@ -0,0 +1,50 @@ +package me.savvy.rixa.action; + +import net.dv8tion.jda.core.entities.Guild; + +import java.util.HashMap; +import java.util.Map; + +/** + * Created by savit on 6/24/2017. + */ +public class ActionManager { + + private Guild guild; + private Map actionMap; + + public ActionManager(Guild guild) { + this.guild = guild; + actionMap = new HashMap<>(); + } + + public Guild getGuild() { + return guild; + } + + public Map getActionMap() { + return actionMap; + } + + public Action getAction(String actionName) { + return actionMap.get(actionName); + } + + public void addAction(String actionName, Action action) { + if(hasAction(actionName)) { + actionMap.remove(actionName); + } + actionMap.put(actionName, action); + } + + public void removeAction(String actionName) { + if(!(hasAction(actionName))) { + return; + } + actionMap.remove(actionName); + } + + public boolean hasAction(String actionName) { + return actionMap.containsKey(actionName); + } +} diff --git a/src/main/java/me/savvy/rixa/action/actions/MessageResponse.java b/src/main/java/me/savvy/rixa/action/actions/MessageResponse.java new file mode 100644 index 0000000..8cb3852 --- /dev/null +++ b/src/main/java/me/savvy/rixa/action/actions/MessageResponse.java @@ -0,0 +1,28 @@ +package me.savvy.rixa.action.actions; + +import me.savvy.rixa.action.Action; +import me.savvy.rixa.utils.MessageBuilder; +import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent; + +/** + * Created by savit on 6/24/2017. + */ +public class MessageResponse implements Action { + @Override + public String getName() { + return "MessageResponse"; + } + + @Override + public String getDescription() { + return "Upon trigger, responds with messages"; + } + + @Override + public void execute(GuildMessageReceivedEvent event) { + new MessageBuilder("MessageResponse action is still in development.") + .setColor(event.getMember().getColor()).queue(event.getChannel()); + } + + public void execute() {} +} diff --git a/src/main/java/me/savvy/rixa/commands/admin/ConfigCommand.java b/src/main/java/me/savvy/rixa/commands/admin/ConfigCommand.java index 28a8a6b..009b86d 100644 --- a/src/main/java/me/savvy/rixa/commands/admin/ConfigCommand.java +++ b/src/main/java/me/savvy/rixa/commands/admin/ConfigCommand.java @@ -10,6 +10,7 @@ import me.savvy.rixa.utils.MessageBuilder; import net.dv8tion.jda.core.entities.ChannelType; import net.dv8tion.jda.core.entities.Member; import net.dv8tion.jda.core.entities.Role; +import net.dv8tion.jda.core.entities.TextChannel; import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent; import org.apache.commons.lang3.EnumUtils; @@ -22,7 +23,9 @@ import java.util.List; public class ConfigCommand implements CommandExec { private List config; + private static ConfigCommand instance; public ConfigCommand() { + instance = this; config = Arrays.asList( "%pconfig set greetings ; Set channel where greeting messages are announced!", "%pconfig set farewell ; Set channel where farewell messages are announced!", @@ -33,6 +36,7 @@ public class ConfigCommand implements CommandExec { "%pconfig joinMessage ; Set the greetings message for when a user joins the server!", "%pconfig quitMessage ; Set the quit message for when a user leaves the server!", "%pconfig joinPm ; Set the message to be private messaged when a user joins!", + "%pconfig description ; Set your server description!", "%pconfig addPerm ; Give a role permission to access a command!", "%pconfig removePerm ; Remove a role's permission to access a command!", "%pconfig enable ; Enabled a Rixa Module!", @@ -40,7 +44,6 @@ public class ConfigCommand implements CommandExec { } @Override @Command(mainCommand = "config", - aliases = {}, description = "Configure Rixa to your liking!", type = CommandType.ADMIN, channelType = ChannelType.TEXT) @@ -57,36 +60,60 @@ public class ConfigCommand implements CommandExec { try { try { page = Integer.parseInt(messages[1]); - sendHelp(event.getMember(), page, rixaGuild.getGuildSettings().getPrefix()); + sendHelp(event.getMember(), page, rixaGuild.getGuildSettings().getPrefix()).sendUser(event.getAuthor()).addReaction("\u2B05").addReaction("\u27A1"); + event.getMessage().delete().complete(); + new MessageBuilder(event.getMember().getAsMention() + ", the configuration menu has been private messaged to you").setColor(event.getMember().getColor()).queue(event.getChannel()); } catch(NumberFormatException ex) { - sendHelp(event.getMember(), page, rixaGuild.getGuildSettings().getPrefix()); - ex.printStackTrace(); + sendHelp(event.getMember(), page, rixaGuild.getGuildSettings().getPrefix()).sendUser(event.getAuthor()).addReaction("\u2B05").addReaction("\u27A1"); } } catch (IllegalArgumentException ex){ - sendHelp(event.getMember(), page, rixaGuild.getGuildSettings().getPrefix()); - ex.printStackTrace(); + sendHelp(event.getMember(), page, rixaGuild.getGuildSettings().getPrefix()).sendUser(event.getAuthor()).addReaction("\u2B05").addReaction("\u27A1"); + event.getMessage().delete().complete(); + new MessageBuilder(event.getMember().getAsMention() + ", the configuration menu has been private messaged to you").setColor(event.getMember().getColor()).queue(event.getChannel()); } return; }else if (messages.length < 3) { - sendHelp(event.getMember(), 0, rixaGuild.getGuildSettings().getPrefix()); + sendHelp(event.getMember(), 0, rixaGuild.getGuildSettings().getPrefix()).sendUser(event.getAuthor()).addReaction("\u2B05").addReaction("\u27A1"); + event.getMessage().delete().complete(); + new MessageBuilder(event.getMember().getAsMention() + ", the configuration menu has been private messaged to you").setColor(event.getMember().getColor()).queue(event.getChannel()); return; } String message; if (messages[1].equalsIgnoreCase("joinmessage")) { message = getMessage(messages, 2); + if(event.getMessage().getMentionedChannels().size() > 0) { + for (TextChannel messageChannel : event.getMessage().getMentionedChannels()) { + message = message.replace(messageChannel.getAsMention(), "<#" + messageChannel.getId() + ">"); + } + } rixaGuild.getGuildSettings().setJoinMessage(message); new MessageBuilder("Successfully set Join Message to\n" + message.replace("{0}", event.getMember().getUser().getName()) .replace("{1}", event.getGuild().getName())).setColor(event.getMember().getColor()).queue(event.getChannel()); } else if (messages[1].equalsIgnoreCase("quitmessage")) { message = getMessage(messages, 2); + if(event.getMessage().getMentionedChannels().size() > 0) { + for (TextChannel messageChannel : event.getMessage().getMentionedChannels()) { + message = message.replace(messageChannel.getAsMention(), "<#" + messageChannel.getId() + ">"); + } + } rixaGuild.getGuildSettings().setQuitMessage(message); new MessageBuilder("Successfully set Quit Message to\n" + message.replace("{0}", event.getMember().getUser().getName()) .replace("{1}", event.getGuild().getName())).setColor(event.getMember().getColor()).queue(event.getChannel()); } else if (messages[1].equalsIgnoreCase("joinpm")) { message = getMessage(messages, 2); + if(event.getMessage().getMentionedChannels().size() > 0) { + for (TextChannel messageChannel : event.getMessage().getMentionedChannels()) { + message = message.replace(messageChannel.getAsMention(), "<#" + messageChannel.getId() + ">"); + } + } rixaGuild.getGuildSettings().setJoinPrivateMessage(message); new MessageBuilder("Successfully set Private Join Message to\n" + message.replace("{0}", event.getMember().getUser().getName()) .replace("{1}", event.getGuild().getName())).setColor(event.getMember().getColor()).queue(event.getChannel()); + } else if (messages[1].equalsIgnoreCase("description")) { + message = getMessage(messages, 2); + rixaGuild.getGuildSettings().setDescription(message); + new MessageBuilder("Successfully set Server Description to\n" + message.replace("{0}", event.getMember().getUser().getName()) + .replace("{1}", event.getGuild().getName())).setColor(event.getMember().getColor()).queue(event.getChannel()); } else if (messages[1].equalsIgnoreCase("set")) { if (messages[2].equalsIgnoreCase("greetings")) { rixaGuild.getGuildSettings().setJoinMessageChannel(event.getChannel()); @@ -211,24 +238,32 @@ public class ConfigCommand implements CommandExec { new MessageBuilder("Successfully removed the permission " + perm.name() + " from the role " + role.getName() + "!").setColor(event.getMember().getColor()).queue(event.getChannel()); } else { int page = 0; - sendHelp(event.getMember(), page, rixaGuild.getGuildSettings().getPrefix()); + sendHelp(event.getMember(), page, rixaGuild.getGuildSettings().getPrefix()).sendUser(event.getAuthor()).addReaction("\u2B05").addReaction("\u27A1"); + event.getMessage().delete().complete(); + new MessageBuilder(event.getMember().getAsMention() + ", the configuration menu has been private messaged to you").setColor(event.getMember().getColor()).queue(event.getChannel()); } } - private void sendHelp(Member member, int page, String prefix) { + public MessageBuilder sendHelp(Member member, int page, String prefix) { int sizePerPage = 4; int maxPages = config.size() / sizePerPage + (config.size() % sizePerPage > 0 ? 1 : 0); - int from = Math.max(0, (page + 1 )* sizePerPage); + if(page < 0) { + page = 0; + } + if(page > maxPages - 2) { + page = maxPages - 3; + } + int from = Math.max(0, page * sizePerPage); int to = Math.min(config.size(), (page + 2) * sizePerPage); List configList = config.subList(from, to); MessageBuilder builder = new MessageBuilder("\u2699" + " **Config**" + "\n" + "Click the back or forward reactions to switch between pages."); configList.forEach(object -> { - builder.addField(object.split(" ; ")[0].replace("%p", prefix), object.split(" ; ")[1], true); + builder.addField(object.split(" ; ")[0].replace("%p", prefix), object.split(" ; ")[1], false); }); builder.footer("Page: (" + page + " / " + (maxPages - 2) + ")", member.getGuild().getIconUrl()); - builder.setColor(member.getColor()).sendUser(member.getUser()).setTitle("Config").addReaction("\u2B05").addReaction("\u27A1"); + return builder.setColor(member.getColor()).setTitle(String.format("Config: %s", member.getGuild().getId())); } private String getMessage(String[] messages, int argToBegin) { @@ -238,4 +273,8 @@ public class ConfigCommand implements CommandExec { } return builder.toString().trim(); } + + public static ConfigCommand getInstance() { + return instance; + } } diff --git a/src/main/java/me/savvy/rixa/commands/admin/InviteCommand.java b/src/main/java/me/savvy/rixa/commands/admin/InviteCommand.java new file mode 100644 index 0000000..1dc454f --- /dev/null +++ b/src/main/java/me/savvy/rixa/commands/admin/InviteCommand.java @@ -0,0 +1,32 @@ +package me.savvy.rixa.commands.admin; + +import me.savvy.rixa.commands.handlers.Command; +import me.savvy.rixa.commands.handlers.CommandExec; +import me.savvy.rixa.commands.handlers.CommandType; +import net.dv8tion.jda.core.entities.ChannelType; +import net.dv8tion.jda.core.entities.TextChannel; +import net.dv8tion.jda.core.entities.User; +import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent; +import net.dv8tion.jda.core.requests.restaction.InviteAction; + +/** + * Created by savit on 7/7/2017. + */ +public class InviteCommand implements CommandExec { + + @Command( + description = "Receive an invite from a server", + type = CommandType.USER, + channelType = ChannelType.TEXT, + usage = "%pinvite", mainCommand = "invite") + public void execute(GuildMessageReceivedEvent event) { + User owner = event.getGuild().getOwner().getUser(); + if(!event.getAuthor().getId().equalsIgnoreCase(owner.getId())) { + return; + } + TextChannel channel = event.getJDA().getGuildById(event.getMessage().getContent().split(" ")[1]).getTextChannels().get(0); + InviteAction inviteAction = channel.createInvite(); + owner.openPrivateChannel().complete().sendMessage( + "http://discord.gg/" + inviteAction.setMaxUses(1).complete().getCode()).queue(); + } +} diff --git a/src/main/java/me/savvy/rixa/commands/general/HelpCommand.java b/src/main/java/me/savvy/rixa/commands/general/HelpCommand.java index 6bceef1..2e18a7d 100644 --- a/src/main/java/me/savvy/rixa/commands/general/HelpCommand.java +++ b/src/main/java/me/savvy/rixa/commands/general/HelpCommand.java @@ -27,7 +27,7 @@ public class HelpCommand implements CommandExec { " **Help**" + "\n" + "Click the corresponding number for more information about the command menu."; - embedBuilder.setTitle("Help", "http://rixa.io") + embedBuilder.setTitle(String.format("Help: %s", event.getGuild().getId())) .setDescription(stringBuilder) .addField("1 - General Commands", "Reveals usable commands intended for `everyone`", false) .addField("2 - Staff Commands", "Reveals usable commands intended for `staff` use only", false) diff --git a/src/main/java/me/savvy/rixa/commands/general/InfoCommand.java b/src/main/java/me/savvy/rixa/commands/general/InfoCommand.java index ec4de04..9ef529d 100644 --- a/src/main/java/me/savvy/rixa/commands/general/InfoCommand.java +++ b/src/main/java/me/savvy/rixa/commands/general/InfoCommand.java @@ -5,6 +5,7 @@ import me.savvy.rixa.commands.handlers.Command; import me.savvy.rixa.commands.handlers.CommandExec; import me.savvy.rixa.commands.handlers.CommandType; import net.dv8tion.jda.core.EmbedBuilder; +import net.dv8tion.jda.core.JDA; import net.dv8tion.jda.core.entities.ChannelType; import net.dv8tion.jda.core.entities.User; import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent; @@ -18,7 +19,7 @@ import java.util.concurrent.TimeUnit; */ public class InfoCommand implements CommandExec { - @Command(aliases = {""}, + @Command( description = "Receive information about Rixa", type = CommandType.USER, channelType = ChannelType.TEXT, @@ -35,18 +36,24 @@ public class InfoCommand implements CommandExec { long hours = TimeUnit.SECONDS.toHours(seconds) - (day *24); long minute = TimeUnit.SECONDS.toMinutes(seconds) - (TimeUnit.SECONDS.toHours(seconds)* 60); long second = TimeUnit.SECONDS.toSeconds(seconds) - (TimeUnit.SECONDS.toMinutes(seconds) *60); - messageEmbed - .setTitle("Rixa Discord Bot", "http://rixa.io/") - .setDescription("Rixa is a user-friendly, multi-purpose bot that is capable of being customized to your discord server needs. " + - "Rixa is complete with a dashboard, user profile, server statistics system, and many more features such as assigning " + - "roles on user join, music module, levels, and more. Rixa was created to bring ease and simplicity to managing discord" + - " servers, it has since then grown into much more than just a bot used for moderation.") - .addField("Created", event.getJDA().getSelfUser().getCreationTime().format(formatter), true) - .addField("Bot Uptime ", "Uptime: " + day + " days " + hours + " hours " + minute + " minutes " + second + " seconds.", true) - .addField("Total Guilds", event.getJDA().getGuilds().size() + "", true) - .addField("Total Users", event.getJDA().getUsers().size() + "", true) - .addField("Rixa Developer", botOwner.getName() + "#" + botOwner.getDiscriminator(), true) - .setFooter("Requested by " + event.getAuthor().getName() + "#" + event.getAuthor().getDiscriminator(), event.getAuthor().getAvatarUrl()); + int guildCount = 0; + int userCount = 0; + for(JDA jda: Rixa.getInstance().getShardsList()) { + guildCount += jda.getGuilds().size(); + userCount += jda.getUsers().size(); + } + messageEmbed + .setTitle("Rixa Discord Bot", "http://rixa.io/") + .setDescription("Rixa is a user-friendly, multi-purpose bot currently in development which is capable of being customized to your Discord server needs. " + + "Rixa is complete with a dashboard, user profile, server statistics system, and many more features such as assigning roles on user join, music module, " + + "levels, and more. Rixa was created to bring ease and simplicity to managing Discord servers, and has since grown into much more than just a bot used for " + + "moderation.") + .addField("Created", event.getJDA().getSelfUser().getCreationTime().format(formatter), true) + .addField("Bot Uptime ", "Uptime: " + day + " days " + hours + " hours " + minute + " minutes " + second + " seconds.", true) + .addField("Total Guilds", String.valueOf(guildCount), true) + .addField("Total Users", String.valueOf(userCount), true) + .addField("Rixa Developer", botOwner.getName() + "#" + botOwner.getDiscriminator(), true) + .setFooter("Requested by " + event.getAuthor().getName() + "#" + event.getAuthor().getDiscriminator(), event.getAuthor().getAvatarUrl()); event.getChannel().sendMessage(messageEmbed.build()).queue(); } } diff --git a/src/main/java/me/savvy/rixa/commands/general/MusicCommand.java b/src/main/java/me/savvy/rixa/commands/general/MusicCommand.java index 8916eb7..a7f367a 100644 --- a/src/main/java/me/savvy/rixa/commands/general/MusicCommand.java +++ b/src/main/java/me/savvy/rixa/commands/general/MusicCommand.java @@ -59,8 +59,7 @@ public class MusicCommand implements CommandExec { musicManagers = new HashMap<>(); } - @Command(aliases = {}, - description = "Play music in your voice chat.", + @Command(description = "Play music in your voice chat.", type = CommandType.USER, channelType = ChannelType.TEXT, usage = "%pmusic", mainCommand = "music") @@ -73,7 +72,13 @@ public class MusicCommand implements CommandExec { } if(rixaGuild.getMusicModule().isRoleRequired()) { Role role = event.getGuild().getRoleById(rixaGuild.getMusicModule().getMusicRole()); - if(!event.getMember().getRoles().contains(role)) { + boolean hasRole = false; + for (Role roleItem : event.getMember().getRoles()) { + if (roleItem.getId().equalsIgnoreCase(role.getId())) { + hasRole = true; + } + } + if(!hasRole) { new MessageBuilder("You must have the " + role.getName() + " role to use the music module.").setColor(event.getMember().getColor()).queue(event.getChannel()); return; } @@ -232,7 +237,7 @@ public class MusicCommand implements CommandExec { } } } - } else if(message[1].equalsIgnoreCase("play") || message[1].equalsIgnoreCase("pplay")) { + } else if(message[1].equalsIgnoreCase("play") || message[1].equalsIgnoreCase("playlist")) { loadAndPlay(mng, event.getChannel(), message[2], false); } else if(message[1].equalsIgnoreCase("vol") || message[1].equalsIgnoreCase("volume")) { try { @@ -254,7 +259,6 @@ public class MusicCommand implements CommandExec { String msg = "Adding to queue: " + track.getInfo().title; mng.scheduler.queue(track); new MessageBuilder(msg).setColor(Color.decode("#4CC276")).queue(channel); - channel.sendMessage(msg).queue(); } @Override diff --git a/src/main/java/me/savvy/rixa/commands/general/ServerInfoCommand.java b/src/main/java/me/savvy/rixa/commands/general/ServerInfoCommand.java index a702c08..a7bbd50 100644 --- a/src/main/java/me/savvy/rixa/commands/general/ServerInfoCommand.java +++ b/src/main/java/me/savvy/rixa/commands/general/ServerInfoCommand.java @@ -35,6 +35,7 @@ public class ServerInfoCommand implements CommandExec { .addField("Voice Channels", String.valueOf(event.getGuild().getVoiceChannels().size()), true) .addField("Roles", String.valueOf(event.getGuild().getRoles().size()), true) .addField("Owner", owner.getName() + "#" + owner.getDiscriminator(), true) + .addField("Enlisted", String.valueOf(rixaGuild.getGuildSettings().isEnlisted()), true) .setThumbnail(event.getGuild().getIconUrl()) .setFooter("ServerID: " + event.getGuild().getId(), event.getGuild().getIconUrl()); event.getChannel().sendMessage(messageEmbed.build()).queue(); diff --git a/src/main/java/me/savvy/rixa/commands/general/UrbanDictionaryCommand.java b/src/main/java/me/savvy/rixa/commands/general/UrbanDictionaryCommand.java new file mode 100644 index 0000000..cd9d69e --- /dev/null +++ b/src/main/java/me/savvy/rixa/commands/general/UrbanDictionaryCommand.java @@ -0,0 +1,56 @@ +package me.savvy.rixa.commands.general; + +import me.savvy.rixa.commands.handlers.Command; +import me.savvy.rixa.commands.handlers.CommandExec; +import me.savvy.rixa.utils.MessageBuilder; +import me.savvy.rixa.utils.UrbanDictionary; +import net.dv8tion.jda.core.entities.ChannelType; +import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent; + +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; + +/** + * Created by savit on 6/24/2017. + */ +public class UrbanDictionaryCommand implements CommandExec { + + + @Override + @Command(mainCommand = "urbandictionary", + aliases = {"ud"}, + description = "Search urban dictionary for a command!", + channelType = ChannelType.TEXT) + public void execute(GuildMessageReceivedEvent event) { + String[] message = event.getMessage().getContent().split(" "); + String search = getMessage(message, 1); + UrbanDictionary ud = null; + try { + ud = new UrbanDictionary(URLEncoder.encode(search, "UTF-8")); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + if(ud == null) { + new MessageBuilder("Search term not found.").setColor(event.getMember().getColor()).queue(event.getChannel()); + } + try { + if(!ud.search()) { + new MessageBuilder("Search term not found.").setColor(event.getMember().getColor()).queue(event.getChannel()); + return; + } + } catch (IOException e) { + new MessageBuilder("Search term not found.").setColor(event.getMember().getColor()).queue(event.getChannel()); + } + new MessageBuilder(ud.getDefinition()).setTitle(String.format("Definition: %s", ud.getWordToSearch())).setColor(event.getMember().getColor()) + .addThumbnail("https://s-media-cache-ak0.pinimg.com/originals/f2/aa/37/f2aa3712516cfd0cf6f215301d87a7c2.jpg").queue(event.getChannel()); + } + + private String getMessage(String[] messages, int argToBegin) { + StringBuilder builder = new StringBuilder(); + for(int i = argToBegin; i < messages.length; i++) { + builder.append(messages[i]).append(" "); + } + return builder.toString().trim(); + } +} diff --git a/src/main/java/me/savvy/rixa/commands/mod/MuteCommand.java b/src/main/java/me/savvy/rixa/commands/mod/MuteCommand.java index b41a135..903f942 100644 --- a/src/main/java/me/savvy/rixa/commands/mod/MuteCommand.java +++ b/src/main/java/me/savvy/rixa/commands/mod/MuteCommand.java @@ -22,7 +22,6 @@ import java.util.Collections; public class MuteCommand implements CommandExec { @Override @Command(mainCommand = "mute", - aliases = "", description = "Mute a member.", type = CommandType.MOD, channelType = ChannelType.TEXT) diff --git a/src/main/java/me/savvy/rixa/data/database/sql/DatabaseManager.java b/src/main/java/me/savvy/rixa/data/database/sql/DatabaseManager.java index 698ab3f..a61f129 100644 --- a/src/main/java/me/savvy/rixa/data/database/sql/DatabaseManager.java +++ b/src/main/java/me/savvy/rixa/data/database/sql/DatabaseManager.java @@ -117,7 +117,6 @@ public class DatabaseManager { return Result.FALSE; } } catch (SQLException e) { - e.printStackTrace(); return Result.ERROR; } } diff --git a/src/main/java/me/savvy/rixa/events/MemberEvent.java b/src/main/java/me/savvy/rixa/events/MemberEvent.java new file mode 100644 index 0000000..295c028 --- /dev/null +++ b/src/main/java/me/savvy/rixa/events/MemberEvent.java @@ -0,0 +1,60 @@ +package me.savvy.rixa.events; + +import me.savvy.rixa.guild.RixaGuild; +import me.savvy.rixa.guild.RixaManager; +import me.savvy.rixa.utils.MessageBuilder; +import net.dv8tion.jda.core.entities.Guild; +import net.dv8tion.jda.core.entities.Role; +import net.dv8tion.jda.core.events.guild.member.GuildMemberJoinEvent; +import net.dv8tion.jda.core.exceptions.PermissionException; +import net.dv8tion.jda.core.hooks.SubscribeEvent; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +/** + * Created by savit on 6/18/2017. + */ +public class MemberEvent { + + public static Map joinMembers = new HashMap<>(); + + @SubscribeEvent + public void onMember(GuildMemberJoinEvent event) { + RixaGuild rixaGuild = RixaManager.getGuild(event.getGuild()); + if(rixaGuild.getGuildSettings().getJoinMessageChannel() != null) { + try { + new MessageBuilder(rixaGuild.getGuildSettings().getJoinMessage() + .replace("{0}", event.getMember().getAsMention()).replace("{1}", event.getGuild().getName()).replace + ("{2}", String.valueOf(event.getGuild().getMembers().size()))).setColor + (event.getMember().getColor()).queue(rixaGuild.getGuildSettings().getJoinMessageChannel()); + } catch(PermissionException ex) { + new MessageBuilder(String.format("I do not have permission for %s in %s", ex.getPermission().getName(), rixaGuild.getGuild().getName())) + .setColor(event.getMember().getColor()).send(rixaGuild.getGuild().getOwner().getUser()); + return; + } + } + + + if(rixaGuild.getGuildSettings().isJoinVerification()) { + joinMembers.put(event.getMember().getUser().getId(), event.getGuild()); + } else if(!rixaGuild.getGuildSettings().getDefaultRole().equalsIgnoreCase("default_value")) { + try { + Role role = event.getGuild().getRoleById(rixaGuild.getGuildSettings().getDefaultRole()); + event.getGuild().getController().addRolesToMember(event.getMember(), Collections.singleton(role)).complete(); + } catch(PermissionException ex) { + new MessageBuilder(String.format("I do not have permission for %s in %s", ex.getPermission().getName(), rixaGuild.getGuild().getName())) + .setColor(event.getMember().getColor()).send(rixaGuild.getGuild().getOwner().getUser()); + return; + } + } + if(rixaGuild.getGuildSettings().getJoinPrivateMessage().equalsIgnoreCase("default")) { + return; + } + String message = rixaGuild.getGuildSettings().getJoinPrivateMessage().replace("{0}", event.getMember().getAsMention()) + .replace("{1}", event.getGuild().getName()).replace("{2}", String.valueOf + (event.getGuild().getMembers().size())); + new MessageBuilder(message).setColor(event.getMember().getColor()).send(event.getMember().getUser()); + } +} diff --git a/src/main/java/me/savvy/rixa/events/MessageEvent.java b/src/main/java/me/savvy/rixa/events/MessageEvent.java index 2f5e563..dfbfeb1 100644 --- a/src/main/java/me/savvy/rixa/events/MessageEvent.java +++ b/src/main/java/me/savvy/rixa/events/MessageEvent.java @@ -1,19 +1,28 @@ package me.savvy.rixa.events; import com.mysql.jdbc.StringUtils; +import me.savvy.rixa.Rixa; import me.savvy.rixa.commands.handlers.CommandHandler; import me.savvy.rixa.commands.handlers.CommandRegistrar; import me.savvy.rixa.guild.RixaGuild; import me.savvy.rixa.guild.RixaManager; import me.savvy.rixa.modules.reactions.handlers.ReactRegistrar; import me.savvy.rixa.modules.reactions.handlers.ReactionManager; +import me.savvy.rixa.utils.MessageBuilder; +import net.dv8tion.jda.core.Permission; import net.dv8tion.jda.core.entities.Message; import net.dv8tion.jda.core.entities.MessageEmbed; +import net.dv8tion.jda.core.events.guild.member.GuildMemberJoinEvent; +import net.dv8tion.jda.core.events.message.MessageReceivedEvent; import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent; +import net.dv8tion.jda.core.events.message.priv.PrivateMessageReceivedEvent; import net.dv8tion.jda.core.events.message.react.MessageReactionAddEvent; +import net.dv8tion.jda.core.exceptions.PermissionException; import net.dv8tion.jda.core.hooks.SubscribeEvent; +import java.awt.*; import java.lang.reflect.Method; +import java.util.Collections; /** * Created by Timber on 5/7/2017. @@ -35,12 +44,57 @@ public class MessageEvent { CommandRegistrar cmd = CommandHandler.get(splitContent[0]); Method m = cmd.getMethod(); try { + Rixa.getInstance().getLogger().info("Invoking: " + cmd.getCommandAnnotation().mainCommand()); m.invoke(cmd.getExecutor(), event); } catch (Exception e) { e.printStackTrace(); } } + @SubscribeEvent + public void onMemberJoin(PrivateMessageReceivedEvent event) { + RixaGuild rixaGuild; + if (MemberEvent.joinMembers.containsKey(event.getAuthor().getId())) { + rixaGuild = RixaManager.getGuild(MemberEvent.joinMembers.get(event.getAuthor().getId())); + if (event.getMessage().getContent().equalsIgnoreCase("I agree") || + event.getMessage().getContent().equalsIgnoreCase("I accept") + || event.getMessage().getContent().equalsIgnoreCase("Yes")) { + MemberEvent.joinMembers.remove(event.getAuthor().getId()); + if (!rixaGuild.getGuildSettings().getDefaultRole().equalsIgnoreCase("default_value")) { + try { + rixaGuild.getGuild().getController().addRolesToMember(rixaGuild.getGuild() + .getMember(event.getAuthor()), Collections.singleton(rixaGuild.getGuild().getRoleById(rixaGuild.getGuildSettings().getDefaultRole()))).complete(); + new MessageBuilder(String.format("You have been promoted on %s!", rixaGuild.getGuild().getName())) + .setColor(rixaGuild.getGuild().getMember(event.getAuthor()).getColor()).send(event.getAuthor()); + } catch(PermissionException ex) { + new MessageBuilder(String.format("I do not have permission for %s in %s", ex.getPermission().getName(), rixaGuild.getGuild().getName())) + .setColor(Color.RED).send(rixaGuild.getGuild().getOwner().getUser()); + } + } + } else if (event.getMessage().getContent().equalsIgnoreCase("I disagree") || + event.getMessage().getContent().equalsIgnoreCase("I deny") || + event.getMessage().getContent().equalsIgnoreCase("No")) { + try { + new MessageBuilder(String.format("You have been removed from %s because you did not agree to the terms!", rixaGuild.getGuild().getName())) + .setColor(Color.RED).send(event.getAuthor()); + MemberEvent.joinMembers.remove(event.getAuthor().getId()); + rixaGuild.getGuild().getController().kick(rixaGuild.getGuild().getMember(event.getAuthor())).complete(); + } catch (PermissionException ex) { + if(ex.getPermission() == Permission.KICK_MEMBERS) { + new MessageBuilder(String.format("I do not have permission to kick %s from %s", event.getAuthor().getName(), rixaGuild.getGuild().getName())) + .setColor(Color.RED).send(rixaGuild.getGuild().getOwner().getUser()); + } else { + new MessageBuilder(String.format("I do not have permission for %s in %s", ex.getPermission().getName(), rixaGuild.getGuild().getName())) + .setColor(Color.RED).send(rixaGuild.getGuild().getOwner().getUser()); + } + } + } + } else { + if(!event.getAuthor().isBot()) + new MessageBuilder("Private messages are currently disabled!").setColor(Color.RED).send(event.getAuthor()); + } + } + @SubscribeEvent public void onReact(MessageReactionAddEvent event) { Message message = event.getChannel().getMessageById(event.getMessageId()).complete(); diff --git a/src/main/java/me/savvy/rixa/guild/RixaGuild.java b/src/main/java/me/savvy/rixa/guild/RixaGuild.java index 99dde46..6e6a814 100644 --- a/src/main/java/me/savvy/rixa/guild/RixaGuild.java +++ b/src/main/java/me/savvy/rixa/guild/RixaGuild.java @@ -3,8 +3,10 @@ package me.savvy.rixa.guild; import me.savvy.rixa.Rixa; import me.savvy.rixa.commands.handlers.RixaPermission; import me.savvy.rixa.data.database.sql.DatabaseManager; +import me.savvy.rixa.enums.Result; import me.savvy.rixa.guild.management.GuildSettings; import me.savvy.rixa.modules.music.MusicModule; +import me.savvy.rixa.modules.twitter.TwitterModule; import net.dv8tion.jda.core.entities.*; import java.sql.PreparedStatement; @@ -22,6 +24,7 @@ public class RixaGuild { private DatabaseManager db; private GuildSettings guildSettings; private MusicModule musicModule; + private TwitterModule twitterModule; private List mutedMembers = new ArrayList<>(); public RixaGuild(Guild guild) { @@ -32,7 +35,13 @@ public class RixaGuild { } private void load() { - if(check()) return; + if(!(checkExists())) { + Rixa.getInstance().getDbManager() + .insert("INSERT INTO `core` (`guild_id`, `guild_name`, `description`, `keywords`, `icon`) VALUES ('%id%', '%name%', 'Description not set.', 'No Keywords Found.', '%icon%')" + .replace("%id%", guild.getId()) + .replace("%name%", guild.getName().replace("'", "\\'")) + .replace("%icon%", guild.getIconId())); + } setGuildSettings(new GuildSettings(this.guild)); RixaManager.addGuild(this); } @@ -45,11 +54,9 @@ public class RixaGuild { this.guildSettings = guildSettings; } - /** - * TODO: Check if Guild exists in database if not create new instance; - */ - public boolean check() { - return guildSettings == null; + private boolean checkExists() { + Result r = Rixa.getInstance().getDbManager().checkExists("SELECT `guild_name` FROM `core` WHERE `guild_id` = '" + guild.getId() + "';"); + return r == Result.TRUE; } public Guild getGuild() { @@ -100,6 +107,7 @@ public class RixaGuild { ps.setBoolean(1, value); ps.setString(2, guild.getId()); ps.setString(3, role.getId()); + ps.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); } @@ -136,4 +144,12 @@ public class RixaGuild { public void setMusicModule(MusicModule musicModule) { this.musicModule = musicModule; } + + public TwitterModule getTwitterModule() { + return twitterModule; + } + + public void setTwitterModule(TwitterModule twitterModule) { + this.twitterModule = twitterModule; + } } diff --git a/src/main/java/me/savvy/rixa/guild/management/GuildSettings.java b/src/main/java/me/savvy/rixa/guild/management/GuildSettings.java index 2374b90..446e149 100644 --- a/src/main/java/me/savvy/rixa/guild/management/GuildSettings.java +++ b/src/main/java/me/savvy/rixa/guild/management/GuildSettings.java @@ -1,6 +1,7 @@ package me.savvy.rixa.guild.management; import me.savvy.rixa.Rixa; +import me.savvy.rixa.enums.Result; import net.dv8tion.jda.core.entities.Guild; import net.dv8tion.jda.core.entities.TextChannel; @@ -28,19 +29,40 @@ public class GuildSettings { } private void load() throws SQLException { + if(!checkExists()) { + Rixa.getInstance().getDbManager().insert("INSERT INTO `settings` (`guild_id`, `log_enabled`, `log_channel`, `joinMessage`, `quitMessage`, `greetings`, `farewell`," + + " `prefix`, `joinPm`, `joinVerification`, `defaultRole`, `muteRole`)" + + " VALUES ('" + guild.getId() + "', '0', 'default_value', 'default_value', 'default_value', 'default_value', 'default_value', '/'," + + " 'default', '0', 'default_value', 'default_value');"); + return; + } PreparedStatement ps = Rixa.getInstance().getDbManager() .getConnection().prepareStatement("SELECT * FROM `settings` WHERE `guild_id` = ?"); ps.setString(1, guild.getId()); ResultSet set = Rixa.getInstance().getDbManager().getObject(ps); - setPrefix(set.getString("prefix")); - setDefaultRole(set.getString("defaultRole")); - setJoinMessage(set.getString("joinMessage")); - setQuitMessage(set.getString("quitMessage")); - setJoinPrivateMessage(set.getString("joinPM")); - setMuteRole(set.getString("muteRole")); - setJoinVerification(set.getBoolean("joinVerification")); - setDescription((String)Rixa.getInstance().getData().get("guild_id", guild.getId(), "description", "core")); - setEnlisted((boolean) Rixa.getInstance().getData().get("guild_id", guild.getId(), "enlisted", "core")); + this.prefix = (set.getString("prefix")); + this.defaultRole = (set.getString("defaultRole")); + this.joinMessage = (set.getString("joinMessage")); + this.quitMessage = (set.getString("quitMessage")); + this.joinPrivateMessage = (set.getString("joinPM")); + this.muteRole = (set.getString("muteRole")); + this.joinVerification = (set.getBoolean("joinVerification")); + if(!set.getString("greetings").equalsIgnoreCase("default_value")) { + joinMessageChannel = guild.getTextChannelById(set.getString("greetings")); + } + if(!set.getString("farewell").equalsIgnoreCase("default_value")) { + quitMessageChannel = guild.getTextChannelById(set.getString("farewell")); + } + ps = Rixa.getInstance().getDbManager() + .getConnection().prepareStatement("SELECT * FROM `core` WHERE `guild_id` = ?"); + ps.setString(1, guild.getId()); + set = Rixa.getInstance().getDbManager().getObject(ps); + this.description = (set.getString("description")); + this.enlisted = (set.getBoolean("enlisted")); + } + + private boolean checkExists() { + return Rixa.getInstance().getDbManager().checkExists("SELECT `guild_id` FROM `settings` WHERE `guild_id` = '" + guild.getId() + "'") == Result.TRUE; } public void unload() { @@ -57,6 +79,7 @@ public class GuildSettings { public void setJoinMessage(String joinMessage) { this.joinMessage = joinMessage; + Rixa.getInstance().getData().update("settings", "joinMessage", "guild_id", joinMessage, guild.getId()); } public String getQuitMessage() { @@ -65,6 +88,7 @@ public class GuildSettings { public void setQuitMessage(String quitMessage) { this.quitMessage = quitMessage; + Rixa.getInstance().getData().update("settings", "quitMessage", "guild_id", quitMessage, guild.getId()); } public String getJoinPrivateMessage() { @@ -73,6 +97,7 @@ public class GuildSettings { public void setJoinPrivateMessage(String joinPrivateMessage) { this.joinPrivateMessage = joinPrivateMessage; + Rixa.getInstance().getData().update("settings", "joinPM", "guild_id", joinPrivateMessage, guild.getId()); } public TextChannel getJoinMessageChannel() { @@ -81,6 +106,7 @@ public class GuildSettings { public void setJoinMessageChannel(TextChannel joinMessageChannel) { this.joinMessageChannel = joinMessageChannel; + Rixa.getInstance().getData().update("settings", "greetings", "guild_id", joinMessageChannel.getId(), guild.getId()); } public TextChannel getQuitMessageChannel() { @@ -89,6 +115,7 @@ public class GuildSettings { public void setQuitMessageChannel(TextChannel quitMessageChannel) { this.quitMessageChannel = quitMessageChannel; + Rixa.getInstance().getData().update("settings", "farewell", "guild_id", quitMessageChannel.getId(), guild.getId()); } public String getDefaultRole() { @@ -97,6 +124,7 @@ public class GuildSettings { public void setDefaultRole(String defaultRole) { this.defaultRole = defaultRole; + Rixa.getInstance().getData().update("settings", "defaultRole", "guild_id", defaultRole, guild.getId()); } public String getPrefix() { @@ -105,6 +133,7 @@ public class GuildSettings { public void setPrefix(String prefix) { this.prefix = prefix; + Rixa.getInstance().getData().update("settings", "prefix", "guild_id", prefix, guild.getId()); } public String getDescription() { @@ -113,6 +142,7 @@ public class GuildSettings { public void setDescription(String description) { this.description = description; + Rixa.getInstance().getData().update("core", "description", "guild_id", description, guild.getId()); } public boolean isEnlisted() { @@ -121,6 +151,7 @@ public class GuildSettings { public void setEnlisted(boolean enlisted) { this.enlisted = enlisted; + Rixa.getInstance().getData().update("core", "enlisted", "guild_id", enlisted, guild.getId()); } public String getMuteRole() { @@ -129,6 +160,7 @@ public class GuildSettings { public void setMuteRole(String muteRole) { this.muteRole = muteRole; + Rixa.getInstance().getData().update("settings", "muteRole", "guild_id", muteRole, guild.getId()); } public boolean isJoinVerification() { @@ -137,5 +169,6 @@ public class GuildSettings { public void setJoinVerification(boolean joinVerification) { this.joinVerification = joinVerification; + Rixa.getInstance().getData().update("settings", "joinVerification", "guild_id", joinVerification, guild.getId()); } } diff --git a/src/main/java/me/savvy/rixa/modules/music/MusicModule.java b/src/main/java/me/savvy/rixa/modules/music/MusicModule.java index 2d86855..ab6f895 100644 --- a/src/main/java/me/savvy/rixa/modules/music/MusicModule.java +++ b/src/main/java/me/savvy/rixa/modules/music/MusicModule.java @@ -28,11 +28,9 @@ public class MusicModule implements RixaModule { } public void load() { - System.out.println("Testing " + guild.getName()); if(!checkExists()) { db.insert("INSERT INTO `music` (`guild_id`, `music_role`, `enabled`)" + " VALUES ('" + guild.getId() + "', 'default_value', '0');"); - return; } try { PreparedStatement ps = db.getConnection().prepareStatement @@ -67,7 +65,7 @@ public class MusicModule implements RixaModule { } public boolean isRoleRequired() { - return (musicRole.equalsIgnoreCase("default_value") && guild.getRolesByName(musicRole, true).size() > 0); + return (!musicRole.equalsIgnoreCase("default_value")); } public String getMusicRole() { @@ -84,6 +82,8 @@ public class MusicModule implements RixaModule { } public boolean checkExists() { - return Rixa.getInstance().getData().exists("SELECT `enabled` FROM `music` WHERE `guild_id` = '" + guild.getId() + "'") == Result.TRUE; + Result r = Rixa.getInstance().getDbManager().checkExists("SELECT `guild_id` FROM `music` WHERE `guild_id` = '" + + guild.getId() + "';"); + return r == Result.TRUE; } } diff --git a/src/main/java/me/savvy/rixa/modules/reactions/react/ConfigReaction.java b/src/main/java/me/savvy/rixa/modules/reactions/react/ConfigReaction.java index ddcc3ac..a120f7c 100644 --- a/src/main/java/me/savvy/rixa/modules/reactions/react/ConfigReaction.java +++ b/src/main/java/me/savvy/rixa/modules/reactions/react/ConfigReaction.java @@ -1,8 +1,19 @@ package me.savvy.rixa.modules.reactions.react; +import me.savvy.rixa.commands.admin.ConfigCommand; +import me.savvy.rixa.commands.handlers.CommandHandler; +import me.savvy.rixa.commands.handlers.CommandType; +import me.savvy.rixa.guild.RixaGuild; +import me.savvy.rixa.guild.RixaManager; import me.savvy.rixa.modules.reactions.handlers.React; import me.savvy.rixa.modules.reactions.handlers.ReactHandle; +import me.savvy.rixa.utils.MessageBuilder; +import net.dv8tion.jda.core.EmbedBuilder; +import net.dv8tion.jda.core.entities.ChannelType; +import net.dv8tion.jda.core.entities.Guild; +import net.dv8tion.jda.core.entities.Message; import net.dv8tion.jda.core.events.message.react.MessageReactionAddEvent; +import net.dv8tion.jda.core.exceptions.ErrorResponseException; /** * Created by Timber on 6/9/2017. @@ -12,5 +23,35 @@ public class ConfigReaction implements React { @Override @ReactHandle(title = "Config", description = "Configuration Menu for Rixa") public void reactionTrigger(MessageReactionAddEvent event) { + if (event.getChannel().getType() != ChannelType.PRIVATE + || event.getUser().getId().equalsIgnoreCase(event.getJDA().getSelfUser().getId())) { + return; + } + // "Page: (" + page + // + "/ " + (maxPages - 2) + ")" + Message message = event.getChannel().getMessageById(event.getMessageId()).complete(); + String title = message.getEmbeds().get(0).getTitle().split(": ")[1]; + Guild guild = event.getJDA().getGuildById(title); + if(guild == null) { + return; + } + RixaGuild rixaGuild = RixaManager.getGuild(guild); + String prefix = rixaGuild.getGuildSettings().getPrefix(); + MessageBuilder builder = null; + int page = 500; + switch (event.getReaction().getEmote().getName()) { + case "\u2B05":// previous + page = Integer.parseInt(message.getEmbeds().get(0).getFooter().getText().split(" /")[0].replace("Page: (", "")) - 1; + break; + case "\u27A1":// next + page = Integer.parseInt(message.getEmbeds().get(0).getFooter().getText().split(" /")[0].replace("Page: (", "")) + 1; + break; + } + System.out.println(page); + if(page != 500) { + builder = ConfigCommand.getInstance().sendHelp + (rixaGuild.getGuild().getMember(event.getUser()), page, prefix); + message.editMessage(builder.getBuilder().build()).queue(); + } } } \ No newline at end of file diff --git a/src/main/java/me/savvy/rixa/modules/reactions/react/HelpReaction.java b/src/main/java/me/savvy/rixa/modules/reactions/react/HelpReaction.java index 913dab5..57fa86f 100644 --- a/src/main/java/me/savvy/rixa/modules/reactions/react/HelpReaction.java +++ b/src/main/java/me/savvy/rixa/modules/reactions/react/HelpReaction.java @@ -2,6 +2,7 @@ package me.savvy.rixa.modules.reactions.react; import me.savvy.rixa.commands.handlers.CommandHandler; import me.savvy.rixa.commands.handlers.CommandType; +import me.savvy.rixa.guild.RixaGuild; import me.savvy.rixa.guild.RixaManager; import me.savvy.rixa.modules.reactions.handlers.React; import me.savvy.rixa.modules.reactions.handlers.ReactHandle; @@ -24,8 +25,9 @@ public class HelpReaction implements React { return; } Message message = event.getChannel().getMessageById(event.getMessageId()).complete(); - String prefix = (event.getChannel().getType() != ChannelType.PRIVATE) ? - RixaManager.getGuild(event.getGuild()).getGuildSettings().getPrefix() : "/"; + String title = message.getEmbeds().get(0).getTitle().split(": ")[1]; + RixaGuild rixaGuild = RixaManager.getGuild(event.getJDA().getGuildById(title)); + String prefix = rixaGuild.getGuildSettings().getPrefix(); EmbedBuilder embedBuilder; try { switch(event.getReaction().getEmote().getName()) { @@ -40,7 +42,7 @@ public class HelpReaction implements React { " **General Commands Help**" + "\n" + "Click a number below for information about other commands."; - embedBuilder.setTitle("Help", "http://rixa.io"); + embedBuilder.setTitle(String.format("Help: %s", title)); embedBuilder.setDescription(stringBuilder); CommandHandler.getCommands().values().stream().filter(cmd -> cmd.getCommandAnnotation().type() == CommandType.USER) .forEach(cmd -> embedBuilder.addField(prefix + cmd.getCommandAnnotation().mainCommand(), @@ -53,11 +55,11 @@ public class HelpReaction implements React { " **Staff Commands Help**" + "\n" + "Click a number below for information about other commands."; - embedBuilder.setTitle("Help", "http://rixa.io"); + embedBuilder.setTitle(String.format("Help: %s", title)); embedBuilder.setDescription(stringBuilder); CommandHandler.getCommands().values().stream().filter(cmd -> cmd.getCommandAnnotation().type() == CommandType.ADMIN || cmd.getCommandAnnotation().type() == CommandType.MOD) - .forEach(cmd -> embedBuilder.addField(prefix, cmd.getCommandAnnotation().description(), false)); + .forEach(cmd -> embedBuilder.addField(prefix + cmd.getCommandAnnotation().mainCommand(), cmd.getCommandAnnotation().description(), false)); message.editMessage(embedBuilder.build()).queue(); break; case "\u0033\u20E3": // three emoji @@ -66,14 +68,14 @@ public class HelpReaction implements React { " **Music Commands Help**" + "\n" + "Click a number below for information about other commands."; - embedBuilder.setTitle("Help", "http://rixa.io"); + embedBuilder.setTitle(String.format("Help: %s", title)); embedBuilder.setDescription(stringBuilder); embedBuilder.addField(prefix + "music join [name]", "Joins a voice channel that has the provided name", false) .addField(prefix + "music join [id]", "Joins a voice channel based on the provided id.", false) .addField(prefix + "music leave", "Leaves the voice channel that the bot is currently in.", false) .addField(prefix + "music play", "Plays songs from the current queue. Starts playing again if it was previously paused", false) .addField(prefix + "music play [url]", "Adds a new song to the queue and starts playing if it wasn't playing already", false) - .addField(prefix + "music pplay", "Adds a playlist to the queue and starts playing if not already playing", false) + .addField(prefix + "music playlist", "Adds a playlist to the queue and starts playing if not already playing", false) .addField(prefix + "music pause", "Pauses audio playback", false) .addField(prefix + "music stop", "Completely stops audio playback, skipping the current song.", false) .addField(prefix + "music skip", "Skips the current song, automatically starting the next", false) diff --git a/src/main/java/me/savvy/rixa/modules/twitter/TwitterModule.java b/src/main/java/me/savvy/rixa/modules/twitter/TwitterModule.java new file mode 100644 index 0000000..c391760 --- /dev/null +++ b/src/main/java/me/savvy/rixa/modules/twitter/TwitterModule.java @@ -0,0 +1,80 @@ +package me.savvy.rixa.modules.twitter; + +import me.savvy.rixa.guild.RixaGuild; +import twitter4j.*; +import twitter4j.conf.ConfigurationBuilder; + +/** + * Created by savit on 7/9/2017. + */ +public class TwitterModule { + + private final TwitterStream twitterStream; + private ConfigurationBuilder configurationBuilder; + private Twitter twitter; + private TwitterFactory twitterFactory; + private String consumerKey, consumerSecret, accessToken, accessTokenSecret; + + public TwitterModule(RixaGuild rixaGuild, String consumerKey, String consumerSecret, String accessToken, String accessTokenSecret) { + this.consumerKey = consumerKey; + this.consumerSecret = consumerSecret; + this.accessToken = accessToken; + this.accessTokenSecret = accessTokenSecret; + configurationBuilder = new ConfigurationBuilder() + .setOAuthConsumerKey(getConsumerKey()) + .setOAuthConsumerSecret(getConsumerSecret()) + .setOAuthAccessToken(getAccessToken()) + .setOAuthAccessTokenSecret(getAccessTokenSecret()); + twitterFactory = new TwitterFactory(configurationBuilder.build()); + twitterStream = new TwitterStreamFactory().getInstance(); + twitter = twitterFactory.getInstance(); + } + + public ConfigurationBuilder getConfigurationBuilder() { + return configurationBuilder; + } + + public TwitterFactory getTwitterFactory() { + return twitterFactory; + } + + public Twitter getTwitter() { + return twitter; + } + + public String getConsumerKey() { + return consumerKey; + } + + public void setConsumerKey(String consumerKey) { + this.consumerKey = consumerKey; + } + + public String getConsumerSecret() { + return consumerSecret; + } + + public void setConsumerSecret(String consumerSecret) { + this.consumerSecret = consumerSecret; + } + + public String getAccessToken() { + return accessToken; + } + + public void setAccessToken(String accessToken) { + this.accessToken = accessToken; + } + + public String getAccessTokenSecret() { + return accessTokenSecret; + } + + public void setAccessTokenSecret(String accessTokenSecret) { + this.accessTokenSecret = accessTokenSecret; + } + + public TwitterStream getTwitterStream() { + return twitterStream; + } +} diff --git a/src/main/java/me/savvy/rixa/utils/MessageBuilder.java b/src/main/java/me/savvy/rixa/utils/MessageBuilder.java index 3cd8703..0ffbb75 100644 --- a/src/main/java/me/savvy/rixa/utils/MessageBuilder.java +++ b/src/main/java/me/savvy/rixa/utils/MessageBuilder.java @@ -23,7 +23,7 @@ public class MessageBuilder { } public MessageBuilder setTitle(String title) { - setTitle(title, "http://rixa.io/"); + builder.setTitle(title); return this; } @@ -37,6 +37,11 @@ public class MessageBuilder { return this; } + public MessageBuilder addThumbnail(String url) { + builder.setThumbnail(url); + return this; + } + public EmbedBuilder getBuilder() { return builder; } diff --git a/src/main/java/me/savvy/rixa/utils/UrbanDictionary.java b/src/main/java/me/savvy/rixa/utils/UrbanDictionary.java new file mode 100644 index 0000000..e11f88e --- /dev/null +++ b/src/main/java/me/savvy/rixa/utils/UrbanDictionary.java @@ -0,0 +1,57 @@ +package me.savvy.rixa.utils; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.util.Scanner; + +/** + * Created by savit on 6/24/2017. + */ +public class UrbanDictionary { + + private String wordToSearch; + private String definition; + private String permaLink; + public UrbanDictionary(String wordToSearch) { + this.wordToSearch = wordToSearch; + } + + public boolean search() throws IOException { + URL url = new URL("http://api.urbandictionary.com/v0/define?term=" + wordToSearch); + InputStream in = url.openStream(); + Scanner scan = new Scanner(in); + String jsonString = ""; + while(scan.hasNext()){ + jsonString += scan.next() + " "; + } + scan.close(); + try { + JSONObject obj = new JSONObject(jsonString.trim()); + JSONArray array = obj.getJSONArray("list"); + JSONObject newObj = array.getJSONObject(0); + this.wordToSearch = newObj.getString("word"); + this.permaLink = newObj.getString("permalink"); + this.definition = newObj.getString("definition"); + return true; + } catch(JSONException ex) { + return false; + } + } + + public String getPermaLink() { + return permaLink; + } + + public String getWordToSearch() { + return wordToSearch; + } + + public String getDefinition() { + return definition; + } +} diff --git a/src/main/java/me/savvy/rixa/utils/YoutubeSearch.java b/src/main/java/me/savvy/rixa/utils/YoutubeSearch.java new file mode 100644 index 0000000..8af2cf0 --- /dev/null +++ b/src/main/java/me/savvy/rixa/utils/YoutubeSearch.java @@ -0,0 +1,7 @@ +package me.savvy.rixa.utils; + +/** + * Created by savit on 7/11/2017. + */ +public class YoutubeSearch { +}