From e3f47bbfe59b4cceeaa68b5daca0aeae897a2f94 Mon Sep 17 00:00:00 2001 From: anthorob Date: Sun, 13 Mar 2022 15:06:22 -0400 Subject: [PATCH] Switch to JPA for database --- .gitignore | 1 + .jpb/jpb-settings.xml | 6 + Dockerfile | 2 +- bot.config.example => bot.properties.example | 5 +- pom.xml | 36 ++- sql/add_volume_field_to_settings_table.sql | 3 +- src/main/java/netneutrality/GuildManager.java | 162 ---------- .../{MusicBot.java => NetNeutrality.java} | 35 ++- .../command/AbstractMusicCommand.java | 4 +- .../java/netneutrality/command/ICommand.java | 1 + .../command/basic/HelpCommand.java | 8 +- .../command/basic/PingCommand.java | 2 +- .../command/bot/ConfigureCommand.java | 20 +- .../command/crypto/BitcoinPriceCommand.java | 16 +- .../command/crypto/CryptoPriceCommand.java | 16 +- .../command/crypto/EthereumPriceCommand.java | 16 +- .../command/crypto/LitecoinPriceCommand.java | 15 +- .../command/message/BlacklistCommand.java | 74 ++--- .../command/message/PruneCommand.java | 2 +- .../command/music/BitconnectCommand.java | 2 +- .../music/CurrentlyPlayingCommand.java | 5 +- .../command/music/DeleteQueueCommand.java | 19 +- .../command/music/JoinCommand.java | 11 +- .../command/music/LeaveCommand.java | 5 +- .../command/music/PlayCommand.java | 2 +- .../command/music/SkipCommand.java | 5 +- .../command/music/StopCommand.java | 5 +- .../command/music/ViewQueueCommand.java | 5 +- .../command/music/VolumeCommand.java | 14 +- .../command/music/VoteSkipCommand.java | 9 +- .../command/specific/DatabaseCommand.java | 22 +- .../command/specific/LoggingCommand.java | 2 +- .../java/netneutrality/core/GuildManager.java | 279 +++++++++++++++++ .../{handler => core}/LogHandler.java | 19 +- .../netneutrality/core/SessionManager.java | 66 ++++ .../{utils => core}/UnsafeShutdown.java | 11 +- .../context}/CommandContext.java | 30 +- .../netneutrality/db/AbstractController.java | 22 +- .../netneutrality/db/AsyncMySqlAction.java | 66 ---- .../java/netneutrality/db/DBController.java | 54 +--- .../java/netneutrality/db/MysqlConnector.java | 58 ---- .../java/netneutrality/db/MysqlDatabase.java | 293 ------------------ .../db/controllers/DBBlacklist.java | 135 +++++--- .../netneutrality/db/controllers/DBGuild.java | 31 -- .../db/controllers/DBLogging.java | 33 -- .../db/controllers/DBMessage.java | 104 ++++--- .../db/entities/AbstractEntity.java | 54 ---- .../db/entities/EntityInterface.java | 21 -- .../netneutrality/db/entities/OBlacklist.java | 75 +++++ .../netneutrality/db/entities/OGuild.java | 142 ++++++--- .../db/entities/OGuildSetting.java | 86 +++-- .../db/entities/OLogMessage.java | 111 +++++++ .../netneutrality/db/entities/OLogging.java | 49 +++ .../netneutrality/db/entities/OLoggingId.java | 56 ++++ .../db/entities/OPermission.java | 66 ---- .../OSellyOrder.java} | 6 +- .../netneutrality/db/models/MBlacklist.java | 59 ---- .../netneutrality/db/models/MMessage.java | 66 ---- .../netneutrality/db/models/MRowModel.java | 80 ----- .../netneutrality/db/models/MRowsModel.java | 47 --- .../db/models/MSellyProduct.java | 19 -- .../netneutrality/db/models/MTableModel.java | 118 ------- .../exceptions/CommandErrorException.java | 2 +- .../exceptions/CommandException.java | 2 +- .../exceptions/CommandExecutionException.java | 2 +- .../exceptions/ExecutorException.java | 2 +- .../UnimplementedParameterException.java | 38 --- .../hooks/guilds/ServerJoinHandler.java | 8 +- .../handler/hooks/message/EditHandler.java | 61 ++-- .../hooks/message/MessageReceivedHandler.java | 10 +- .../{ => hooks/message}/ReactionHandler.java | 3 +- src/main/java/netneutrality/http/Selly.java | 12 +- .../java/netneutrality/http/WebModule.java | 52 ++-- .../http/server/ActionHandler.java | 21 +- .../http/server/GuildHandler.java | 8 +- .../netneutrality/music/MusicManager.java | 23 +- .../netneutrality/music/TrackScheduler.java | 5 +- .../MusicPlayerAutoDisconnectThread.java | 4 +- .../netneutrality/thread/ShutdownThread.java | 7 +- .../{ => thread}/ThreadManager.java | 18 +- .../netneutrality/utils/ChannelFunction.java | 90 ++++-- .../java/netneutrality/utils/JpaUtils.java | 42 +++ .../netneutrality/utils/MessageFunction.java | 74 +++-- .../java/netneutrality/utils/MusicUtils.java | 30 +- .../java/netneutrality/utils/Settings.java | 6 +- src/main/resources/META-INF/MANIFEST.MF | 2 +- src/main/resources/hibernate.cfg.xml | 19 ++ src/main/resources/log4j2.properties | 34 ++ src/main/resources/log4j2.xml | 16 - src/main/resources/spy.properties | 4 + 90 files changed, 1527 insertions(+), 1854 deletions(-) create mode 100644 .jpb/jpb-settings.xml rename bot.config.example => bot.properties.example (74%) delete mode 100644 src/main/java/netneutrality/GuildManager.java rename src/main/java/netneutrality/{MusicBot.java => NetNeutrality.java} (64%) create mode 100644 src/main/java/netneutrality/core/GuildManager.java rename src/main/java/netneutrality/{handler => core}/LogHandler.java (89%) create mode 100644 src/main/java/netneutrality/core/SessionManager.java rename src/main/java/netneutrality/{utils => core}/UnsafeShutdown.java (91%) rename src/main/java/netneutrality/{command => core/context}/CommandContext.java (81%) delete mode 100644 src/main/java/netneutrality/db/AsyncMySqlAction.java delete mode 100644 src/main/java/netneutrality/db/MysqlConnector.java delete mode 100644 src/main/java/netneutrality/db/MysqlDatabase.java delete mode 100644 src/main/java/netneutrality/db/controllers/DBGuild.java delete mode 100644 src/main/java/netneutrality/db/controllers/DBLogging.java delete mode 100644 src/main/java/netneutrality/db/entities/AbstractEntity.java delete mode 100644 src/main/java/netneutrality/db/entities/EntityInterface.java create mode 100644 src/main/java/netneutrality/db/entities/OBlacklist.java create mode 100644 src/main/java/netneutrality/db/entities/OLogMessage.java create mode 100644 src/main/java/netneutrality/db/entities/OLogging.java create mode 100644 src/main/java/netneutrality/db/entities/OLoggingId.java delete mode 100644 src/main/java/netneutrality/db/entities/OPermission.java rename src/main/java/netneutrality/db/{models/MSellyOrder.java => entities/OSellyOrder.java} (95%) delete mode 100644 src/main/java/netneutrality/db/models/MBlacklist.java delete mode 100644 src/main/java/netneutrality/db/models/MMessage.java delete mode 100644 src/main/java/netneutrality/db/models/MRowModel.java delete mode 100644 src/main/java/netneutrality/db/models/MRowsModel.java delete mode 100644 src/main/java/netneutrality/db/models/MSellyProduct.java delete mode 100644 src/main/java/netneutrality/db/models/MTableModel.java delete mode 100644 src/main/java/netneutrality/exceptions/UnimplementedParameterException.java rename src/main/java/netneutrality/handler/{ => hooks/message}/ReactionHandler.java (95%) rename src/main/java/netneutrality/{ => thread}/ThreadManager.java (86%) create mode 100644 src/main/java/netneutrality/utils/JpaUtils.java create mode 100644 src/main/resources/hibernate.cfg.xml create mode 100644 src/main/resources/log4j2.properties delete mode 100644 src/main/resources/log4j2.xml create mode 100644 src/main/resources/spy.properties diff --git a/.gitignore b/.gitignore index 6d10652..fcc2aa9 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,7 @@ # Config file bot.config +bot.properties # Mobile Tools for Java (J2ME) .mtj.tmp/ diff --git a/.jpb/jpb-settings.xml b/.jpb/jpb-settings.xml new file mode 100644 index 0000000..935cf0d --- /dev/null +++ b/.jpb/jpb-settings.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 217542e..c2823fe 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,7 +5,7 @@ WORKDIR /app COPY .mvn/ .mvn COPY mvnw pom.xml ./ COPY src ./src -COPY bot.config.example bot.config ./ +COPY bot.properties.example bot.properties ./ RUN ./mvnw -q -Dmaven.test.skip=true package diff --git a/bot.config.example b/bot.properties.example similarity index 74% rename from bot.config.example rename to bot.properties.example index f6fe2c0..99dab96 100644 --- a/bot.config.example +++ b/bot.properties.example @@ -1,3 +1,4 @@ +BOT_ENV=dev BOT_TOKEN= BOT_PREFIX= BOT_OWNER= @@ -8,4 +9,6 @@ MYSQL_HOST= MYSQL_USER= MYSQL_PASSWORD= MYSQL_DATABASE= -MYSQL_PORT=3306 \ No newline at end of file +MYSQL_PORT=3306 + +SENTRY_DSN= \ No newline at end of file diff --git a/pom.xml b/pom.xml index 2de6182..f3f8ee7 100644 --- a/pom.xml +++ b/pom.xml @@ -41,7 +41,7 @@ true lib/ - netneutrality.MusicBot + netneutrality.NetNeutrality @@ -53,7 +53,7 @@ - netneutrality.MusicBot + netneutrality.NetNeutrality true true @@ -121,6 +121,27 @@ 4.9.3 + + org.hibernate + hibernate-core + 5.6.5.Final + + + org.hibernate + hibernate-hikaricp + 5.6.5.Final + + + io.sentry + sentry + 5.6.3 + + + p6spy + p6spy + 3.9.1 + + org.json @@ -137,22 +158,17 @@ mysql mysql-connector-java - 8.0.27 - - - org.apache.logging.log4j - log4j-api - 2.17.0 + 8.0.28 org.apache.logging.log4j log4j-core - 2.17.0 + 2.17.1 org.apache.logging.log4j log4j-slf4j-impl - 2.17.0 + 2.17.1 diff --git a/sql/add_volume_field_to_settings_table.sql b/sql/add_volume_field_to_settings_table.sql index a5b018b..d427e2b 100644 --- a/sql/add_volume_field_to_settings_table.sql +++ b/sql/add_volume_field_to_settings_table.sql @@ -1,2 +1 @@ -ALTER TABLE `guild_settings` ADD `music_volume` INT NOT NULL DEFAULT '30' AFTER `music_channel`; - +ALTER TABLE `guild_settings` ADD `music_volume` INT NOT NULL DEFAULT '30' AFTER `music_channel`; \ No newline at end of file diff --git a/src/main/java/netneutrality/GuildManager.java b/src/main/java/netneutrality/GuildManager.java deleted file mode 100644 index 62bae03..0000000 --- a/src/main/java/netneutrality/GuildManager.java +++ /dev/null @@ -1,162 +0,0 @@ -package netneutrality; -/* - * Copyright (c) anthorob - * - * https://xtremcommunity.com/ - * https://discord.gg/CdFcyQ - */ - -import net.dv8tion.jda.api.entities.Guild; -import net.dv8tion.jda.api.entities.Member; -import net.dv8tion.jda.api.entities.Message; -import net.dv8tion.jda.api.entities.TextChannel; -import netneutrality.db.DBController; -import netneutrality.db.controllers.DBGuild; -import netneutrality.db.controllers.DBMessage; -import netneutrality.db.entities.OGuild; -import netneutrality.handler.ratelimiter.IMessageRateLimiter; -import netneutrality.handler.ratelimiter.MessageRateLimiterImpl; -import netneutrality.utils.MessageFunction; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -public class GuildManager { - - public enum GuildSetting { - MUSIC_ROLE("MUSIC_ROLE", ""), - MUSIC_CHANNEL("MUSIC_CHANNEL", ""), - MUSIC_VOLUME("MUSIC_VOLUME", 30), - BLACKLIST_CHANNELS("BLACKLIST_EXCLUDE_CHANNELS", ""); - - private final String name; - private final Object defaultValue; - - GuildSetting(String name, Object defaultValue) { - this.name = name; - this.defaultValue = defaultValue; - } - - public String getName() { - return name; - } - - public Object getDefaultValue() { - return defaultValue; - } - } - - public static final Logger logger = LoggerFactory.getLogger(GuildManager.class); - private static final Map managers = new ConcurrentHashMap<>(); - private final Guild guild; - private OGuild guildEntity; - private final IMessageRateLimiter rateLimiter; - - private GuildManager(Guild guild) { - this.guild = guild; - handleJoinEvent(); - - this.guildEntity = new OGuild(guild.getId()); - this.rateLimiter = new MessageRateLimiterImpl(); - managers.put(guild.getId(), this); - } - - public static GuildManager getManager(Guild guild) { - if (managers.containsKey(guild.getId())) { - return managers.get(guild.getId()); - } else { - return new GuildManager(guild); - } - } - - // Getter - public static Map getManagers() { - return managers; - } - - public static GuildManager getManager(String guildId) { - return managers.getOrDefault(guildId, null); - } - - public Object getSetting(GuildSetting key) { - return guildEntity.getSettings().getSettingByKey(key); - } - - public boolean isLoggingEnabled() { - return guildEntity.isLogging(); - } - - public boolean isDebugEnabled() { - return guildEntity.isDebug(); - } - - public Map getSettings() { - return guildEntity.getSettings().getSettings(); - } - - public IMessageRateLimiter getRateLimiter() { - return rateLimiter; - } - - public Guild getGuild() { - return guild; - } - - - public static boolean reloadSettingsForGuild(String guildId) { - if (managers.containsKey(guildId)) { - GuildManager manager = managers.get(guildId); - manager.reloadSettings(); - - return true; - } - - return false; - } - - public static boolean reloadSettingsForGuild(Guild guild) { - GuildManager manager = GuildManager.getManager(guild.getId()); - manager.reloadSettings(); - - return true; - } - - public void checkAndLogMessage(Message message, Member member, TextChannel channel) { - if (guildEntity.isLogging()) { - ((DBMessage) DBController.get("message")).log(guild, channel, member, message); - } - } - - public void checkBlacklist(Message message, Member member, TextChannel channel) { - //TODO: per-guild - MessageFunction.checkBlacklist(guild, message, channel); - } - - public boolean existInDb() { - return DBController.get().exists("guilds", "guild_id", guild.getId()); - } - - public void reloadSettings() { - logger.debug("Reloading guild entity: " + guild.getId()); - this.guildEntity = new OGuild(guild.getId()); - } - - public void handleJoinEvent() { - if (!existInDb()) { - ((DBGuild) DBController.get("guild")).insertGuildInDB(guild); - - guild.getTextChannels() - .stream() - .filter(textChannel -> textChannel.getName().equals("debug") || textChannel.getName().equals("log")) - .forEach(textChannel -> textChannel.sendMessage("Error logging enabled on channel " + textChannel.getAsMention()).queue()); - } - - } - - public void removeFromDB() { - ((DBGuild) DBController.get("guild")).removeGuildInDB(guild); - } - -} diff --git a/src/main/java/netneutrality/MusicBot.java b/src/main/java/netneutrality/NetNeutrality.java similarity index 64% rename from src/main/java/netneutrality/MusicBot.java rename to src/main/java/netneutrality/NetNeutrality.java index 3de4827..f739550 100644 --- a/src/main/java/netneutrality/MusicBot.java +++ b/src/main/java/netneutrality/NetNeutrality.java @@ -1,33 +1,45 @@ package netneutrality; +import io.sentry.Sentry; import net.dv8tion.jda.api.JDA; import net.dv8tion.jda.api.JDABuilder; import net.dv8tion.jda.api.entities.Activity; import net.dv8tion.jda.api.entities.User; import net.dv8tion.jda.api.requests.GatewayIntent; - import netneutrality.command.CommandManager; +import netneutrality.core.LogHandler; import netneutrality.db.DBController; +import netneutrality.handler.hooks.guilds.ServerJoinHandler; import netneutrality.handler.hooks.message.EditHandler; import netneutrality.handler.hooks.message.MessageReceivedHandler; -import netneutrality.handler.hooks.guilds.ServerJoinHandler; import netneutrality.http.server.WebApi; import netneutrality.music.MusicManager; import netneutrality.thread.BaseThreadFactory; import netneutrality.thread.ShutdownThread; +import netneutrality.thread.ThreadManager; import netneutrality.utils.Settings; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.security.auth.login.LoginException; -public class MusicBot { +public class NetNeutrality { private static JDA jda; - public final static Logger logger = LoggerFactory.getLogger(MusicBot.class); + public final static Logger logger = LoggerFactory.getLogger(NetNeutrality.class); public static void main(String[] args) { + String sentryDsn = Settings.getInstance().get("SENTRY_DSN"); + Sentry.init(options -> { + options.setDsn(sentryDsn); + options.setEnvironment(Settings.getInstance().get("BOT_ENV", "dev")); + // Set tracesSampleRate to 1.0 to capture 100% of transactions for performance monitoring. + // We recommend adjusting this value in production. + options.setTracesSampleRate(1.0); + // When first trying Sentry it's good to see what the SDK is doing: + options.setDebug(true); + }); + DBController.init(); @@ -35,7 +47,6 @@ public class MusicBot { CommandManager.init(); MusicManager.initPlayerManager(); - jda.getPresence().setActivity(Activity.watching("me load...")); jda.addEventListener(new MessageReceivedHandler(), new EditHandler(), new ServerJoinHandler()); new WebApi(9000); @@ -47,11 +58,17 @@ public class MusicBot { public static void initJDA() { try { - jda = JDABuilder.createDefault(Settings.getInstance().get("BOT_TOKEN")).enableIntents(GatewayIntent.GUILD_MEMBERS, GatewayIntent.GUILD_MESSAGE_REACTIONS, GatewayIntent.GUILD_VOICE_STATES).build(); + jda = JDABuilder + .createDefault(Settings.getInstance().get("BOT_TOKEN")) + .enableIntents(GatewayIntent.GUILD_MEMBERS, GatewayIntent.GUILD_MESSAGE_REACTIONS, GatewayIntent.GUILD_VOICE_STATES) + .setActivity(Activity.watching("me load...")) + .build(); jda.awaitReady(); } catch (LoginException | IllegalArgumentException | InterruptedException e) { - logger.error(e.getMessage()); - System.exit(0); + Sentry.captureException(e); + + LogHandler.log(e); + System.exit(1); } } diff --git a/src/main/java/netneutrality/command/AbstractMusicCommand.java b/src/main/java/netneutrality/command/AbstractMusicCommand.java index 66c4b99..4614326 100644 --- a/src/main/java/netneutrality/command/AbstractMusicCommand.java +++ b/src/main/java/netneutrality/command/AbstractMusicCommand.java @@ -9,7 +9,7 @@ package netneutrality.command; import net.dv8tion.jda.api.entities.Guild; import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.Role; -import netneutrality.GuildManager; +import netneutrality.core.GuildManager; import netneutrality.utils.UserFunction; public abstract class AbstractMusicCommand extends AbstractCommand { @@ -26,7 +26,7 @@ public abstract class AbstractMusicCommand extends AbstractCommand { @Override public boolean canBeExecutedBy(Guild guild, Member member) { - String roleDb = (String) GuildManager.getManager(guild).getSetting(GuildManager.GuildSetting.MUSIC_ROLE); + String roleDb = GuildManager.getManager(guild).getSetting(GuildManager.Settings.MUSIC_ROLE); boolean can = true; //System.out.println(roleDb); diff --git a/src/main/java/netneutrality/command/ICommand.java b/src/main/java/netneutrality/command/ICommand.java index 9a35a21..848bc5a 100644 --- a/src/main/java/netneutrality/command/ICommand.java +++ b/src/main/java/netneutrality/command/ICommand.java @@ -8,6 +8,7 @@ package netneutrality.command; import net.dv8tion.jda.api.entities.Guild; import net.dv8tion.jda.api.entities.Member; +import netneutrality.core.context.CommandContext; import netneutrality.exceptions.CommandErrorException; import netneutrality.exceptions.CommandExecutionException; diff --git a/src/main/java/netneutrality/command/basic/HelpCommand.java b/src/main/java/netneutrality/command/basic/HelpCommand.java index f97db14..69bf7c9 100644 --- a/src/main/java/netneutrality/command/basic/HelpCommand.java +++ b/src/main/java/netneutrality/command/basic/HelpCommand.java @@ -8,7 +8,11 @@ package netneutrality.command.basic; import net.dv8tion.jda.api.MessageBuilder; import net.dv8tion.jda.api.entities.MessageEmbed; -import netneutrality.command.*; +import netneutrality.command.AbstractCommand; +import netneutrality.command.CommandManager; +import netneutrality.command.CommandType; +import netneutrality.command.CommandUsage; +import netneutrality.core.context.CommandContext; import netneutrality.utils.MessageFunction; import netneutrality.utils.UserFunction; @@ -72,8 +76,6 @@ public class HelpCommand extends AbstractCommand { context.replyPrivate("Command [" + c.getCommandName() + "] requires admin privileges"); } - System.out.println(CommandUsage.create(c, new CommandUsage.Argument(CommandUsage.Argument.Type.REQUIRED, new String[] {"get", "add"}, ""))); - MessageEmbed help = MessageFunction.buildHelpMessage(c); context.reply(new MessageBuilder().append(context.getDiscordUser()).append(" help has been sent your way!").build()); context.replyPrivate(help); diff --git a/src/main/java/netneutrality/command/basic/PingCommand.java b/src/main/java/netneutrality/command/basic/PingCommand.java index b70afde..432c9bf 100644 --- a/src/main/java/netneutrality/command/basic/PingCommand.java +++ b/src/main/java/netneutrality/command/basic/PingCommand.java @@ -7,9 +7,9 @@ package netneutrality.command.basic; */ import netneutrality.command.AbstractCommand; -import netneutrality.command.CommandContext; import netneutrality.command.CommandType; import netneutrality.command.CommandUsage; +import netneutrality.core.context.CommandContext; public class PingCommand extends AbstractCommand { diff --git a/src/main/java/netneutrality/command/bot/ConfigureCommand.java b/src/main/java/netneutrality/command/bot/ConfigureCommand.java index a5abe27..0474c82 100644 --- a/src/main/java/netneutrality/command/bot/ConfigureCommand.java +++ b/src/main/java/netneutrality/command/bot/ConfigureCommand.java @@ -7,13 +7,11 @@ package netneutrality.command.bot; */ import net.dv8tion.jda.api.entities.Role; -import netneutrality.GuildManager; import netneutrality.command.AbstractCommand; -import netneutrality.command.CommandContext; import netneutrality.command.CommandType; import netneutrality.command.CommandUsage; -import netneutrality.db.DBController; -import netneutrality.db.MysqlDatabase; +import netneutrality.core.GuildManager; +import netneutrality.core.context.CommandContext; import netneutrality.exceptions.CommandErrorException; import netneutrality.music.MusicManager; @@ -60,7 +58,6 @@ public class ConfigureCommand extends AbstractCommand { @Override public void execute(CommandContext context) { String[] args = context.getArgumentsAsArray(); - MysqlDatabase database = DBController.get(); GuildManager guildManager = GuildManager.getManager(context.getGuild()); if (args.length > 0) { @@ -68,7 +65,7 @@ public class ConfigureCommand extends AbstractCommand { if (context.getArg(0).equals("musicrole")) { if (args.length == 1) { - String roleDb = (String) guildManager.getSetting(GuildManager.GuildSetting.MUSIC_ROLE); + String roleDb = guildManager.getSetting(GuildManager.Settings.MUSIC_ROLE); Role role = null; if (!roleDb.isEmpty()) { role = context.getGuild().getRoleById(roleDb); @@ -83,15 +80,13 @@ public class ConfigureCommand extends AbstractCommand { if (roles.size() == 1) { Role role = roles.get(0); if (role.getGuild().getId().equals(context.getGuild().getId())) { - database.prepareAndExecuteAsync("UPDATE guild_settings SET music_role = ? WHERE guild_id = ?", role.getId(), context.getGuild().getId()).blocking(); - guildManager.reloadSettings(); + guildManager.setSettingValue(GuildManager.Settings.MUSIC_ROLE, role.getId()); context.reply("Successfully set %s as the role needed for music command", role.getAsMention()); } } if (context.getArg(1).equals("reset")) { - database.prepareAndExecuteAsync("UPDATE guild_settings SET music_role = null WHERE guild_id = ?", context.getGuild().getId()).blocking(); - guildManager.reloadSettings(); + guildManager.setSettingValue(GuildManager.Settings.MUSIC_ROLE, null); context.reply("Successful reset of the role"); } } @@ -99,7 +94,7 @@ public class ConfigureCommand extends AbstractCommand { if (context.getArg(0).equals("musicvolume")) { if (args.length == 1) { - int volume = (int) guildManager.getSetting(GuildManager.GuildSetting.MUSIC_VOLUME); + int volume = Integer.parseInt(guildManager.getSetting(GuildManager.Settings.MUSIC_VOLUME)); context.reply("Default volume for music player: " + volume); } @@ -108,8 +103,7 @@ public class ConfigureCommand extends AbstractCommand { try { int volume = Integer.parseInt(args[1]); - database.prepareAndExecuteAsync("UPDATE guild_settings SET music_volume = ? WHERE guild_id = ?", volume, context.getGuild().getId()).blocking(); - guildManager.reloadSettings(); + guildManager.setSettingValue(GuildManager.Settings.MUSIC_VOLUME, String.valueOf(volume)); MusicManager.get(context.getGuild()).setVolume(volume); context.reply("Default volume for music player is now %d", volume); } catch (NumberFormatException e) { diff --git a/src/main/java/netneutrality/command/crypto/BitcoinPriceCommand.java b/src/main/java/netneutrality/command/crypto/BitcoinPriceCommand.java index 87b57e9..48750c0 100644 --- a/src/main/java/netneutrality/command/crypto/BitcoinPriceCommand.java +++ b/src/main/java/netneutrality/command/crypto/BitcoinPriceCommand.java @@ -7,11 +7,10 @@ package netneutrality.command.crypto; */ import netneutrality.command.AbstractCommand; -import netneutrality.command.CommandContext; import netneutrality.command.CommandType; import netneutrality.command.CommandUsage; -import netneutrality.exceptions.CommandErrorException; -import netneutrality.exceptions.CommandExecutionException; +import netneutrality.core.LogHandler; +import netneutrality.core.context.CommandContext; import netneutrality.http.WebModule; import org.json.JSONException; @@ -70,7 +69,8 @@ public class BitcoinPriceCommand extends AbstractCommand { if (Currency.isCurrency(args[0].toUpperCase())) currency = args[0].toUpperCase(); else { - throw new CommandErrorException("Please enter a valid currency", context, null); + context.reply("Please enter a valid currency"); + return; } } @@ -85,15 +85,11 @@ public class BitcoinPriceCommand extends AbstractCommand { try { WebModule http = new WebModule(String.format("%s?fsym=%s&tsyms=%s", baseURL, crypto, finalCurrency.toUpperCase())).request(); price = dollarFormat.format(http.getAsObject().getDouble(finalCurrency)); - + t.editMessage(String.format("The current price of %s in %s is %s", crypto, finalCurrency, price)).queue(); } catch (IOException | JSONException | IllegalArgumentException | ArithmeticException e) { t.editMessage(String.format("Error getting price of %s!", crypto)).queue(); - throw new CommandExecutionException("Error during web request", context, e); + LogHandler.log(e); } - - t.editMessage(String.format("The current price of %s in %s is %s", crypto, finalCurrency, price)).queue(); - }); } - } diff --git a/src/main/java/netneutrality/command/crypto/CryptoPriceCommand.java b/src/main/java/netneutrality/command/crypto/CryptoPriceCommand.java index 96dd62f..d9d16f4 100644 --- a/src/main/java/netneutrality/command/crypto/CryptoPriceCommand.java +++ b/src/main/java/netneutrality/command/crypto/CryptoPriceCommand.java @@ -7,11 +7,10 @@ package netneutrality.command.crypto; */ import netneutrality.command.AbstractCommand; -import netneutrality.command.CommandContext; import netneutrality.command.CommandType; import netneutrality.command.CommandUsage; -import netneutrality.exceptions.CommandErrorException; -import netneutrality.exceptions.CommandExecutionException; +import netneutrality.core.LogHandler; +import netneutrality.core.context.CommandContext; import netneutrality.http.WebModule; import org.json.JSONException; @@ -72,7 +71,8 @@ public class CryptoPriceCommand extends AbstractCommand { if (Currency.isCurrency(args[1].toUpperCase())) currency = args[1].toUpperCase(); else { - throw new CommandErrorException("Please enter a valid currency", context, null); + context.reply("Please enter a valid currency"); + return; } } @@ -88,17 +88,13 @@ public class CryptoPriceCommand extends AbstractCommand { try { WebModule http = new WebModule(String.format("%s?fsym=%s&tsyms=%s", baseURL, crypto, finalCurrency.toUpperCase())).request(); price = dollarFormat.format(http.getAsObject().getDouble(finalCurrency)); + t.editMessage(String.format("The current price of %s in %s is %s", crypto, finalCurrency, price)).queue(); } catch (IOException | JSONException | IllegalArgumentException | ArithmeticException e) { t.editMessage(String.format("Error getting price of %s!", crypto)).queue(); - throw new CommandExecutionException("Error during web request", context, e); + LogHandler.log(e); } - - - - t.editMessage(String.format("The current price of %s in %s is %s", crypto, finalCurrency, price)).queue(); }); } } - } diff --git a/src/main/java/netneutrality/command/crypto/EthereumPriceCommand.java b/src/main/java/netneutrality/command/crypto/EthereumPriceCommand.java index 625005a..49f2706 100644 --- a/src/main/java/netneutrality/command/crypto/EthereumPriceCommand.java +++ b/src/main/java/netneutrality/command/crypto/EthereumPriceCommand.java @@ -7,11 +7,10 @@ package netneutrality.command.crypto; */ import netneutrality.command.AbstractCommand; -import netneutrality.command.CommandContext; import netneutrality.command.CommandType; import netneutrality.command.CommandUsage; -import netneutrality.exceptions.CommandErrorException; -import netneutrality.exceptions.CommandExecutionException; +import netneutrality.core.LogHandler; +import netneutrality.core.context.CommandContext; import netneutrality.http.WebModule; import org.json.JSONException; @@ -70,7 +69,8 @@ public class EthereumPriceCommand extends AbstractCommand { if (Currency.isCurrency(args[0].toUpperCase())) currency = args[0].toUpperCase(); else { - throw new CommandErrorException("Please enter a valid currency", context, null); + context.reply("Please enter a valid currency"); + return; } } @@ -85,15 +85,11 @@ public class EthereumPriceCommand extends AbstractCommand { try { WebModule http = new WebModule(String.format("%s?fsym=%s&tsyms=%s", baseURL, crypto, finalCurrency.toUpperCase())).request(); price = dollarFormat.format(http.getAsObject().getDouble(finalCurrency)); - + t.editMessage(String.format("The current price of %s in %s is %s", crypto, finalCurrency, price)).queue(); } catch (IOException | JSONException | IllegalArgumentException e) { t.editMessage(String.format("Error getting price of %s!", crypto)).queue(); - throw new CommandExecutionException("Error during web request", context, e); + LogHandler.log(e); } - - t.editMessage(String.format("The current price of %s in %s is %s", crypto, finalCurrency, price)).queue(); - }); } - } diff --git a/src/main/java/netneutrality/command/crypto/LitecoinPriceCommand.java b/src/main/java/netneutrality/command/crypto/LitecoinPriceCommand.java index 954a75c..bbd7bc5 100644 --- a/src/main/java/netneutrality/command/crypto/LitecoinPriceCommand.java +++ b/src/main/java/netneutrality/command/crypto/LitecoinPriceCommand.java @@ -7,11 +7,10 @@ package netneutrality.command.crypto; */ import netneutrality.command.AbstractCommand; -import netneutrality.command.CommandContext; import netneutrality.command.CommandType; import netneutrality.command.CommandUsage; -import netneutrality.exceptions.CommandErrorException; -import netneutrality.exceptions.CommandExecutionException; +import netneutrality.core.LogHandler; +import netneutrality.core.context.CommandContext; import netneutrality.http.WebModule; import org.json.JSONException; @@ -70,7 +69,8 @@ public class LitecoinPriceCommand extends AbstractCommand { if (Currency.isCurrency(args[0].toUpperCase())) currency = args[0].toUpperCase(); else { - throw new CommandErrorException("Please enter a valid currency", context, null); + context.reply("Please enter a valid currency"); + return; } } @@ -85,14 +85,11 @@ public class LitecoinPriceCommand extends AbstractCommand { try { WebModule http = new WebModule(String.format("%s?fsym=%s&tsyms=%s", baseURL, crypto, finalCurrency.toUpperCase())).request(); price = dollarFormat.format(http.getAsObject().getDouble(finalCurrency)); - + t.editMessage(String.format("The current price of %s in %s is %s", crypto, finalCurrency, price)).queue(); } catch (IOException | JSONException | IllegalArgumentException | ArithmeticException e) { t.editMessage(String.format("Error getting price of %s!", crypto)).queue(); - throw new CommandExecutionException("Error during web request", context, e); + LogHandler.log(e); } - - t.editMessage(String.format("The current price of %s in %s is %s", crypto, finalCurrency, price)).queue(); - }); } } diff --git a/src/main/java/netneutrality/command/message/BlacklistCommand.java b/src/main/java/netneutrality/command/message/BlacklistCommand.java index fd98379..506b11c 100644 --- a/src/main/java/netneutrality/command/message/BlacklistCommand.java +++ b/src/main/java/netneutrality/command/message/BlacklistCommand.java @@ -7,13 +7,13 @@ package netneutrality.command.message; */ import netneutrality.command.AbstractCommand; -import netneutrality.command.CommandContext; import netneutrality.command.CommandType; import netneutrality.command.CommandUsage; +import netneutrality.core.LogHandler; +import netneutrality.core.context.CommandContext; import netneutrality.db.DBController; import netneutrality.db.controllers.DBBlacklist; -import netneutrality.db.models.MBlacklist; -import netneutrality.exceptions.CommandExecutionException; +import netneutrality.db.entities.OBlacklist; import java.util.ArrayList; @@ -57,71 +57,39 @@ public class BlacklistCommand extends AbstractCommand { @Override public void execute(CommandContext context) { String[] args = context.getArgumentsAsArray(); - DBBlacklist controller = ((DBBlacklist) DBController.get("blacklist")); + DBBlacklist controller = DBController.get("blacklist", DBBlacklist.class); if (controller == null) { - throw new CommandExecutionException("Error getting database controller", context, null); + } if (args.length > 0 && args.length < 3) { String word = (args.length == 2 ? args[1] : ""); switch (args[0]) { + case "get" -> { - case "get": context.getChannel().sendMessage("Retrieving list, please wait...").queue(t -> { + ArrayList blacklists = new ArrayList<>(); + try { + blacklists = controller.getBlacklistForGuild(context); + } catch (Exception e) { + LogHandler.log(e); + } StringBuilder sb = new StringBuilder(); - ArrayList blacklists = controller.getBlacklistFromServer(context.getGuild().getId()); - for (MBlacklist bl : blacklists) { - sb.append(bl.getWord()).append(" -> ").append(bl.isEnabled() ? "enabled" : "disabled").append("\n"); - } + for (OBlacklist bl : blacklists) { + sb.append(bl.getWord()).append(" -> ").append(bl.getEnabled() ? "enabled" : "disabled").append("\n"); + } - t.editMessage("List of blacklisted words for this server [" + context.getGuild().getName() + "] :\n" + (blacklists.isEmpty() ? "No word found" : sb.toString())).queue(); + t.editMessage("List of blacklisted words for this server [" + context.getGuild().getName() + "] :\n" + (blacklists.isEmpty() ? "No word found" : sb.toString())).queue(); }); - - break; - - case "add": - - if (controller.add(new MBlacklist(word, true, context.getDiscordUser().getId(), context.getGuild().getId()))) { - context.reply(String.format("Added the word [%s] to the blacklist.", word)); - } else { - context.reply(String.format("Error adding [%s] to the blacklist. It's already blacklisted!", word)); - } - break; - - case "remove": - - if (controller.delete(word, context.getGuild().getId())) { - context.reply("Removed the word \"" + word + "\" from the blacklist."); - } else { - context.reply("Error removing \"" + word + "\" from the blacklist"); - } - - break; - - case "disable": - - if (controller.disable(word, context.getGuild().getId())) { - context.reply("Removed the word \"" + word + "\" from the blacklist."); - } else { - context.reply("Error removing \"" + word + "\" from the blacklist"); - } - - break; - - case "enable": - - if (controller.enable(word, context.getGuild().getId())) { - context.reply("Removed the word \"" + word + "\" from the blacklist."); - } else { - context.reply("Error removing \"" + word + "\" from the blacklist"); - } - - break; - + } + case "add" -> controller.add(word, context); + case "remove" -> controller.delete(word, context); + case "disable" -> controller.disable(word, context); + case "enable" -> controller.enable(word, context); } } } diff --git a/src/main/java/netneutrality/command/message/PruneCommand.java b/src/main/java/netneutrality/command/message/PruneCommand.java index 646bf1d..e9179de 100644 --- a/src/main/java/netneutrality/command/message/PruneCommand.java +++ b/src/main/java/netneutrality/command/message/PruneCommand.java @@ -7,9 +7,9 @@ package netneutrality.command.message; */ import netneutrality.command.AbstractCommand; -import netneutrality.command.CommandContext; import netneutrality.command.CommandType; import netneutrality.command.CommandUsage; +import netneutrality.core.context.CommandContext; import netneutrality.utils.ChannelFunction; public class PruneCommand extends AbstractCommand { diff --git a/src/main/java/netneutrality/command/music/BitconnectCommand.java b/src/main/java/netneutrality/command/music/BitconnectCommand.java index c98a1d4..c66aeba 100644 --- a/src/main/java/netneutrality/command/music/BitconnectCommand.java +++ b/src/main/java/netneutrality/command/music/BitconnectCommand.java @@ -8,9 +8,9 @@ package netneutrality.command.music; */ import netneutrality.command.AbstractMusicCommand; -import netneutrality.command.CommandContext; import netneutrality.command.CommandType; import netneutrality.command.CommandUsage; +import netneutrality.core.context.CommandContext; import netneutrality.music.MusicManager; public class BitconnectCommand extends AbstractMusicCommand { diff --git a/src/main/java/netneutrality/command/music/CurrentlyPlayingCommand.java b/src/main/java/netneutrality/command/music/CurrentlyPlayingCommand.java index abbc959..d673627 100644 --- a/src/main/java/netneutrality/command/music/CurrentlyPlayingCommand.java +++ b/src/main/java/netneutrality/command/music/CurrentlyPlayingCommand.java @@ -9,8 +9,8 @@ package netneutrality.command.music; import net.dv8tion.jda.api.entities.Member; import netneutrality.command.AbstractMusicCommand; -import netneutrality.command.CommandContext; import netneutrality.command.CommandUsage; +import netneutrality.core.context.CommandContext; import netneutrality.music.MusicManager; import netneutrality.utils.MessageFunction; import netneutrality.utils.MusicUtils; @@ -46,7 +46,8 @@ public class CurrentlyPlayingCommand extends AbstractMusicCommand { public void execute(CommandContext context) { Member member = context.getGuildUser(); MusicManager player = MusicManager.get(context.getGuild()); - MusicUtils.checkIfConnected(player, context); + if (!MusicUtils.checkIfConnected(player, context)) + return; if (player.getCurrentlyPlaying() != null) { context.reply(MessageFunction.buildCurrentlyPlayingMessage(player, member)); diff --git a/src/main/java/netneutrality/command/music/DeleteQueueCommand.java b/src/main/java/netneutrality/command/music/DeleteQueueCommand.java index 0cf91d6..06e1b55 100644 --- a/src/main/java/netneutrality/command/music/DeleteQueueCommand.java +++ b/src/main/java/netneutrality/command/music/DeleteQueueCommand.java @@ -8,18 +8,14 @@ package netneutrality.command.music; */ import netneutrality.command.AbstractMusicCommand; -import netneutrality.command.CommandContext; import netneutrality.command.CommandUsage; +import netneutrality.core.context.CommandContext; import netneutrality.exceptions.CommandErrorException; import netneutrality.music.MusicManager; import netneutrality.utils.MessageFunction; import netneutrality.utils.MusicUtils; public class DeleteQueueCommand extends AbstractMusicCommand { - @Override - public boolean needAdmin() { - return true; - } @Override public boolean isEnabled() { @@ -51,7 +47,11 @@ public class DeleteQueueCommand extends AbstractMusicCommand { @Override public void execute(CommandContext context) { MusicManager player = MusicManager.get(context.getGuild()); - MusicUtils.checkIfConnected(player, context); + if (!MusicUtils.checkIfConnected(player, context)) + return; + + if (!MusicUtils.checkIfDj(player, context)) + return; if (context.getArgumentsAsArray().length == 0) { context.reply("Select the track you want to delete from the queue (track# or all)"); @@ -66,7 +66,7 @@ public class DeleteQueueCommand extends AbstractMusicCommand { if (queueSize > 0) { player.leave(); player.getScheduler().getQueue().clear(); - context.reply("Removed " + queueSize-- + (queueSize > 1 ? " tracks" : "track") + " from the queue"); + context.reply(String.format("Removed %d track%s from the queue", queueSize--, (queueSize > 1 ? "s" : ""))); } else { context.reply("Queue is empty!"); } @@ -86,11 +86,6 @@ public class DeleteQueueCommand extends AbstractMusicCommand { throw new CommandErrorException("Please enter a number", context, e); } } - - - } - - } } diff --git a/src/main/java/netneutrality/command/music/JoinCommand.java b/src/main/java/netneutrality/command/music/JoinCommand.java index b6cd31a..d9c9b57 100644 --- a/src/main/java/netneutrality/command/music/JoinCommand.java +++ b/src/main/java/netneutrality/command/music/JoinCommand.java @@ -9,9 +9,8 @@ package netneutrality.command.music; import net.dv8tion.jda.api.entities.VoiceChannel; import netneutrality.command.AbstractMusicCommand; -import netneutrality.command.CommandContext; import netneutrality.command.CommandUsage; -import netneutrality.exceptions.CommandErrorException; +import netneutrality.core.context.CommandContext; import netneutrality.exceptions.CommandExecutionException; import netneutrality.music.MusicManager; @@ -47,15 +46,17 @@ public class JoinCommand extends AbstractMusicCommand { MusicManager player = MusicManager.get(context.getGuild()); if (context.getGuildUser().getVoiceState() == null) { - throw new CommandExecutionException("Voice state is null", context, null); + throw new CommandExecutionException("Voice state is null, this should not happen", context, null); } if (!context.getGuildUser().getVoiceState().inVoiceChannel()) { - throw new CommandErrorException("You are not in a voice channel", context, null); + context.reply("You are not in a voice channel"); + return; } if (player.isConnected()) { - throw new CommandErrorException("Player is already in a voice channel", context, null); + context.reply("Player is already in a voice channel"); + return; } VoiceChannel vChannel = context.getGuildUser().getVoiceState().getChannel(); diff --git a/src/main/java/netneutrality/command/music/LeaveCommand.java b/src/main/java/netneutrality/command/music/LeaveCommand.java index d2811ce..829d943 100644 --- a/src/main/java/netneutrality/command/music/LeaveCommand.java +++ b/src/main/java/netneutrality/command/music/LeaveCommand.java @@ -8,8 +8,8 @@ package netneutrality.command.music; */ import netneutrality.command.AbstractMusicCommand; -import netneutrality.command.CommandContext; import netneutrality.command.CommandUsage; +import netneutrality.core.context.CommandContext; import netneutrality.music.MusicManager; import netneutrality.utils.MusicUtils; @@ -47,7 +47,8 @@ public class LeaveCommand extends AbstractMusicCommand { @Override public void execute(CommandContext context) { MusicManager player = MusicManager.get(context.getGuild()); - MusicUtils.checkIfConnected(player, context); + if (!MusicUtils.checkIfConnected(player, context)) + return; player.leave(); } diff --git a/src/main/java/netneutrality/command/music/PlayCommand.java b/src/main/java/netneutrality/command/music/PlayCommand.java index 444e9d4..df719d5 100644 --- a/src/main/java/netneutrality/command/music/PlayCommand.java +++ b/src/main/java/netneutrality/command/music/PlayCommand.java @@ -8,8 +8,8 @@ package netneutrality.command.music; */ import netneutrality.command.AbstractMusicCommand; -import netneutrality.command.CommandContext; import netneutrality.command.CommandUsage; +import netneutrality.core.context.CommandContext; import netneutrality.music.MusicManager; public class PlayCommand extends AbstractMusicCommand { diff --git a/src/main/java/netneutrality/command/music/SkipCommand.java b/src/main/java/netneutrality/command/music/SkipCommand.java index 5f3960d..5b56405 100644 --- a/src/main/java/netneutrality/command/music/SkipCommand.java +++ b/src/main/java/netneutrality/command/music/SkipCommand.java @@ -8,8 +8,8 @@ package netneutrality.command.music; */ import netneutrality.command.AbstractMusicCommand; -import netneutrality.command.CommandContext; import netneutrality.command.CommandUsage; +import netneutrality.core.context.CommandContext; import netneutrality.music.MusicManager; import netneutrality.utils.MusicUtils; import netneutrality.utils.UserFunction; @@ -43,7 +43,8 @@ public class SkipCommand extends AbstractMusicCommand { @Override public void execute(CommandContext context) { MusicManager player = MusicManager.get(context.getGuild()); - MusicUtils.checkIfConnected(player, context); + if (!MusicUtils.checkIfConnected(player, context)) + return; // Combined fonctionality of vote skip //TODO: clean ifs diff --git a/src/main/java/netneutrality/command/music/StopCommand.java b/src/main/java/netneutrality/command/music/StopCommand.java index 0347855..5dcec88 100644 --- a/src/main/java/netneutrality/command/music/StopCommand.java +++ b/src/main/java/netneutrality/command/music/StopCommand.java @@ -8,8 +8,8 @@ package netneutrality.command.music; */ import netneutrality.command.AbstractMusicCommand; -import netneutrality.command.CommandContext; import netneutrality.command.CommandUsage; +import netneutrality.core.context.CommandContext; import netneutrality.music.MusicManager; import netneutrality.utils.MusicUtils; import netneutrality.utils.UserFunction; @@ -44,7 +44,8 @@ public class StopCommand extends AbstractMusicCommand { @Override public void execute(CommandContext context) { MusicManager player = MusicManager.get(context.getGuild()); - MusicUtils.checkIfConnected(player, context); + if (!MusicUtils.checkIfConnected(player, context)) + return; if (UserFunction.isAdmin(context.getGuildUser()) || context.getGuildUser().getId().equals(player.getRequesterOfCurrentTrack().getId())) { player.leave(); diff --git a/src/main/java/netneutrality/command/music/ViewQueueCommand.java b/src/main/java/netneutrality/command/music/ViewQueueCommand.java index 0d65e64..ea86e90 100644 --- a/src/main/java/netneutrality/command/music/ViewQueueCommand.java +++ b/src/main/java/netneutrality/command/music/ViewQueueCommand.java @@ -9,8 +9,8 @@ package netneutrality.command.music; import net.dv8tion.jda.api.entities.Member; import netneutrality.command.AbstractMusicCommand; -import netneutrality.command.CommandContext; import netneutrality.command.CommandUsage; +import netneutrality.core.context.CommandContext; import netneutrality.music.MusicManager; import netneutrality.utils.MessageFunction; import netneutrality.utils.MusicUtils; @@ -50,7 +50,8 @@ public class ViewQueueCommand extends AbstractMusicCommand { public void execute(CommandContext context) { Member member = context.getGuildUser(); MusicManager player = MusicManager.get(context.getGuild()); - MusicUtils.checkIfConnected(player, context); + if (!MusicUtils.checkIfConnected(player, context)) + return; int queueSize = player.getScheduler().getQueue().size(); if (queueSize > 0) { diff --git a/src/main/java/netneutrality/command/music/VolumeCommand.java b/src/main/java/netneutrality/command/music/VolumeCommand.java index f2f1d7b..bd03f77 100644 --- a/src/main/java/netneutrality/command/music/VolumeCommand.java +++ b/src/main/java/netneutrality/command/music/VolumeCommand.java @@ -8,17 +8,13 @@ package netneutrality.command.music; */ import netneutrality.command.AbstractMusicCommand; -import netneutrality.command.CommandContext; import netneutrality.command.CommandUsage; +import netneutrality.core.context.CommandContext; import netneutrality.exceptions.CommandErrorException; import netneutrality.music.MusicManager; import netneutrality.utils.MusicUtils; public class VolumeCommand extends AbstractMusicCommand { - @Override - public boolean needAdmin() { - return true; - } @Override public boolean isEnabled() { @@ -48,14 +44,18 @@ public class VolumeCommand extends AbstractMusicCommand { @Override public void execute(CommandContext context) { MusicManager player = MusicManager.get(context.getGuild()); - MusicUtils.checkIfConnected(player, context); + if (!MusicUtils.checkIfConnected(player, context)) + return; + + if (!MusicUtils.checkIfDj(player, context)) + return; try { int volume = Integer.parseInt(context.getArgumentsAsArray()[0]); player.setVolume(volume); context.reply("Volume set to %s", volume); } catch (NumberFormatException e) { - throw new CommandErrorException("Please enter a value from 0 to 100", context, null); + throw new CommandErrorException("Please enter a value from 0 to 100", context, e); } } diff --git a/src/main/java/netneutrality/command/music/VoteSkipCommand.java b/src/main/java/netneutrality/command/music/VoteSkipCommand.java index 6d5037e..1b656a7 100644 --- a/src/main/java/netneutrality/command/music/VoteSkipCommand.java +++ b/src/main/java/netneutrality/command/music/VoteSkipCommand.java @@ -7,8 +7,8 @@ package netneutrality.command.music; */ import netneutrality.command.AbstractMusicCommand; -import netneutrality.command.CommandContext; import netneutrality.command.CommandUsage; +import netneutrality.core.context.CommandContext; import netneutrality.music.MusicManager; import netneutrality.utils.MusicUtils; @@ -41,9 +41,10 @@ public class VoteSkipCommand extends AbstractMusicCommand { @Override public void execute(CommandContext context) { - MusicManager manager = MusicManager.get(context.getGuild()); - MusicUtils.checkIfConnected(manager, context); + MusicManager player = MusicManager.get(context.getGuild()); + if (!MusicUtils.checkIfConnected(player, context)) + return; - manager.voteSkip(context); + player.voteSkip(context); } } diff --git a/src/main/java/netneutrality/command/specific/DatabaseCommand.java b/src/main/java/netneutrality/command/specific/DatabaseCommand.java index f227415..210b317 100644 --- a/src/main/java/netneutrality/command/specific/DatabaseCommand.java +++ b/src/main/java/netneutrality/command/specific/DatabaseCommand.java @@ -9,18 +9,17 @@ package netneutrality.command.specific; import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.entities.User; import netneutrality.command.AbstractCommand; -import netneutrality.command.CommandContext; import netneutrality.command.CommandType; import netneutrality.command.CommandUsage; +import netneutrality.core.context.CommandContext; import netneutrality.db.DBController; import netneutrality.db.controllers.DBMessage; -import netneutrality.db.models.MMessage; +import netneutrality.db.entities.OLogMessage; import netneutrality.utils.Settings; import java.awt.*; import java.time.OffsetDateTime; -import java.time.format.DateTimeFormatter; -import java.util.ArrayList; +import java.util.List; public class DatabaseCommand extends AbstractCommand { @@ -75,29 +74,28 @@ public class DatabaseCommand extends AbstractCommand { if (args.length > 1) { - MMessage message = ((DBMessage) DBController.get("message")).getMessage(args[1]); + OLogMessage message = DBController.get("message", DBMessage.class).getMessage(args[1]); if (message != null) { EmbedBuilder embed = new EmbedBuilder(); embed.setColor(Color.BLUE); - embed.setTimestamp( - DateTimeFormatter.ofPattern(Settings.getInstance().DATETIMEFORMAT).parse(message.getDateSent())); - embed.setFooter("Guild : " + message.getServerId() + " | ID : " + message.getMessageId(), null); + embed.setTimestamp(message.getDateSent()); + embed.setFooter("Guild : " + context.getGuild().getId() + " | ID : " + message.getMessageId(), null); embed.setDescription( - "Message from " + message.getSender() + " on the channel " + message.getChannelName()); + "Message from " + message.getUserId() + " on the channel " + message.getChannelId()); embed.addField("Message: ", "" + message.getMessage(), false); context.reply(embed.build()); } else { //TODO: cached user lol xd User user = context.getJDA().getUserById(args[1]); if (user != null) { - ArrayList messages = ((DBMessage) DBController.get("message")) + List messages = DBController.get("message", DBMessage.class) .getMessagesFromUser(user.getName(), context.getGuild().getName(), 10); EmbedBuilder embed = new EmbedBuilder(); embed.setColor(Color.BLUE); embed.setTimestamp(OffsetDateTime.now()); - for (MMessage message1 : messages) { + for (OLogMessage message1 : messages) { embed.addField( - "Message in channel \"" + message1.getChannelName() + "\" sent on " + "Message in channel \"" + message1.getChannelId() + "\" sent on " + message1.getDateSent(), "" + message1.getMessage(), false); } diff --git a/src/main/java/netneutrality/command/specific/LoggingCommand.java b/src/main/java/netneutrality/command/specific/LoggingCommand.java index 06f0edf..5d11f47 100644 --- a/src/main/java/netneutrality/command/specific/LoggingCommand.java +++ b/src/main/java/netneutrality/command/specific/LoggingCommand.java @@ -7,9 +7,9 @@ package netneutrality.command.specific; */ import netneutrality.command.AbstractCommand; -import netneutrality.command.CommandContext; import netneutrality.command.CommandType; import netneutrality.command.CommandUsage; +import netneutrality.core.context.CommandContext; public class LoggingCommand extends AbstractCommand { diff --git a/src/main/java/netneutrality/core/GuildManager.java b/src/main/java/netneutrality/core/GuildManager.java new file mode 100644 index 0000000..44720d0 --- /dev/null +++ b/src/main/java/netneutrality/core/GuildManager.java @@ -0,0 +1,279 @@ +package netneutrality.core; +/* + * Copyright (c) anthorob + * + * https://xtremcommunity.com/ + * https://discord.gg/CdFcyQ + */ + +import net.dv8tion.jda.api.entities.Guild; +import net.dv8tion.jda.api.entities.Member; +import net.dv8tion.jda.api.entities.Message; +import net.dv8tion.jda.api.entities.TextChannel; +import netneutrality.NetNeutrality; +import netneutrality.db.DBController; +import netneutrality.db.controllers.DBMessage; +import netneutrality.db.entities.OBlacklist; +import netneutrality.db.entities.OGuild; +import netneutrality.db.entities.OGuildSetting; +import netneutrality.handler.ratelimiter.IMessageRateLimiter; +import netneutrality.handler.ratelimiter.MessageRateLimiterImpl; +import netneutrality.utils.JpaUtils; +import netneutrality.utils.MessageFunction; +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +public class GuildManager { + + public enum Settings { + MUSIC_ROLE("MUSIC_ROLE", ""), + MUSIC_CHANNEL("MUSIC_CHANNEL", ""), + MUSIC_VOLUME("MUSIC_VOLUME", "30"), + BLACKLIST_CHANNELS("BLACKLIST_EXCLUDE_CHANNELS", ""); + + private final String name; + private final String defaultValue; + + Settings(String name, String defaultValue) { + this.name = name; + this.defaultValue = defaultValue; + } + + public String getName() { + return name; + } + + public String getDefaultValue() { + return defaultValue; + } + } + + private static final Logger logger = LoggerFactory.getLogger(GuildManager.class); + private static final Map managers = new ConcurrentHashMap<>(); + private static final SessionFactory sessionFactory = SessionManager.getSessionFactory(); + private final Map settingsCache = new HashMap<>(); + private final Set blacklistCache = new HashSet<>(); + private final Guild guild; + private OGuild guildEntity; + private final IMessageRateLimiter rateLimiter; + + private GuildManager(Guild guild) { + this.guild = guild; + this.guildEntity = loadGuildFromDb(guild.getId()); + this.rateLimiter = new MessageRateLimiterImpl(); + + managers.put(guild.getId(), this); + reloadBlacklistCache(true); + } + + private GuildManager(String guildId) { + Guild temp = NetNeutrality.getJDA().getGuildById(guildId); + if (temp == null) + throw new IllegalArgumentException("Guild does not exist in current cache"); + + this.guild = temp; + this.guildEntity = loadGuildFromDb(guild.getId()); + this.rateLimiter = new MessageRateLimiterImpl(); + + managers.put(guild.getId(), this); + reloadBlacklistCache(true); + } + + public static GuildManager getManager(Guild guild) { + if (managers.containsKey(guild.getId())) { + return managers.get(guild.getId()); + } else { + return new GuildManager(guild); + } + } + + public static GuildManager getManager(String guildId) { + if (managers.containsKey(guildId)) { + return managers.get(guildId); + } else { + return new GuildManager(guildId); + } + } + + // Getter + public static Map getManagers() { + return managers; + } + + public boolean isLoggingEnabled() { + return guildEntity.getLogging(); + } + + public boolean isDebugEnabled() { + return guildEntity.getDebug(); + } + + public IMessageRateLimiter getRateLimiter() { + return rateLimiter; + } + + public Guild getGuild() { + return guild; + } + + public OGuild getGuildEntity() { + return guildEntity; + } + + public Set getBlacklistCache() { + return blacklistCache; + } + + public Map getSettings() { + return settingsCache; + } + + public String getSetting(Settings setting) { + String value = settingsCache.get(setting.getName()); + + if (value == null) { + setSettingValue(setting, null); + value = setting.getDefaultValue(); + } + + return value; + } + + public void setSettingValue(Settings setting, String value) { + Session session = sessionFactory.openSession(); + session.load(guildEntity, guildEntity.getGuildId()); + + if (value == null || value.isEmpty()) { + value = setting.getDefaultValue(); + } + + OGuildSetting oGuildSetting = guildEntity.getSettingByName(setting.getName()); + + session.beginTransaction(); + if (oGuildSetting == null) { + oGuildSetting = new OGuildSetting(); + oGuildSetting.setGuild(guildEntity); + oGuildSetting.setName(setting.getName()); + oGuildSetting.setValue(value); + session.save(oGuildSetting); + } else { + oGuildSetting.setValue(value); + session.update(oGuildSetting); + } + + session.getTransaction().commit(); + + reloadSettingsCache(false); + session.close(); + } + + public static boolean reloadSettingsForGuild(String guildId) { + GuildManager manager = GuildManager.getManager(guildId); + manager.reloadSettingsCache(true); + + return true; + } + + public static boolean reloadSettingsForGuild(Guild guild) { + GuildManager manager = GuildManager.getManager(guild.getId()); + manager.reloadSettingsCache(true); + + return true; + } + + public void reloadSettingsCache(boolean close) { + logger.debug("Reloading settings cache for guild: " + guild.getId()); + settingsCache.clear(); + + Session session = sessionFactory.openSession(); + JpaUtils.tryLoad(session, guildEntity, guildEntity.getGuildId()); + + Set settingSet = guildEntity.getGuildSettings(); + for (OGuildSetting setting : settingSet) { + settingsCache.put(setting.getName(), setting.getValue()); + } + + if (close) + session.close(); + } + + public void reloadBlacklistCache(boolean close) { + logger.debug("Reloading blacklist cache for guild: " + guild.getId()); + blacklistCache.clear(); + + Session session = sessionFactory.openSession(); + JpaUtils.tryLoad(session, guildEntity, guildEntity.getGuildId()); + + Set oBlacklistSet = guildEntity.getBlacklists(); + for (OBlacklist bl : oBlacklistSet) { + if (bl.getEnabled()) { + blacklistCache.add(bl.getWord()); + } + } + + if (close) + session.close(); + } + + public void checkAndLogMessage(Message message, Member member, TextChannel channel) { + if (isLoggingEnabled()) { + DBController.get("message", DBMessage.class).log(this, channel, member, message); + } + } + + public void checkBlacklist(Message message, TextChannel channel) { + MessageFunction.testMessageAgainstBlacklist(message, channel, blacklistCache); + } + + private OGuild loadGuildFromDb(String guildId) { + Session session = sessionFactory.openSession(); + OGuild entity = session.get(OGuild.class, guildId); + + if (entity == null) { + logger.debug("Guild[{}] doesn't exist in DB, creating entity..", guildId); + session.beginTransaction(); + entity = new OGuild(); + entity.setGuildId(guildId); + + session.save(entity); + session.getTransaction().commit(); + + handleJoinEvent(); + } + + session.close(); + return entity; + } + + public void handleJoinEvent() { + guild.getTextChannels() + .stream() + .filter(textChannel -> textChannel.getName().equals("debug") || textChannel.getName().equals("log")) + .forEach(textChannel -> textChannel.sendMessage("Error logging enabled on channel " + textChannel.getAsMention()).queue()); + + } + + public void reloadEntity() { + this.guildEntity = loadGuildFromDb(guild.getId()); + } + + public void removeFromDB() { + Session session = sessionFactory.openSession(); + session.beginTransaction(); + + session.delete(guildEntity); + session.getTransaction().commit(); + session.close(); + + managers.remove(guild.getId()); + } + +} diff --git a/src/main/java/netneutrality/handler/LogHandler.java b/src/main/java/netneutrality/core/LogHandler.java similarity index 89% rename from src/main/java/netneutrality/handler/LogHandler.java rename to src/main/java/netneutrality/core/LogHandler.java index aa72bc6..fee6ab4 100644 --- a/src/main/java/netneutrality/handler/LogHandler.java +++ b/src/main/java/netneutrality/core/LogHandler.java @@ -1,4 +1,4 @@ -package netneutrality.handler; +package netneutrality.core; /* * Copyright (c) anthorob * @@ -6,17 +6,15 @@ package netneutrality.handler; * https://discord.gg/CdFcyQ */ +import io.sentry.Sentry; import net.dv8tion.jda.api.entities.TextChannel; -import netneutrality.GuildManager; -import netneutrality.command.CommandContext; +import netneutrality.core.context.CommandContext; import netneutrality.exceptions.CommandErrorException; import netneutrality.exceptions.CommandExecutionException; import netneutrality.utils.MessageFunction; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.sql.SQLException; - public class LogHandler { private final static Logger logger = LoggerFactory.getLogger(LogHandler.class); @@ -27,15 +25,15 @@ public class LogHandler { * @param e The exceptions to log */ public static void log(Exception e) { - if (e instanceof CommandErrorException) { sendMessageToChannel((CommandErrorException) e); } else if (e instanceof CommandExecutionException) { + Sentry.captureException(e); + logInternally((CommandExecutionException) e); tryLogToDebugChannel((CommandExecutionException) e); - } else if (e instanceof SQLException) { - logger.error(e.getMessage(), e); } else { + Sentry.captureException(e); logger.error(e.getMessage(), e); } @@ -55,11 +53,6 @@ public class LogHandler { logger.error("Exception thrown from command [{}] in guild [{}]: {}", context.getCommand().getCommandName(), context.getGuild().getId(), error.getMessage(), error); } - private static void tryLogToAllChannels(SQLException error) { - - - } - private static void tryLogToDebugChannel(CommandExecutionException error) { CommandContext context = error.getCommandContext(); diff --git a/src/main/java/netneutrality/core/SessionManager.java b/src/main/java/netneutrality/core/SessionManager.java new file mode 100644 index 0000000..69e990d --- /dev/null +++ b/src/main/java/netneutrality/core/SessionManager.java @@ -0,0 +1,66 @@ +package netneutrality.core; +/* + * Copyright (c) anthorob + * + * https://xtremcommunity.com/ + * https://discord.gg/CdFcyQ + */ + +import io.sentry.Sentry; +import netneutrality.utils.Settings; +import org.hibernate.SessionFactory; +import org.hibernate.boot.Metadata; +import org.hibernate.boot.MetadataSources; +import org.hibernate.boot.registry.StandardServiceRegistry; +import org.hibernate.boot.registry.StandardServiceRegistryBuilder; +import org.hibernate.cfg.Environment; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.HashMap; +import java.util.Map; + +public class SessionManager { + private final static Logger logger = LoggerFactory.getLogger(SessionManager.class); + private static StandardServiceRegistry registry; + private static SessionFactory sessionFactory; + + public static SessionFactory getSessionFactory() { + if (sessionFactory == null) { + try { + StandardServiceRegistryBuilder registryBuilder = new StandardServiceRegistryBuilder().configure(); + Map settings = new HashMap<>(); + String dbName = Settings.getInstance().get("MYSQL_DATABASE", "netneutrality"); + String dbUser = Settings.getInstance().get("MYSQL_USER", "root"); + String dbPass = Settings.getInstance().get("MYSQL_PASSWORD", ""); + String dbHost = Settings.getInstance().get("MYSQL_HOST", "localhost"); + logger.info(String.format("Connecting to database '%s' at %s:3306 with user '%s'", dbName, dbHost, dbUser)); + + settings.put(Environment.URL, String.format("jdbc:mysql://%s:3306/%s", dbHost, dbName)); + settings.put(Environment.USER, dbUser); + settings.put(Environment.PASS, dbPass); + registryBuilder.applySettings(settings); + + registry = registryBuilder.build(); + MetadataSources sources = new MetadataSources(registry); + Metadata metadata = sources.getMetadataBuilder().build(); + sessionFactory = metadata.getSessionFactoryBuilder().build(); + + } catch (Exception e) { + Sentry.captureException(e); + + shutdown(); + logger.error("Error connecting to database. Shutting down..", e); + System.exit(1); + } + } + + return sessionFactory; + } + + public static void shutdown() { + if (registry != null) { + StandardServiceRegistryBuilder.destroy(registry); + } + } +} diff --git a/src/main/java/netneutrality/utils/UnsafeShutdown.java b/src/main/java/netneutrality/core/UnsafeShutdown.java similarity index 91% rename from src/main/java/netneutrality/utils/UnsafeShutdown.java rename to src/main/java/netneutrality/core/UnsafeShutdown.java index 1b2d719..9b5e016 100644 --- a/src/main/java/netneutrality/utils/UnsafeShutdown.java +++ b/src/main/java/netneutrality/core/UnsafeShutdown.java @@ -1,4 +1,4 @@ -package netneutrality.utils;/* +package netneutrality.core;/* * Copyright (c) anthorob * * https://xtremcommunity.com/ @@ -6,7 +6,13 @@ package netneutrality.utils;/* */ -import netneutrality.GuildManager; +/* + * Copyright (c) anthorob + * + * https://xtremcommunity.com/ + * https://discord.gg/CdFcyQ + */ + import netneutrality.music.MusicManager; import netneutrality.music.TrackScheduler; import org.json.JSONArray; @@ -15,7 +21,6 @@ import org.json.JSONObject; import java.io.File; import java.io.FileWriter; import java.io.IOException; -import java.nio.file.Files; import java.util.Map; public class UnsafeShutdown { diff --git a/src/main/java/netneutrality/command/CommandContext.java b/src/main/java/netneutrality/core/context/CommandContext.java similarity index 81% rename from src/main/java/netneutrality/command/CommandContext.java rename to src/main/java/netneutrality/core/context/CommandContext.java index e52b711..ce3ebff 100644 --- a/src/main/java/netneutrality/command/CommandContext.java +++ b/src/main/java/netneutrality/core/context/CommandContext.java @@ -1,4 +1,4 @@ -package netneutrality.command; +package netneutrality.core.context; /* * Copyright (c) anthorob * @@ -6,14 +6,19 @@ package netneutrality.command; * https://discord.gg/CdFcyQ */ +import io.sentry.Breadcrumb; +import io.sentry.Sentry; import net.dv8tion.jda.api.JDA; import net.dv8tion.jda.api.MessageBuilder; import net.dv8tion.jda.api.entities.*; import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent; -import netneutrality.ThreadManager; +import netneutrality.command.AbstractCommand; +import netneutrality.command.CommandUsage; +import netneutrality.core.GuildManager; +import netneutrality.core.LogHandler; import netneutrality.exceptions.CommandErrorException; import netneutrality.exceptions.CommandExecutionException; -import netneutrality.handler.LogHandler; +import netneutrality.thread.ThreadManager; import netneutrality.utils.Settings; import netneutrality.utils.UserFunction; @@ -39,6 +44,12 @@ public class CommandContext { this.channel = channel; this.user = user; this.jda = jda; + + io.sentry.protocol.User sentryUser = new io.sentry.protocol.User(); + sentryUser.setId(member.getId()); + sentryUser.setUsername(member.getEffectiveName()); + Sentry.setUser(sentryUser); + Sentry.addBreadcrumb(Breadcrumb.info("New context for message id " + message.getId())); } public static CommandContext createContext(GuildMessageReceivedEvent event) { @@ -104,6 +115,10 @@ public class CommandContext { return command; } + public GuildManager getGuildManager() { + return GuildManager.getManager(guild); + } + public void reply(CommandUsage usage) { reply(new MessageBuilder(usage.toString()).build()); } @@ -154,6 +169,15 @@ public class CommandContext { this.command = command; //TODO: Add usage check + Sentry.configureScope(scope -> { + scope.setContexts("command", command.getCommandName()); + scope.setContexts("isAdmin", UserFunction.isAdmin(member)); + scope.setContexts("canBeExecuted", command.canBeExecutedBy(guild, member)); + scope.setTag("channel", channel.getId()); + scope.setTag("message", message.getId()); + scope.setTag("guild", guild.getId()); + }); + try { if (command.needAdmin()) { if (!UserFunction.isAdmin(member)) { diff --git a/src/main/java/netneutrality/db/AbstractController.java b/src/main/java/netneutrality/db/AbstractController.java index d2c2f47..7b8deae 100644 --- a/src/main/java/netneutrality/db/AbstractController.java +++ b/src/main/java/netneutrality/db/AbstractController.java @@ -7,27 +7,25 @@ package netneutrality.db; * https://discord.gg/CdFcyQ */ +import netneutrality.core.SessionManager; +import org.hibernate.SessionFactory; + public abstract class AbstractController { - protected MysqlDatabase database; + protected SessionFactory sessionFactory; /** - * The controller name to be used in {@link DBController#get(String controller)} method + * The controller name to be used in {@link DBController#get(String controller, Class returnType)} method * * @return String */ public abstract String getControllerName(); - /** - * Returns an instance of {@link MysqlDatabase} with the database name as set in the {@link DBController} class - * - * @return {@link MysqlDatabase} - */ - protected MysqlDatabase getDatabase() { - return database; + public AbstractController() { + sessionFactory = SessionManager.getSessionFactory(); } - - protected void setDatabase(MysqlDatabase database) { - this.database = database; + + protected SessionFactory getSessionFactory() { + return sessionFactory; } } diff --git a/src/main/java/netneutrality/db/AsyncMySqlAction.java b/src/main/java/netneutrality/db/AsyncMySqlAction.java deleted file mode 100644 index 283abdb..0000000 --- a/src/main/java/netneutrality/db/AsyncMySqlAction.java +++ /dev/null @@ -1,66 +0,0 @@ -package netneutrality.db; - -/* - * Copyright (c) anthorob - * - * https://xtremcommunity.com/ - * https://discord.gg/CdFcyQ - */ - -import netneutrality.ThreadManager; -import netneutrality.db.models.MTableModel; - -import java.sql.ResultSet; -import java.util.concurrent.*; -import java.util.function.Consumer; - -public class AsyncMySqlAction { - - private final ExecutorService executor = ThreadManager.getExecutor("db-action", ThreadManager.ExecutorType.SINGLE); - private final String sqlString; - private final Object[] params; - private final MysqlDatabase.CommandType type; - private final MysqlDatabase db; - public final String tableName; - - public AsyncMySqlAction(MysqlDatabase db, String sql, Object... params) { - this.db = db; - this.sqlString = sql; - this.params = params; - this.tableName = sqlString.toUpperCase().split(" ")[1]; - - type = MysqlDatabase.CommandType.stringToType(sqlString.toUpperCase().split(" ")[0]); - } - - public void async() { - async( success -> {} ); - } - - public void async(Consumer success) { - - switch (type) { - case INSERT -> executor.submit(() -> success.accept(new MTableModel(db.insert(this.sqlString, this.params)))); - case UPDATE -> executor.submit(() -> success.accept(new MTableModel(db.update(this.sqlString, this.params)))); - case DELETE -> executor.submit(() -> success.accept(new MTableModel(db.delete(this.sqlString, this.params)))); - case SELECT -> executor.submit(() -> { - ResultSet result = db.prepareAndExecute(this.sqlString, this.params); - - success.accept(MysqlDatabase.convertToTableModel(result, tableName)); - }); - } - } - - public MTableModel blocking() { - MTableModel table; - - table = switch (type) { - case INSERT -> new MTableModel(db.insert(this.sqlString, this.params)); - case UPDATE -> new MTableModel(db.update(this.sqlString, this.params)); - case DELETE -> new MTableModel(db.delete(this.sqlString, this.params)); - case SELECT -> db.prepareAndExecute(this.sqlString, this.tableName, this.params); - }; - - return table; - } - -} diff --git a/src/main/java/netneutrality/db/DBController.java b/src/main/java/netneutrality/db/DBController.java index a2eadb9..2476b64 100644 --- a/src/main/java/netneutrality/db/DBController.java +++ b/src/main/java/netneutrality/db/DBController.java @@ -7,20 +7,17 @@ package netneutrality.db; * https://discord.gg/CdFcyQ */ -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Modifier; -import java.sql.SQLException; -import java.util.HashMap; -import java.util.Set; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; - -import netneutrality.ThreadManager; -import netneutrality.utils.Settings; +import netneutrality.core.SessionManager; +import netneutrality.thread.ThreadManager; import org.reflections.Reflections; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Modifier; +import java.util.HashMap; +import java.util.Set; + /** * When creating a controller, all database actions must be executed in another thread using an executor. One is provided in the {@link ThreadManager} class * A simple thread can't be used in this case because overlapping actions might happen and won't be executed. @@ -31,59 +28,43 @@ public class DBController { * A map that contains all the controllers currently loaded */ private final static HashMap controllers = new HashMap<>(); - private final static Logger logger = LoggerFactory.getLogger(DBController.class); - private static final MysqlDatabase database = new MysqlDatabase(Settings.getInstance().get("MYSQL_DATABASE", "netneutrality")); /** * @param controller The name of the controller as defined in the {@link AbstractController#getControllerName()}'s method * @return {@link AbstractController} The class with an AbstractController type */ - public static AbstractController get(String controller) { + @SuppressWarnings("unchecked") + public static T get(String controller, Class returnType) { + if (returnType == null) + throw new IllegalArgumentException("return type is null"); if (controllers.isEmpty()) init(); - if (database.isClosed()) - database.reconnect(); - if (controllers.containsKey(controller)) { - return controllers.get(controller); - } - - return null; - } - - public static MysqlDatabase get() { - if (database.isClosed()) { - logger.info("Reconnecting to database.."); - database.reconnect(); - } - - return database; + return (T) controllers.get(controller); + } else + throw new RuntimeException("Error getting database controller"); } public static void shutdown() { - try { - database.close(); - } catch (SQLException | NullPointerException ignored) { } + SessionManager.shutdown(); } /** - * Optional, will be called if the method {@link #get(String) get()} is used + * Optional, will be called if the method {@link #get(String, Class) get()} is used */ public static void init() { if (controllers.isEmpty()) loadControllers(); - - ((ScheduledExecutorService) ThreadManager.getExecutor("db-keepalive", ThreadManager.ExecutorType.SCHEDULED)) - .scheduleWithFixedDelay(() -> DBController.get().query("SELECT 1;"), 0, 120, TimeUnit.SECONDS); } /** * Loads all the controllers which extends {@link AbstractController} */ private static void loadControllers() { + //TODO: to delete logger.info("Loading databases controllers.."); Reflections reflections = new Reflections("netneutrality.db.controllers"); @@ -96,7 +77,6 @@ public class DBController { } AbstractController c = s.getConstructor().newInstance(); - c.setDatabase(database); if (!controllers.containsKey(c.getControllerName())) { controllers.put(c.getControllerName(), c); diff --git a/src/main/java/netneutrality/db/MysqlConnector.java b/src/main/java/netneutrality/db/MysqlConnector.java deleted file mode 100644 index f1f8ab8..0000000 --- a/src/main/java/netneutrality/db/MysqlConnector.java +++ /dev/null @@ -1,58 +0,0 @@ -package netneutrality.db; - -/* - * Copyright (c) anthorob - * - * https://xtremcommunity.com/ - * https://discord.gg/CdFcyQ - */ - -import com.mysql.cj.jdbc.MysqlDataSource; - -import java.sql.Connection; -import java.sql.SQLException; - -public class MysqlConnector { - - private final String dbName; - private final String dbUser; - private final String dbHost; - private final String dbPass; - private Connection c; - - MysqlConnector(String dbName, String dbUser, String dbHost, String dbPass) { - this.dbName = dbName; - this.dbUser = dbUser; - this.dbHost = dbHost; - this.dbPass = dbPass; - } - - /** - * Connect to a MySQL instance using the provided information - * - * @return {@link MysqlConnector} - */ - public MysqlConnector connect() throws SQLException { - MysqlDataSource dataSource = new MysqlDataSource(); - String jdbc = "jdbc:mysql://" + dbHost + ":3306/" + dbName; - - dataSource.setURL(jdbc); - dataSource.setUser(dbUser); - dataSource.setPassword(dbPass); - dataSource.setAutoReconnect(true); - dataSource.setConnectTimeout(5000); - c = dataSource.getConnection(); - - return this; - } - - /** - * Get the MySQL connection. Must call {@link #connect()} beforehand. - * - * @return {@link Connection} - */ - public Connection getConnection() { - return c; - } - -} diff --git a/src/main/java/netneutrality/db/MysqlDatabase.java b/src/main/java/netneutrality/db/MysqlDatabase.java deleted file mode 100644 index 4033f14..0000000 --- a/src/main/java/netneutrality/db/MysqlDatabase.java +++ /dev/null @@ -1,293 +0,0 @@ -package netneutrality.db; - -/* - * Copyright (c) anthorob - * - * https://xtremcommunity.com/ - * https://discord.gg/CdFcyQ - */ - -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.ResultSetMetaData; -import java.sql.SQLException; -import java.sql.Statement; -import java.sql.Timestamp; -import java.sql.Types; -import java.util.Calendar; - -import netneutrality.db.models.MRowModel; -import netneutrality.db.models.MTableModel; -import netneutrality.exceptions.UnimplementedParameterException; -import netneutrality.handler.LogHandler; -import netneutrality.utils.Settings; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class MysqlDatabase { - - private final static Logger logger = LoggerFactory.getLogger(MysqlDatabase.class); - private final static Object dmlLock = new Object(); - protected Connection connection; - private final String dbName; - - protected enum CommandType { - SELECT("SELECT"), INSERT("INSERT"), UPDATE("UPDATE"), DELETE("DELETE"); - - private final String type; - - CommandType(String type) { - this.type = type; - } - - public static CommandType stringToType(String str) { - return CommandType.valueOf(str); - } - - public String getType() { - return type; - } - } - - protected MysqlDatabase(String dbName) { - this.dbName = dbName; - String dbUser = Settings.getInstance().get("MYSQL_USER", "root"); - String dbPass = Settings.getInstance().get("MYSQL_PASSWORD", ""); - String dbHost = Settings.getInstance().get("MYSQL_HOST", "localhost"); - - try { - logger.info(String.format("Connecting to database '%1$s' at %2$s:3306 with user '%3$s'", dbName, dbHost, dbUser)); - connection = new MysqlConnector(dbName, dbUser, dbHost, dbPass).connect().getConnection(); - } catch (SQLException e) { - logger.error("Error connecting to database. Shutting down..", e); - System.exit(-1); - } - } - - /** - * Execute a simple query without any parameters. - * Example : SELECT * FROM table - * - * @param query The SQL query to execute - * @return {@link ResultSet} - */ - protected ResultSet query(String query) { - Statement stmt; - try { - stmt = connection.createStatement(); - return stmt.executeQuery(query); - } catch (SQLException e) { - LogHandler.log(e); - } - - return null; - } - - /** - * Execute an UPDATE statement with the specified parameters. - * In the SQL query, where there is a parameter to be included, you need to replace it with ? - * - * @param sql The SQL query to execute - * @param params The parameters to include in the query - */ - protected int update(String sql, Object... params) { - return executeUpdate(sql, params); - } - - /** - * Execute an INSERT statement with the specified parameters. - * In the SQL query, where there is a parameter to be included, you need to replace it with ? - * - * @param sql The SQL query to execute - * @param params The parameters to include in the query - * @return an integer of how many row were affected - */ - protected int insert(String sql, Object... params) { - return executeUpdate(sql, params); - } - - /** - * Execute a DELETE statement with the specified parameters. - * In the SQL query, where there is a parameter to be included, you need to replace it with ? - * - * @param sql The SQL query to execute - * @param params The parameters to include in the query - * @return an integer of how many row were affected - */ - protected int delete(String sql, Object... params) { - return executeUpdate(sql, params); - } - - private int executeUpdate(String sql, Object[] params) { - logger.debug("Query: " + sql); - - synchronized (dmlLock) { - try { - PreparedStatement query = connection.prepareStatement(sql); - resolveParameters(query, params); - return query.executeUpdate(); - } catch (SQLException e) { - LogHandler.log(e); - } - - return -1; - } - - } - - public boolean exists(String table, String key, String value) { - return !prepareAndExecuteAsync(String.format("SELECT 1 FROM %s WHERE %s = ?", table, key), value).blocking().isEmpty(); - } - - /** - * Execute a SELECT statement with the specified parameters. - * In the SQL query, where there is a parameter to be included, you need to replace it with ? - * - * @param sql The SQL query to execute - * @param params The parameters to include in the query - * @return a ResultSet object, which can be converted to a model using {@link MysqlDatabase#convertToTableModel(ResultSet, String)} - */ - protected ResultSet prepareAndExecute(String sql, Object... params) { - - try { - PreparedStatement query = connection.prepareStatement(sql); - resolveParameters(query, params); - return query.executeQuery(); - } catch (SQLException e) { - logger.error(e.getMessage(), e); - } - - return null; - } - - protected MTableModel prepareAndExecute(String sql, String tableName, Object... params) { - - try { - PreparedStatement query = connection.prepareStatement(sql); - resolveParameters(query, params); - return convertToTableModel(query.executeQuery(), tableName); - } catch (SQLException e) { - logger.error(e.getMessage(), e); - } - - return null; - } - - /** - * Execute a SELECT statement with the specified parameters. - * In the SQL query, where there is a parameter to be included, you need to replace it with ? - * - * @param sql The SQL query to execute - * @param params The parameters to include in the query - * @return a ResultSet object, which can be converted to a model using {@link MysqlDatabase#convertToTableModel(ResultSet, String)} - */ - public AsyncMySqlAction prepareAndExecuteAsync(String sql, Object... params) { - return new AsyncMySqlAction(this, sql, params); - } - - /** - * Insert parameters (specified with a ?) in the SQL statement - * Taken from https://github.com/Kaaz/DiscordBot/blob/master/src/main/java/emily/db/MySQLAdapter.java#resolveParameters - * - * @param query The PreparedStatement object - * @param params The parameters to be included in the prepared statement - */ - private void resolveParameters(PreparedStatement query, Object... params) throws SQLException { - int index = 1; - for (Object p : params) { - if (p instanceof String) { - query.setString(index, (String) p); - } else if (p instanceof Integer) { - query.setInt(index, (int) p); - } else if (p instanceof Boolean) { - query.setBoolean(index, (Boolean) p); - } else if (p instanceof Long) { - query.setLong(index, (Long) p); - } else if (p instanceof Double) { - query.setDouble(index, (double) p); - } else if (p instanceof java.sql.Date date) { - query.setDate(index, date); - } else if (p instanceof java.util.Date date) { - Timestamp ts = new Timestamp(date.getTime()); - query.setTimestamp(index, ts); - } else if (p instanceof Calendar cal) { - Timestamp ts = new Timestamp(cal.getTimeInMillis()); - query.setTimestamp(index, ts); - } else if (p == null) { - query.setNull(index, Types.NULL); - } else { - throw new UnimplementedParameterException(p, index); - } - index++; - } - } - - /** - * Close the MySQL connection - */ - public void close() throws SQLException { - System.out.println("Closing database..."); - connection.close(); - } - - /** - * Recreate and reconnect the MySQL connection. - */ - public void reconnect() { - String dbUser = Settings.getInstance().get("MYSQL_USER", "root"); - String dbPass = Settings.getInstance().get("MYSQL_PASSWORD", ""); - String dbHost = Settings.getInstance().get("MYSQL_HOST", "localhost"); - - try { - logger.info("Reconnecting to database..."); - connection = new MysqlConnector(dbName, dbUser, dbHost, dbPass).connect().getConnection(); - } catch (SQLException e) { - logger.error("Error connecting to database. Shutting down.."); - System.exit(0); - } - } - - /** - * Check if the database is closed. - * - * @return the connection status - */ - public boolean isClosed() { - try { - return connection.isClosed(); - } catch (SQLException e) { - return true; - } - } - - /** - * @param rs The ResultSet returned by the SELECT query - * @return a {@link MTableModel} with the appropriate column and rows - */ - protected static MTableModel convertToTableModel(ResultSet rs, String tableName) { - MTableModel table = new MTableModel(tableName); - - try { - ResultSetMetaData metadata = rs.getMetaData(); - - for (int i = 1; i < metadata.getColumnCount() + 1; i++) { - table.addColumn(metadata.getColumnName(i)); - } - - while (rs.next()) { - MRowModel row = new MRowModel(rs.getRow() - 1); - for (int i = 0; i < metadata.getColumnCount(); i++) { - row.addColumnToRow(rs.getObject(i + 1)); - } - table.addRow(row); - } - - } catch (SQLException e) { - e.printStackTrace(); - } - - return table; - } - -} diff --git a/src/main/java/netneutrality/db/controllers/DBBlacklist.java b/src/main/java/netneutrality/db/controllers/DBBlacklist.java index f5ebf0f..9f381e7 100644 --- a/src/main/java/netneutrality/db/controllers/DBBlacklist.java +++ b/src/main/java/netneutrality/db/controllers/DBBlacklist.java @@ -1,5 +1,4 @@ package netneutrality.db.controllers; - /* * Copyright (c) anthorob * @@ -7,73 +6,127 @@ package netneutrality.db.controllers; * https://discord.gg/CdFcyQ */ -import java.util.ArrayList; - +import netneutrality.core.GuildManager; +import netneutrality.core.context.CommandContext; import netneutrality.db.AbstractController; -import netneutrality.db.models.MBlacklist; -import netneutrality.db.models.MTableModel; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import netneutrality.db.entities.OBlacklist; +import netneutrality.db.entities.OGuild; +import netneutrality.utils.JpaUtils; +import org.hibernate.Session; +import org.hibernate.query.Query; + +import java.util.ArrayList; public class DBBlacklist extends AbstractController { - private final Logger logger = LoggerFactory.getLogger(DBBlacklist.class); + public void add(String word, CommandContext context) { + GuildManager guildManager = GuildManager.getManager(context.getGuild()); + Session session = getSessionFactory().openSession(); - public boolean add(MBlacklist obj) { - if (!isAlreadyBlacklisted(obj.getWord(), obj.getServerId())) { - return database.prepareAndExecuteAsync("INSERT INTO blacklist VALUES(?,?,?,?)", obj.getServerId(), obj.getWord(), obj.isEnabled(), obj.getCreatorId()).blocking().isSuccess(); + OBlacklist bl = getWordFromDb(word, context.getGuild().getId()); + + if (bl == null) { + session.beginTransaction(); + bl = new OBlacklist(); + bl.setGuild(guildManager.getGuildEntity()); + bl.setCreatorId(context.getGuildUser().getId()); + bl.setWord(word); + bl.setEnabled(true); + + session.save(bl); + session.getTransaction().commit(); + guildManager.reloadBlacklistCache(false); + context.reply(String.format("Added the word [%s] to the blacklist.", word)); + } else { + context.reply("Word is already blacklisted"); } - return false; + session.close(); + } - public boolean delete(String word, String serverId) { - if (isAlreadyBlacklisted(word, serverId)) { - return database.prepareAndExecuteAsync("DELETE FROM blacklist WHERE word = ? AND guild_id = ?", word, serverId).blocking().isSuccess(); + public void delete(String word, CommandContext context) { + GuildManager guildManager = GuildManager.getManager(context.getGuild()); + Session session = getSessionFactory().openSession(); + + OBlacklist bl = getWordFromDb(word, context.getGuild().getId()); + if (bl != null) { + session.beginTransaction(); + + session.delete(bl); + session.getTransaction().commit(); + guildManager.reloadBlacklistCache(false); + context.reply("Removed the word [%s] from the blacklist.", word); + } else { + context.reply("Can't delete word because it doesn't exist"); } - return false; + session.close(); } - public boolean enable(String word, String serverId) { - if (isAlreadyBlacklisted(word, serverId)) { - return database.prepareAndExecuteAsync("UPDATE blacklist SET enabled = 1 WHERE word = ? AND guild_id = ?", word, serverId).blocking().isSuccess(); + public void enable(String word, CommandContext context) { + GuildManager guildManager = GuildManager.getManager(context.getGuild()); + Session session = getSessionFactory().openSession(); + + OBlacklist bl = getWordFromDb(word, context.getGuild().getId()); + if (bl != null && !bl.getEnabled()) { + session.beginTransaction(); + bl.setEnabled(true); + + session.update(bl); + session.getTransaction().commit(); + guildManager.reloadBlacklistCache(false); + context.reply("Enabled the word [%s] for the blacklist.", word); + } else { + context.reply("Either word doesn't exist or is already enabled"); } - return false; + session.close(); } - public boolean disable(String word, String serverId) { - if (isAlreadyBlacklisted(word, serverId)) { - return database.prepareAndExecuteAsync("UPDATE blacklist SET enabled = 0 WHERE word = ? AND guild_id = ?", word, serverId).blocking().isSuccess(); + public void disable(String word, CommandContext context) { + GuildManager guildManager = GuildManager.getManager(context.getGuild()); + Session session = getSessionFactory().openSession(); + + OBlacklist bl = getWordFromDb(word, context.getGuild().getId()); + if (bl != null && bl.getEnabled()) { + session.beginTransaction(); + bl.setEnabled(false); + + session.update(bl); + session.getTransaction().commit(); + guildManager.reloadBlacklistCache(false); + context.reply("Disabled the word [%s] for the blacklist.", word); + } else { + context.reply("Either word doesn't exist or is already disabled"); } - return false; + session.close(); } - public ArrayList getBlacklistFromServer(String serverId) { + public ArrayList getBlacklistForGuild(CommandContext context) { + GuildManager guildManager = GuildManager.getManager(context.getGuild()); + Session session = getSessionFactory().openSession(); - MTableModel model = database.prepareAndExecuteAsync("SELECT * FROM blacklist WHERE guild_id = ? AND enabled = 1", serverId).blocking(); - ArrayList output = new ArrayList<>(); + OGuild guildEntity = guildManager.getGuildEntity(); + JpaUtils.tryLoad(session, guildEntity, guildEntity.getGuildId()); - if (model.getNbRows() > 0) { + ArrayList blacklists = new ArrayList<>(guildEntity.getBlacklists()); + session.close(); - for (int row = 0; row < model.getNbRows(); row++) { - MBlacklist bl = new MBlacklist(model.getRow(row)); - output.add(bl); - } - } - - return output; + return blacklists; } - private boolean isAlreadyBlacklisted(String word, String serverId) { - MTableModel table = database.prepareAndExecuteAsync("SELECT COUNT(*) FROM blacklist WHERE word = ? AND guild_id = ?", word, serverId).blocking(); - if (!table.isEmpty()) { - return ((int) table.getRowModel(0).getItem(0)) != 0; - } + private OBlacklist getWordFromDb(String word, String guildId) { + Session session = getSessionFactory().openSession(); - return false; + Query query = session.createNamedQuery("OBlacklist.findByWordEqualsIgnoreCaseAndGuild_GuildIdEquals", OBlacklist.class); + query.setParameter("guildId", guildId); + query.setParameter("word", word); + OBlacklist blacklist = query.uniqueResult(); + + session.close(); + return blacklist; } @Override diff --git a/src/main/java/netneutrality/db/controllers/DBGuild.java b/src/main/java/netneutrality/db/controllers/DBGuild.java deleted file mode 100644 index 5619d2b..0000000 --- a/src/main/java/netneutrality/db/controllers/DBGuild.java +++ /dev/null @@ -1,31 +0,0 @@ -package netneutrality.db.controllers; - -/* - * Copyright (c) anthorob - * - * https://xtremcommunity.com/ - * https://discord.gg/CdFcyQ - */ - -import net.dv8tion.jda.api.entities.Guild; -import netneutrality.db.AbstractController; - -public class DBGuild extends AbstractController { - - public void insertGuildInDB(Guild g) { - if (!database.exists("guilds", "guild_id", g.getId())) { - database.prepareAndExecuteAsync("INSERT INTO guilds VALUES(?, ?, ?, ?)", g.getId(), "0", null, null).blocking(); - } - } - - public void removeGuildInDB(Guild g) { - if (database.exists("guilds", "guild_id", g.getId())) { - database.prepareAndExecuteAsync("DELETE FROM guilds WHERE guild_id = ?", g.getId()).blocking(); - } - } - - @Override - public String getControllerName() { - return "guild"; - } -} diff --git a/src/main/java/netneutrality/db/controllers/DBLogging.java b/src/main/java/netneutrality/db/controllers/DBLogging.java deleted file mode 100644 index bb2b93d..0000000 --- a/src/main/java/netneutrality/db/controllers/DBLogging.java +++ /dev/null @@ -1,33 +0,0 @@ -package netneutrality.db.controllers; - -/* - * Copyright (c) anthorob - * - * https://xtremcommunity.com/ - * https://discord.gg/CdFcyQ - */ - -import netneutrality.db.AbstractController; -import netneutrality.db.models.MTableModel; - -public class DBLogging extends AbstractController { - - public void setupLog(String serverId, String channelId) { - database.prepareAndExecuteAsync("INSERT INTO logging VALUES(?,?,?)", serverId, channelId, true).blocking(); - } - - public void toggleLog(String serverId, String channelId) { - database.prepareAndExecuteAsync("UPDATE logging SET enabled = NOT enabled WHERE guild_id = ? AND channelId = ?", serverId, channelId).blocking(); - } - - public boolean isLoggingEnabled(String serverId, String channelId) { - MTableModel table = database.prepareAndExecuteAsync("SELECT enabled FROM logging WHERE guild_id = ? AND channelId = ?", serverId, channelId).blocking(); - - return (Boolean) table.getRow(0).get(0); - } - - @Override - public String getControllerName() { - return "logging"; - } -} diff --git a/src/main/java/netneutrality/db/controllers/DBMessage.java b/src/main/java/netneutrality/db/controllers/DBMessage.java index 5690d6f..3978b45 100644 --- a/src/main/java/netneutrality/db/controllers/DBMessage.java +++ b/src/main/java/netneutrality/db/controllers/DBMessage.java @@ -7,74 +7,94 @@ package netneutrality.db.controllers; * https://discord.gg/CdFcyQ */ -import java.util.ArrayList; -import java.util.Date; - -import net.dv8tion.jda.api.entities.*; +import net.dv8tion.jda.api.entities.Member; +import net.dv8tion.jda.api.entities.Message; +import net.dv8tion.jda.api.entities.TextChannel; +import netneutrality.core.GuildManager; import netneutrality.db.AbstractController; -import netneutrality.db.DBController; -import netneutrality.db.MysqlDatabase; -import netneutrality.db.models.MMessage; -import netneutrality.db.models.MTableModel; - +import netneutrality.db.entities.OLogMessage; +import org.hibernate.Session; +import org.hibernate.query.Query; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.List; + public class DBMessage extends AbstractController { private final static Logger logger = LoggerFactory.getLogger(DBMessage.class); - /** - * Returns an instance of {@link MysqlDatabase} with the database name as set in the {@link DBController} class - * - * @return {@link MysqlDatabase} - */ - public MysqlDatabase getDatabase() { - return database; - } + public void log(GuildManager guildManager, TextChannel channel, Member author, Message message) { + Session session = getSessionFactory().openSession(); + session.beginTransaction(); - public void log(Guild guild, TextChannel channel, Member author, Message message) { - String guildId = guild.getId(); - String channelId = channel.getId(); - String authorId = author.getId(); - Date dateSent = new Date(message.getTimeCreated().toInstant().toEpochMilli()); - String messageId = message.getId(); - String msg = message.getContentRaw().trim(); + OLogMessage logMessage = new OLogMessage(); + logMessage.setGuild(guildManager.getGuildEntity()); + logMessage.setMessageId(message.getId()); + logMessage.setMessage(message.getContentRaw().trim()); + logMessage.setChannelId(channel.getId()); + logMessage.setUserId(author.getId()); + logMessage.setDateSent(message.getTimeCreated().toInstant()); - database.prepareAndExecuteAsync("INSERT INTO log_message VALUES(?,?,?,?,?,?,?)", guildId, channelId, authorId, dateSent, messageId, msg, null).blocking(); + session.save(logMessage); + session.getTransaction().commit(); + session.close(); } public void logEdit(String messageId, String newMessage) { - database.prepareAndExecuteAsync("UPDATE log_message SET edited_message = ? WHERE message_id = ?", newMessage, messageId).blocking(); + Session session = getSessionFactory().openSession(); + Query query = session.createNamedQuery("OLogMessage.findByMessageIdEquals", OLogMessage.class); + query.setParameter("messageId", messageId); - } + OLogMessage message = query.uniqueResult(); + if (message != null) { + session.beginTransaction(); + message.setEditedMessage(newMessage); - public MMessage getMessage(String messageId) { - MTableModel table = database.prepareAndExecuteAsync("SELECT * FROM log_message WHERE message_id = ?", messageId).blocking(); - if (table.getNbRows() > 0) { - return new MMessage(table.getRowModel(0)); + session.update(message); + session.getTransaction().commit(); } - return null; + session.close(); } - public ArrayList getMessagesFromUser(String username, String serverName, int max) { - ArrayList messages = new ArrayList<>(); + public OLogMessage getMessage(String messageId) { + Session session = getSessionFactory().openSession(); + Query query = session.createNamedQuery("OLogMessage.findByMessageIdEquals", OLogMessage.class); + query.setParameter("messageId", messageId); - MTableModel table = database.prepareAndExecuteAsync("SELECT * FROM log_message WHERE user_id = ? AND guild_id = ? ORDER BY date_sent DESC LIMIT ?", username, serverName, max).blocking(); - if (table.getNbRows() > 0) { - for (int row = 0; row < max; row++) { - messages.add(new MMessage(table.getRowModel(row))); - } - } + OLogMessage message = query.uniqueResult(); + session.close(); + + return message; + } + + public List getMessagesFromUser(String userId, String guildId, int max) { + Session session = getSessionFactory().openSession(); + Query query = session.createNamedQuery("OLogMessage.findByUserIdEquals", OLogMessage.class); + query.setParameter("guildId", guildId); + query.setParameter("userId", userId); + query.setMaxResults(max); + + List messages = query.getResultList(); + session.close(); return messages; } public String getMessageString(String messageId) { - MTableModel table = database.prepareAndExecuteAsync("SELECT message FROM log_message WHERE message_id = ?", messageId).blocking(); + Session session = getSessionFactory().openSession(); + Query query = session.createNamedQuery("OLogMessage.findByMessageIdEquals", OLogMessage.class); + query.setParameter("messageId", messageId); + + OLogMessage message = query.uniqueResult(); + session.close(); + + if (message == null) + return null; + else + return message.getMessage(); - return (String) table.getRowModel(0).getItem(0); } diff --git a/src/main/java/netneutrality/db/entities/AbstractEntity.java b/src/main/java/netneutrality/db/entities/AbstractEntity.java deleted file mode 100644 index 37ea1df..0000000 --- a/src/main/java/netneutrality/db/entities/AbstractEntity.java +++ /dev/null @@ -1,54 +0,0 @@ -package netneutrality.db.entities; - -/* - * Copyright (c) anthorob - * - * https://xtremcommunity.com/ - * https://discord.gg/CdFcyQ - */ - -import netneutrality.db.DBController; -import netneutrality.db.models.MTableModel; -import netneutrality.handler.LogHandler; - -public abstract class AbstractEntity implements EntityInterface { - private final String primaryKey; - private final String[] primaryKeys; - protected MTableModel table; - - - public AbstractEntity(String primaryKey, String... primaryKeys) throws ArrayIndexOutOfBoundsException { - this.primaryKey = primaryKey; - this.primaryKeys = primaryKeys; - - fillTableModel(); - - try { - if (!table.isEmpty()) - convertFromTableModel(table); - } catch (NullPointerException e) { - LogHandler.log("Table structure does not match expected variables", e); - } - } - - private void fillTableModel() throws ArrayIndexOutOfBoundsException { - StringBuilder whereClause = new StringBuilder(); - for (String pk : getPrimaryKeys()) { - whereClause.append(pk).append(" = ?"); - - //TODO: Fix last and - if (getPrimaryKeys().length > 1) - whereClause.append(" AND "); - } - - String sql = "SELECT * FROM " + getTableName() + " WHERE " + whereClause; - // MusicBot.logger.debug(sql + " - pk: " + primaryKey); - - if (this.primaryKeys.length > 0) - this.table = DBController.get().prepareAndExecuteAsync(sql, this.primaryKey, this.primaryKeys).blocking(); - else - this.table = DBController.get().prepareAndExecuteAsync(sql, this.primaryKey).blocking(); - - } - -} diff --git a/src/main/java/netneutrality/db/entities/EntityInterface.java b/src/main/java/netneutrality/db/entities/EntityInterface.java deleted file mode 100644 index 5f55490..0000000 --- a/src/main/java/netneutrality/db/entities/EntityInterface.java +++ /dev/null @@ -1,21 +0,0 @@ -package netneutrality.db.entities; - -/* - * Copyright (c) anthorob - * - * https://xtremcommunity.com/ - * https://discord.gg/CdFcyQ - */ - -import netneutrality.db.models.MTableModel; - -public interface EntityInterface { - - String getTableName(); - String[] getPrimaryKeys(); - boolean exists(); - - - void convertFromTableModel(MTableModel table); - -} diff --git a/src/main/java/netneutrality/db/entities/OBlacklist.java b/src/main/java/netneutrality/db/entities/OBlacklist.java new file mode 100644 index 0000000..36c4715 --- /dev/null +++ b/src/main/java/netneutrality/db/entities/OBlacklist.java @@ -0,0 +1,75 @@ +package netneutrality.db.entities; + +/* + * Copyright (c) anthorob + * + * https://xtremcommunity.com/ + * https://discord.gg/CdFcyQ + */ + +import javax.persistence.*; + +@Entity +@Table(name = "blacklist") +@NamedQueries({ + @NamedQuery(name = "OBlacklist.findByWordEqualsIgnoreCaseAndGuild_GuildIdEquals", query = "select o from OBlacklist o where upper(o.word) = upper(:word) and o.guild.guildId = :guildId") +}) +public class OBlacklist { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id", nullable = false) + private Integer id; + + @Column(name = "word", nullable = false) + private String word; + + @Column(name = "enabled", nullable = false) + private Boolean enabled = false; + + @Column(name = "creator_id", nullable = false) + private String creatorId; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn(name = "guild_id", nullable = false) + private OGuild guild; + + public OGuild getGuild() { + return guild; + } + + public void setGuild(OGuild guild) { + this.guild = guild; + } + + public String getCreatorId() { + return creatorId; + } + + public void setCreatorId(String creatorId) { + this.creatorId = creatorId; + } + + public Boolean getEnabled() { + return enabled; + } + + public void setEnabled(Boolean enabled) { + this.enabled = enabled; + } + + public String getWord() { + return word; + } + + public void setWord(String word) { + this.word = word; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } +} \ No newline at end of file diff --git a/src/main/java/netneutrality/db/entities/OGuild.java b/src/main/java/netneutrality/db/entities/OGuild.java index 928b922..c7d4659 100644 --- a/src/main/java/netneutrality/db/entities/OGuild.java +++ b/src/main/java/netneutrality/db/entities/OGuild.java @@ -7,72 +7,112 @@ package netneutrality.db.entities; * https://discord.gg/CdFcyQ */ +import javax.persistence.*; +import java.util.LinkedHashSet; +import java.util.Optional; +import java.util.Set; -import netneutrality.GuildManager; -import netneutrality.db.models.MTableModel; +@Entity +@Table(name = "guilds") +public class OGuild { -public class OGuild extends AbstractEntity { + @Id + @Column(name = "guild_id", nullable = false) + private String guildId; - private String guildID; - private boolean logging; - private boolean debug; - private String logchannel; + @Column(name = "logging", nullable = false) + private Boolean logging = false; - private OGuildSetting settings; + @Column(name = "debug", nullable = false) + private Boolean debug = true; - public OGuild(String guildId) { - super(guildId); + @Column(name = "log_channel") + private String logChannel; - this.settings = new OGuildSetting(this); + @OneToMany(mappedBy = "guild") + private Set guildSettings = new LinkedHashSet<>(); + + @OneToMany(mappedBy = "guild") + private Set blacklists = new LinkedHashSet<>(); + + @OneToMany(mappedBy = "guild") + private Set logMessages = new LinkedHashSet<>(); + + @OneToMany(mappedBy = "guild") + private Set OLoggings = new LinkedHashSet<>(); + + public Set getLoggings() { + return OLoggings; } - public boolean isLogging() { + public void setLoggings(Set OLoggings) { + this.OLoggings = OLoggings; + } + + public Set getLogMessages() { + return logMessages; + } + + public void setLogMessages(Set logMessages) { + this.logMessages = logMessages; + } + + public Set getBlacklists() { + return blacklists; + } + + public void setBlacklists(Set blacklists) { + this.blacklists = blacklists; + } + + public Set getGuildSettings() { + return guildSettings; + } + + public void setGuildSettings(Set guildSettings) { + this.guildSettings = guildSettings; + } + + public String getLogChannel() { + return logChannel; + } + + public void setLogChannel(String logChannel) { + this.logChannel = logChannel; + } + + public Boolean getLogging() { return logging; } - public boolean isDebug() { + public void setLogging(Boolean logging) { + this.logging = logging; + } + + public Boolean getDebug() { return debug; } - public String getLogchannel() { - return logchannel; - } - - public void reloadSettings() { - GuildManager.logger.debug("Reloading settings for guild: " + guildID); - this.settings = new OGuildSetting(this); - } - - public String getGuildID() { - return guildID; - } - - public OGuildSetting getSettings() { - return settings; - } - - @Override - public boolean exists() { - return guildID != null; - } - - @Override - public String getTableName() { - return "guilds"; - } - - @Override - public String[] getPrimaryKeys() { - return new String[] {"guild_id"}; + public void setDebug(Boolean debug) { + this.debug = debug; } - @Override - public void convertFromTableModel(MTableModel table) { - this.guildID = (String) table.getRow(0).get(0); - this.logging = ((Integer) table.getRow(0).get(1)) == 1; - this.debug = ((Boolean) table.getRow(0).get(2)); - this.logchannel = (String) table.getRow(0).get(3); - + public String getGuildId() { + return guildId; } -} + + public void setGuildId(String guildId) { + this.guildId = guildId; + } + + public OGuildSetting getSettingByName(String name) { + Optional setting = getGuildSettings() + .stream() + .filter(setting1 -> setting1.getName().equalsIgnoreCase(name)) + .findFirst(); + + return setting.orElse(null); + } + +} \ No newline at end of file diff --git a/src/main/java/netneutrality/db/entities/OGuildSetting.java b/src/main/java/netneutrality/db/entities/OGuildSetting.java index 1888fc2..b2704ca 100644 --- a/src/main/java/netneutrality/db/entities/OGuildSetting.java +++ b/src/main/java/netneutrality/db/entities/OGuildSetting.java @@ -1,73 +1,65 @@ -package netneutrality.db.entities;/* +package netneutrality.db.entities; + +/* * Copyright (c) anthorob * * https://xtremcommunity.com/ * https://discord.gg/CdFcyQ */ -import netneutrality.GuildManager; -import netneutrality.db.models.MRowModel; -import netneutrality.db.models.MTableModel; +import javax.persistence.*; -import java.util.*; +@Entity +@Table(name = "guild_settings") +@NamedQueries({ + @NamedQuery(name = "settings_findByName", query = "select o from OGuildSetting o where o.guild.id = :id and upper(o.name) = upper(:name)") +}) +public class OGuildSetting { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id", nullable = false) + private Integer id; -public class OGuildSetting extends AbstractEntity { - private final OGuild guild; - private Map settings; + @Column(name = "name", nullable = false) + private String name; - public OGuildSetting(OGuild OGuild) { - super(OGuild.getGuildID()); + @Lob + @Column(name = "value", nullable = false) + private String value; - this.guild = OGuild; - } + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn(name = "guild_id", nullable = false) + private OGuild guild; public OGuild getGuild() { return guild; } - public Map getSettings() { - return settings; + public void setGuild(OGuild guild) { + this.guild = guild; } - public Object getSettingByKey(GuildManager.GuildSetting key) { - if (settings.containsKey(key.getName())) { - return settings.get(key.getName()); - } - - return key.getDefaultValue(); + public String getValue() { + return value; } - @Override - public String getTableName() { - return "guild_settings"; + public void setValue(String value) { + this.value = value; } - @Override - public String[] getPrimaryKeys() { - return new String[] {"guild_id"}; + public String getName() { + return name; } - @Override - public boolean exists() { - return !settings.isEmpty(); + public void setName(String name) { + this.name = name; } - @Override - public void convertFromTableModel(MTableModel table) { - settings = new HashMap<>(); - - List columns = table.getColumns(); - MRowModel row = table.getRowModel(0); - - for (int i = 0; i < columns.size(); i++) { - if (i == 0) continue; - - String key = columns.get(i).toUpperCase(); - Object value = row.getItem(i); - - settings.put(key, value); - } - - + public Integer getId() { + return id; } -} + + public void setId(Integer id) { + this.id = id; + } +} \ No newline at end of file diff --git a/src/main/java/netneutrality/db/entities/OLogMessage.java b/src/main/java/netneutrality/db/entities/OLogMessage.java new file mode 100644 index 0000000..cc5ccee --- /dev/null +++ b/src/main/java/netneutrality/db/entities/OLogMessage.java @@ -0,0 +1,111 @@ +package netneutrality.db.entities; + +/* + * Copyright (c) anthorob + * + * https://xtremcommunity.com/ + * https://discord.gg/CdFcyQ + */ + +import javax.persistence.*; +import java.time.Instant; + +@Entity +@Table(name = "log_message") +@NamedQueries({ + @NamedQuery(name = "OLogMessage.findByMessageIdEquals", query = "select o from OLogMessage o where o.messageId = :messageId"), + @NamedQuery(name = "OLogMessage.findByGuild_GuildIdEqualsAndUserIdEquals", query = "select o from OLogMessage o where o.guild.guildId = :guildId and o.userId = :userId") +}) +public class OLogMessage { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id", nullable = false) + private Integer id; + + @Column(name = "channel_id", nullable = false) + private String channelId; + + @Column(name = "message_id", nullable = false) + private String messageId; + + @Column(name = "user_id", nullable = false) + private String userId; + + @Convert(disableConversion = true) + @Column(name = "date_sent", nullable = false) + private Instant dateSent; + + @Column(name = "message", length = 2000) + private String message; + + @Column(name = "edited_message", length = 2000) + private String editedMessage; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn(name = "guild_id", nullable = false) + private OGuild guild; + + public OGuild getGuild() { + return guild; + } + + public void setGuild(OGuild guild) { + this.guild = guild; + } + + public String getEditedMessage() { + return editedMessage; + } + + public void setEditedMessage(String editedMessage) { + this.editedMessage = editedMessage; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Instant getDateSent() { + return dateSent; + } + + public void setDateSent(Instant dateSent) { + this.dateSent = dateSent; + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getMessageId() { + return messageId; + } + + public void setMessageId(String messageId) { + this.messageId = messageId; + } + + public String getChannelId() { + return channelId; + } + + public void setChannelId(String channelId) { + this.channelId = channelId; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } +} \ No newline at end of file diff --git a/src/main/java/netneutrality/db/entities/OLogging.java b/src/main/java/netneutrality/db/entities/OLogging.java new file mode 100644 index 0000000..ed1b470 --- /dev/null +++ b/src/main/java/netneutrality/db/entities/OLogging.java @@ -0,0 +1,49 @@ +package netneutrality.db.entities; + +/* + * Copyright (c) anthorob + * + * https://xtremcommunity.com/ + * https://discord.gg/CdFcyQ + */ + +import javax.persistence.*; + +@Entity +@Table(name = "logging") +public class OLogging { + @EmbeddedId + private OLoggingId id; + + @MapsId("guildId") + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn(name = "guild_id", nullable = false) + private OGuild guild; + + @Column(name = "enabled", nullable = false) + private Boolean enabled = false; + + public Boolean getEnabled() { + return enabled; + } + + public void setEnabled(Boolean enabled) { + this.enabled = enabled; + } + + public OGuild getGuild() { + return guild; + } + + public void setGuild(OGuild guild) { + this.guild = guild; + } + + public OLoggingId getId() { + return id; + } + + public void setId(OLoggingId id) { + this.id = id; + } +} \ No newline at end of file diff --git a/src/main/java/netneutrality/db/entities/OLoggingId.java b/src/main/java/netneutrality/db/entities/OLoggingId.java new file mode 100644 index 0000000..d3eafa2 --- /dev/null +++ b/src/main/java/netneutrality/db/entities/OLoggingId.java @@ -0,0 +1,56 @@ +package netneutrality.db.entities; + +/* + * Copyright (c) anthorob + * + * https://xtremcommunity.com/ + * https://discord.gg/CdFcyQ + */ + +import org.hibernate.Hibernate; + +import javax.persistence.Column; +import javax.persistence.Embeddable; +import java.io.Serial; +import java.io.Serializable; +import java.util.Objects; + +@Embeddable +public class OLoggingId implements Serializable { + @Serial + private static final long serialVersionUID = 8216581265618800768L; + @Column(name = "guild_id", nullable = false) + private String guildId; + @Column(name = "channel_id", nullable = false) + private String channelId; + + public String getChannelId() { + return channelId; + } + + public void setChannelId(String channelId) { + this.channelId = channelId; + } + + public String getGuildId() { + return guildId; + } + + public void setGuildId(String guildId) { + this.guildId = guildId; + } + + @Override + public int hashCode() { + return Objects.hash(guildId, channelId); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || Hibernate.getClass(this) != Hibernate.getClass(o)) return false; + OLoggingId entity = (OLoggingId) o; + return Objects.equals(this.guildId, entity.guildId) && + Objects.equals(this.channelId, entity.channelId); + } +} \ No newline at end of file diff --git a/src/main/java/netneutrality/db/entities/OPermission.java b/src/main/java/netneutrality/db/entities/OPermission.java deleted file mode 100644 index 761dc5f..0000000 --- a/src/main/java/netneutrality/db/entities/OPermission.java +++ /dev/null @@ -1,66 +0,0 @@ -package netneutrality.db.entities; - -/* - * Copyright (c) anthorob - * - * https://xtremcommunity.com/ - * https://discord.gg/CdFcyQ - */ - -import netneutrality.command.CommandType; -import netneutrality.db.models.MTableModel; - -public class OPermission extends AbstractEntity { - private final String guild_id; - private final String role_id; - public CommandType type; - public String command; - - public OPermission(String guild_id, String role_id) { - super(guild_id, role_id); - - this.guild_id = guild_id; - this.role_id = role_id; - } - - @Override - public boolean exists() { - return guild_id != null && role_id != null; - } - - public String getGuildId() { - return guild_id; - } - - public String getRoleId() { - return role_id; - } - - public CommandType getType() { - return type; - } - - public String getCommand() { - return command; - } - - - @Override - public String getTableName() { - return "permissions"; - } - - @Override - public String[] getPrimaryKeys() { - return new String[] {"guild_id", "role_id"}; - } - - - @Override - public void convertFromTableModel(MTableModel table) { - - this.type = (CommandType) table.getRow(0).get(2); - this.command = (String) table.getRow(0).get(3); - - } -} diff --git a/src/main/java/netneutrality/db/models/MSellyOrder.java b/src/main/java/netneutrality/db/entities/OSellyOrder.java similarity index 95% rename from src/main/java/netneutrality/db/models/MSellyOrder.java rename to src/main/java/netneutrality/db/entities/OSellyOrder.java index 75ea0c8..9c15182 100644 --- a/src/main/java/netneutrality/db/models/MSellyOrder.java +++ b/src/main/java/netneutrality/db/entities/OSellyOrder.java @@ -1,4 +1,4 @@ -package netneutrality.db.models; +package netneutrality.db.entities; /* * Copyright (c) anthorob @@ -7,7 +7,7 @@ package netneutrality.db.models; * https://discord.gg/CdFcyQ */ -public class MSellyOrder { +public class OSellyOrder { private final String id; private final String productId; @@ -23,7 +23,7 @@ public class MSellyOrder { private final float usdValue; private final String createdAt; - public MSellyOrder(String id, String productId, String email, String ip, float value, String currency, String gateway, int risk, int status, int cryptoValue, String cryptoAddress, float usdValue, String createdAt) { + public OSellyOrder(String id, String productId, String email, String ip, float value, String currency, String gateway, int risk, int status, int cryptoValue, String cryptoAddress, float usdValue, String createdAt) { this.id = id; this.productId = productId; this.email = email; diff --git a/src/main/java/netneutrality/db/models/MBlacklist.java b/src/main/java/netneutrality/db/models/MBlacklist.java deleted file mode 100644 index 1457dc4..0000000 --- a/src/main/java/netneutrality/db/models/MBlacklist.java +++ /dev/null @@ -1,59 +0,0 @@ -package netneutrality.db.models; - -/* - * Copyright (c) anthorob - * - * https://xtremcommunity.com/ - * https://discord.gg/CdFcyQ - */ - -import java.util.List; - -public class MBlacklist { - - private final String word; - private final boolean enabled; - private final String creatorId; - private final String serverId; - - public MBlacklist(String word, boolean enabled, String creatorId, String serverId) { - this.word = word; - this.enabled = enabled; - this.creatorId = creatorId; - this.serverId = serverId; - } - - public MBlacklist(List row) { - this.word = (String) row.get(1); - this.enabled = (Boolean) row.get(2); - this.creatorId = (String) row.get(3); - this.serverId = (String) row.get(0); - } - - /** - * @return String The blacklisted word - */ - public String getWord() { - return word; - } - - public boolean isEnabled() { - return enabled; - } - - public String getCreatorId() { - return creatorId; - } - - public String getServerId() { - return serverId; - } - - @Override - public String toString() { - return "[word=" + word + ", enabled=" + enabled + "]"; - } - - - -} diff --git a/src/main/java/netneutrality/db/models/MMessage.java b/src/main/java/netneutrality/db/models/MMessage.java deleted file mode 100644 index 6684480..0000000 --- a/src/main/java/netneutrality/db/models/MMessage.java +++ /dev/null @@ -1,66 +0,0 @@ -package netneutrality.db.models; - -/* - * Copyright (c) anthorob - * - * https://xtremcommunity.com/ - * https://discord.gg/CdFcyQ - */ - -public class MMessage { - - private final String serverId; - private final String channelName; - private final String sender; - private final String dateSent; - private final String messageId; - private final String message; - private final String editedMessage; - - public MMessage(MRowModel row) { - this.serverId = (String) row.getItem(0); - this.channelName = (String) row.getItem(1); - this.sender = (String) row.getItem(2); - this.dateSent = (String) row.getItem(3); - this.messageId = (String) row.getItem(4); - this.message = (String) row.getItem(5); - this.editedMessage = ""; - } - - public String getServerId() { - return serverId; - } - - public String getChannelName() { - return channelName; - } - - public String getSender() { - return sender; - } - - public String getDateSent() { - return dateSent; - } - - public String getMessageId() { - return messageId; - } - - public String getMessage() { - return message; - } - - public String getEditedMessage() { - return editedMessage; - } - - @Override - public String toString() { - return "MMessage [serverName=" + serverId + ", channelName=" + channelName + ", sender=" + sender - + ", dateSent=" + dateSent + ", messageId=" + messageId + ", message=" + message + ", editedMessage=" - + editedMessage + "]"; - } - - -} diff --git a/src/main/java/netneutrality/db/models/MRowModel.java b/src/main/java/netneutrality/db/models/MRowModel.java deleted file mode 100644 index 69fff35..0000000 --- a/src/main/java/netneutrality/db/models/MRowModel.java +++ /dev/null @@ -1,80 +0,0 @@ -package netneutrality.db.models; - -/* - * Copyright (c) anthorob - * - * https://xtremcommunity.com/ - * https://discord.gg/CdFcyQ - */ - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -public class MRowModel { - private final ArrayList row; - private int rowIndex; - - public MRowModel() { - row = new ArrayList<>(); - } - - public MRowModel(Integer rowIndex) { - row = new ArrayList<>(); - this.rowIndex = rowIndex; - } - - public MRowModel(Object... objs) { - row = new ArrayList<>(); - row.addAll(Arrays.asList(objs)); - } - - public int getRowIndex() { - return rowIndex; - } - - /** - * Add an item to the row. No checks are made to match the table itself - * @param obj Object to add to the row - */ - public void addColumnToRow(Object obj) { - row.add(obj); - } - - /** - * Get a list of all objects in the row. - * @return List of objects - */ - public List getRow() { - return row; - } - - /** - *
-     * Get an item at the specified index.
-     *
-     * Example:
-     * SQL:   SELECT first,    second,    third
-     * Index:        0         1          2
-     * 
- * - * @param index Index - * @return The object - */ - public Object getItem(int index) { - try { - return row.get(index); - } catch (Exception e) { - return null; - } - } - - public int count() { - return row.size(); - } - - @Override - public String toString() { - return row.toString(); - } -} diff --git a/src/main/java/netneutrality/db/models/MRowsModel.java b/src/main/java/netneutrality/db/models/MRowsModel.java deleted file mode 100644 index e9fd3e8..0000000 --- a/src/main/java/netneutrality/db/models/MRowsModel.java +++ /dev/null @@ -1,47 +0,0 @@ -package netneutrality.db.models; - -/* - * Copyright (c) anthorob - * - * https://xtremcommunity.com/ - * https://discord.gg/CdFcyQ - */ - -import java.util.ArrayList; - -public class MRowsModel { - private final ArrayList rows; - private String[] primaryKeys; - - public MRowsModel() { - rows = new ArrayList<>(); - } - - public void addRow(MRowModel row) { - rows.add(row); - } - - public MRowModel getRowModel(int index) { - if (!rows.isEmpty()) - return rows.get(index); - - return null; - } - - public int size() { - return rows.size(); - } - - public void addColumnInRow(int index, Object obj) { - rows.get(index).addColumnToRow(obj); - } - - public ArrayList getRows() { - return rows; - } - - @Override - public String toString() { - return rows.toString(); - } -} diff --git a/src/main/java/netneutrality/db/models/MSellyProduct.java b/src/main/java/netneutrality/db/models/MSellyProduct.java deleted file mode 100644 index 9ffddfa..0000000 --- a/src/main/java/netneutrality/db/models/MSellyProduct.java +++ /dev/null @@ -1,19 +0,0 @@ -package netneutrality.db.models; - -/* - * Copyright (c) anthorob - * - * https://xtremcommunity.com/ - * https://discord.gg/CdFcyQ - */ - -public class MSellyProduct { - - private String id; - private String title; - private String description; - private String stock; - private float price; - private String currency; - private boolean isPrivate; -} diff --git a/src/main/java/netneutrality/db/models/MTableModel.java b/src/main/java/netneutrality/db/models/MTableModel.java deleted file mode 100644 index 420f275..0000000 --- a/src/main/java/netneutrality/db/models/MTableModel.java +++ /dev/null @@ -1,118 +0,0 @@ -package netneutrality.db.models; - -/* - * Copyright (c) anthorob - * - * https://xtremcommunity.com/ - * https://discord.gg/CdFcyQ - */ - -import java.util.Collections; -import java.util.LinkedList; -import java.util.List; - -public class MTableModel { - private final boolean emptyResult; - private final boolean success; - private final String name; - private final List column; - private final MRowsModel rows; - - public MTableModel() { - this.emptyResult = true; - this.success = false; - this.name = null; - this.column = new LinkedList<>(); - this.rows = new MRowsModel(); - } - - public MTableModel(int success) { - this.emptyResult = true; - this.success = success > 0; - this.name = null; - this.column = new LinkedList<>(); - this.rows = new MRowsModel(); - } - - public MTableModel(String tableName) { - this.emptyResult = false; - this.success = true; - this.name = tableName; - this.column = new LinkedList<>(); - this.rows = new MRowsModel(); - } - - public MTableModel(String... columns) { - this.emptyResult = false; - this.success = true; - this.name = null; - this.column = new LinkedList<>(); - this.rows = new MRowsModel(); - - Collections.addAll(column, columns); - } - - public boolean isEmptyResult() { - return emptyResult; - } - - public boolean isSuccess() { - return success; - } - - public String getName() { - return name; - } - - public void addColumn(String name) { - column.add(name); - } - - public void addRow(MRowModel row) { - rows.addRow(row); - } - - public MRowsModel getRows() { - return rows; - } - - public List getRow(int index) { - if (getNbRows() != 0) - return rows.getRowModel(index).getRow(); - - return null; - } - - /** - * Represent a row in a table - * - * @param rowIndex The index of the row - * @return A row model - */ - public MRowModel getRowModel(int rowIndex) { - if (getNbRows() != 0) - return rows.getRowModel(rowIndex); - - return new MRowModel(); - } - - public List getColumns() { - return column; - } - - public boolean isEmpty() { - return rows.getRows().isEmpty(); - } - - public int getNbRows() { - return rows.getRows().size(); - } - - @Override - public String toString() { - return "Column: " + column + ", Rows (" + getNbRows() + "): " + rows; - } - - - -} diff --git a/src/main/java/netneutrality/exceptions/CommandErrorException.java b/src/main/java/netneutrality/exceptions/CommandErrorException.java index fe519f9..0802ea2 100644 --- a/src/main/java/netneutrality/exceptions/CommandErrorException.java +++ b/src/main/java/netneutrality/exceptions/CommandErrorException.java @@ -7,7 +7,7 @@ package netneutrality.exceptions; * https://discord.gg/CdFcyQ */ -import netneutrality.command.CommandContext; +import netneutrality.core.context.CommandContext; /** * Used to reply with a message in the text channel where the command was executed diff --git a/src/main/java/netneutrality/exceptions/CommandException.java b/src/main/java/netneutrality/exceptions/CommandException.java index 5a98a85..e058aad 100644 --- a/src/main/java/netneutrality/exceptions/CommandException.java +++ b/src/main/java/netneutrality/exceptions/CommandException.java @@ -7,7 +7,7 @@ package netneutrality.exceptions; * https://discord.gg/CdFcyQ */ -import netneutrality.command.CommandContext; +import netneutrality.core.context.CommandContext; public abstract class CommandException extends RuntimeException { diff --git a/src/main/java/netneutrality/exceptions/CommandExecutionException.java b/src/main/java/netneutrality/exceptions/CommandExecutionException.java index 14ba2ba..4a65787 100644 --- a/src/main/java/netneutrality/exceptions/CommandExecutionException.java +++ b/src/main/java/netneutrality/exceptions/CommandExecutionException.java @@ -7,7 +7,7 @@ package netneutrality.exceptions; * https://discord.gg/CdFcyQ */ -import netneutrality.command.CommandContext; +import netneutrality.core.context.CommandContext; /** * Logs the error internally, without sending a message diff --git a/src/main/java/netneutrality/exceptions/ExecutorException.java b/src/main/java/netneutrality/exceptions/ExecutorException.java index d7e64e6..8f58931 100644 --- a/src/main/java/netneutrality/exceptions/ExecutorException.java +++ b/src/main/java/netneutrality/exceptions/ExecutorException.java @@ -7,7 +7,7 @@ package netneutrality.exceptions; * https://discord.gg/CdFcyQ */ -import netneutrality.handler.LogHandler; +import netneutrality.core.LogHandler; public class ExecutorException implements Thread.UncaughtExceptionHandler { diff --git a/src/main/java/netneutrality/exceptions/UnimplementedParameterException.java b/src/main/java/netneutrality/exceptions/UnimplementedParameterException.java deleted file mode 100644 index 4cffbd5..0000000 --- a/src/main/java/netneutrality/exceptions/UnimplementedParameterException.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2017 github.com/kaaz - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package netneutrality.exceptions; - -import java.sql.SQLException; - -public class UnimplementedParameterException extends SQLException { - - private final String s; - - public UnimplementedParameterException(Object parameter) { - s = "Parameter not implemented at for: " + parameter; - } - - public UnimplementedParameterException(Object parameter, int pos) { - s = "Parameter not implemented! parameter:" + parameter + " - position:" + pos; - } - - @Override - public String toString() { - return s; - } - -} diff --git a/src/main/java/netneutrality/handler/hooks/guilds/ServerJoinHandler.java b/src/main/java/netneutrality/handler/hooks/guilds/ServerJoinHandler.java index a015db9..086b0d8 100644 --- a/src/main/java/netneutrality/handler/hooks/guilds/ServerJoinHandler.java +++ b/src/main/java/netneutrality/handler/hooks/guilds/ServerJoinHandler.java @@ -7,19 +7,13 @@ package netneutrality.handler.hooks.guilds; * https://discord.gg/CdFcyQ */ -import net.dv8tion.jda.api.events.guild.GuildJoinEvent; import net.dv8tion.jda.api.events.guild.GuildLeaveEvent; import net.dv8tion.jda.api.hooks.ListenerAdapter; -import netneutrality.GuildManager; +import netneutrality.core.GuildManager; import org.jetbrains.annotations.NotNull; public class ServerJoinHandler extends ListenerAdapter { - @Override - public void onGuildJoin(@NotNull GuildJoinEvent event) { - GuildManager.getManager(event.getGuild()).handleJoinEvent(); - } - @Override public void onGuildLeave(@NotNull GuildLeaveEvent event) { GuildManager.getManager(event.getGuild()).removeFromDB(); diff --git a/src/main/java/netneutrality/handler/hooks/message/EditHandler.java b/src/main/java/netneutrality/handler/hooks/message/EditHandler.java index 3c4e09c..1f0bd94 100644 --- a/src/main/java/netneutrality/handler/hooks/message/EditHandler.java +++ b/src/main/java/netneutrality/handler/hooks/message/EditHandler.java @@ -7,14 +7,18 @@ package netneutrality.handler.hooks.message; * https://discord.gg/CdFcyQ */ -import java.awt.Color; - -import net.dv8tion.jda.api.EmbedBuilder; +import net.dv8tion.jda.api.entities.TextChannel; import net.dv8tion.jda.api.events.message.MessageUpdateEvent; import net.dv8tion.jda.api.hooks.ListenerAdapter; +import netneutrality.core.GuildManager; +import netneutrality.core.SessionManager; import netneutrality.db.DBController; import netneutrality.db.controllers.DBMessage; -import netneutrality.db.models.MTableModel; +import netneutrality.db.entities.OGuild; +import netneutrality.utils.MessageFunction; +import org.hibernate.Session; + +import java.util.stream.Collectors; public class EditHandler extends ListenerAdapter { @@ -23,37 +27,32 @@ public class EditHandler extends ListenerAdapter { if (event.getAuthor().isBot()) return; - MTableModel table = DBController.get().prepareAndExecuteAsync("SELECT channel_id, guild_id FROM logging WHERE guild_id = ? AND enabled = 1", event.getGuild().getId()).blocking(); + GuildManager guildManager = GuildManager.getManager(event.getGuild()); - Object logChannel = table.getRowModel(0).getItem(0); - Object guild = table.getRowModel(0).getItem(1); + if (guildManager.getGuildEntity().getLogging()) { + OGuild guildEntity = guildManager.getGuildEntity(); - if (logChannel != null && guild != null) { - String originalMessage = ((DBMessage) DBController.get("message")).getMessageString(event.getMessage().getId()); - ((DBMessage) DBController.get("message")).logEdit(event.getMessage().getId(), event.getMessage().getContentDisplay()); + if (guildEntity.getLogChannel() != null && !guildEntity.getLogChannel().isEmpty()) { + Session session = SessionManager.getSessionFactory().openSession(); + session.load(guildEntity, guildEntity.getGuildId()); - EmbedBuilder editEmbed = new EmbedBuilder(); - editEmbed.setColor(Color.RED); - editEmbed.setDescription(":pencil2: **Message edited by " + event.getAuthor().getName() + "**"); - try { - editEmbed.addField("Original message", (originalMessage == null ? "Not available" : originalMessage), false); - } catch (IllegalArgumentException ex) { - editEmbed.addField("Original message:", "Message too long.", false); + int size = guildEntity.getLoggings() + .stream() + .filter(oLogging -> oLogging.getId().getChannelId().equals(event.getChannel().getId()) && oLogging.getEnabled()) + .collect(Collectors.toSet()) + .size(); + + if (size > 0) { + TextChannel channel = event.getGuild().getTextChannelById(guildEntity.getLogChannel()); + + if (channel != null) { + String originalMessage = DBController.get("message", DBMessage.class).getMessageString(event.getMessage().getId()); + DBController.get("message", DBMessage.class).logEdit(event.getMessage().getId(), event.getMessage().getContentDisplay()); + + channel.sendMessageEmbeds(MessageFunction.buildEditMessage(event.getMember(), event.getMessage(), originalMessage)).queue(); + } + } } - - try { - editEmbed.addField("Edited to:", event.getMessage().getContentDisplay(), false); - } catch (IllegalArgumentException ex) { - editEmbed.addField("Edited to:", "Message too long.", false); - } - - editEmbed.setFooter("ID : " + event.getMessageId(), null); - editEmbed.setTimestamp(event.getMessage().getTimeCreated()); - - event.getJDA().getGuildById((String) guild).getTextChannelById((String) logChannel).sendMessageEmbeds(editEmbed.build()).queue(); } - - } - } diff --git a/src/main/java/netneutrality/handler/hooks/message/MessageReceivedHandler.java b/src/main/java/netneutrality/handler/hooks/message/MessageReceivedHandler.java index 6dee6dc..4cb6d96 100644 --- a/src/main/java/netneutrality/handler/hooks/message/MessageReceivedHandler.java +++ b/src/main/java/netneutrality/handler/hooks/message/MessageReceivedHandler.java @@ -6,13 +6,15 @@ package netneutrality.handler.hooks.message; * https://discord.gg/CdFcyQ */ +import io.sentry.Breadcrumb; +import io.sentry.Sentry; import net.dv8tion.jda.api.entities.*; import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent; import net.dv8tion.jda.api.hooks.ListenerAdapter; -import netneutrality.GuildManager; import netneutrality.command.AbstractCommand; -import netneutrality.command.CommandContext; import netneutrality.command.CommandManager; +import netneutrality.core.GuildManager; +import netneutrality.core.context.CommandContext; import netneutrality.utils.Settings; import org.jetbrains.annotations.NotNull; @@ -29,6 +31,8 @@ public class MessageReceivedHandler extends ListenerAdapter { if (user.isBot()) return; if (event.isWebhookMessage()) return; + Sentry.addBreadcrumb(Breadcrumb.info("New message from " + member.getEffectiveName())); + CommandContext context = CommandContext.createContext(event); GuildManager.getManager(guild).getRateLimiter().check(member, message, channel); @@ -48,7 +52,7 @@ public class MessageReceivedHandler extends ListenerAdapter { } } else { - GuildManager.getManager(guild).checkBlacklist(message, member, channel); + GuildManager.getManager(guild).checkBlacklist(message, channel); } } } diff --git a/src/main/java/netneutrality/handler/ReactionHandler.java b/src/main/java/netneutrality/handler/hooks/message/ReactionHandler.java similarity index 95% rename from src/main/java/netneutrality/handler/ReactionHandler.java rename to src/main/java/netneutrality/handler/hooks/message/ReactionHandler.java index 512a834..b309f44 100644 --- a/src/main/java/netneutrality/handler/ReactionHandler.java +++ b/src/main/java/netneutrality/handler/hooks/message/ReactionHandler.java @@ -1,4 +1,5 @@ -package netneutrality.handler;/* +package netneutrality.handler.hooks.message; +/* * Copyright (c) anthorob * * https://xtremcommunity.com/ diff --git a/src/main/java/netneutrality/http/Selly.java b/src/main/java/netneutrality/http/Selly.java index 18d281e..5bad45c 100644 --- a/src/main/java/netneutrality/http/Selly.java +++ b/src/main/java/netneutrality/http/Selly.java @@ -1,12 +1,12 @@ package netneutrality.http; - /* * Copyright (c) anthorob * - * This file is closed-source. It should not be distributed or copied in any way or form + * https://xtremcommunity.com/ + * https://discord.gg/CdFcyQ */ -import netneutrality.db.models.MSellyOrder; +import netneutrality.db.entities.OSellyOrder; import org.json.JSONArray; import org.json.JSONObject; @@ -24,10 +24,10 @@ public class Selly { encodedAuth = Base64.getEncoder().encode(concat.getBytes()); } - public Map getOrders() { + public Map getOrders() { WebModule sellyApi = new WebModule("https://selly.gg/api/v2/orders"); Map headers = new HashMap<>(); - Map orders = new HashMap<>(); + Map orders = new HashMap<>(); headers.put("Authorization", "Basic " + new String(encodedAuth)); JSONArray response = null; try { @@ -40,7 +40,7 @@ public class Selly { for (int i = 0; i < response.length(); i++) { JSONObject order = response.getJSONObject(i); - orders.put(order.getString("id"), new MSellyOrder(order.getString("id"), order.getString("product_id"), order.getString("email"), order.getString("ip_address"), + orders.put(order.getString("id"), new OSellyOrder(order.getString("id"), order.getString("product_id"), order.getString("email"), order.getString("ip_address"), Float.parseFloat(order.getString("value")), order.getString("currency"), order.getString("gateway"), order.getInt("risk_level"), order.getInt("status"), order.getInt("crypto_value"), order.getString("crypto_address"), Float.parseFloat(order.getString("usd_value")), order.getString("created_at"))); } diff --git a/src/main/java/netneutrality/http/WebModule.java b/src/main/java/netneutrality/http/WebModule.java index 565b77c..cd8c8a6 100644 --- a/src/main/java/netneutrality/http/WebModule.java +++ b/src/main/java/netneutrality/http/WebModule.java @@ -1,11 +1,12 @@ package netneutrality.http; +import io.sentry.Breadcrumb; +import io.sentry.Sentry; import okhttp3.*; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; - import java.io.IOException; import java.util.List; import java.util.Map; @@ -28,21 +29,22 @@ public class WebModule { * @return an instance of the WebModule class with the Response of the Web Request */ public WebModule request() { - + Sentry.addBreadcrumb(Breadcrumb.http(url, "get")); Request request = new Request.Builder().url(this.url) .addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 OPR/82.0.4227.43") .build(); try { response = client.newCall(request).execute(); + Sentry.addBreadcrumb(Breadcrumb.http(url, "get", response.code())); } catch (IOException e) { - e.printStackTrace(); + Sentry.captureException(e); } return this; } public WebModule request(Map headers) throws IOException { - + Sentry.addBreadcrumb(Breadcrumb.http(url, "get")); Request.Builder builder = new Request.Builder().url(this.url) .addHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36"); @@ -52,12 +54,18 @@ public class WebModule { Request request = builder.build(); - response = client.newCall(request).execute(); + try { + response = client.newCall(request).execute(); + Sentry.addBreadcrumb(Breadcrumb.http(url, "get", response.code())); + } catch (IOException e) { + Sentry.captureException(e); + } return this; } - public WebModule post(TreeMap params, Map headers) throws IOException { + public WebModule post(TreeMap params, Map headers) { + Sentry.addBreadcrumb(Breadcrumb.http(url, "post")); RequestBody body = RequestBody.create(createJson(params), MediaType.parse("application/json; charset=utf-8")); Request.Builder builder = new Request.Builder().url(this.url) .addHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36"); @@ -66,7 +74,12 @@ public class WebModule { builder.addHeader(header.getKey(), header.getValue()); } Request request = builder.post(body).build(); - response = client.newCall(request).execute(); + try { + response = client.newCall(request).execute(); + Sentry.addBreadcrumb(Breadcrumb.http(url, "post", response.code())); + } catch (IOException e) { + Sentry.captureException(e); + } return this; } @@ -157,29 +170,4 @@ public class WebModule { return response.body().string(); } - public String getTextInHtmlTag(String tag) { - String body = ""; - try { - body = getRawData(); - } catch (IOException | RuntimeException e) { - e.printStackTrace(); - } - int startOfTag = body.indexOf(tag); - int endOfTag = body.indexOf(getEndHtmlTag(tag)); - if (startOfTag < 0 || endOfTag < 0) { - return ""; - } - - return body.substring(startOfTag + tag.length(), endOfTag - (tag.length() - 1)); - } - - private String getEndHtmlTag(String startingTag) { - String endingTag = ""; - if (startingTag.charAt(0) == '<' && startingTag.charAt(1) != '/' ) { - endingTag = ""; - } - System.out.println("endingTag = " + endingTag); - - return endingTag; - } } diff --git a/src/main/java/netneutrality/http/server/ActionHandler.java b/src/main/java/netneutrality/http/server/ActionHandler.java index ac98e2e..78f9329 100644 --- a/src/main/java/netneutrality/http/server/ActionHandler.java +++ b/src/main/java/netneutrality/http/server/ActionHandler.java @@ -7,11 +7,11 @@ package netneutrality.http.server;/* import com.sun.net.httpserver.HttpExchange; import net.dv8tion.jda.api.entities.Guild; -import netneutrality.GuildManager; -import netneutrality.MusicBot; +import netneutrality.NetNeutrality; +import netneutrality.core.GuildManager; import netneutrality.http.WebModule; -import org.apache.logging.log4j.LogManager; import org.json.JSONObject; +import org.slf4j.LoggerFactory; import java.io.IOException; import java.util.Map; @@ -24,9 +24,9 @@ public class ActionHandler extends AbstractHandler { String path = exchange.getRequestURI().getRawPath(); if (path.equals("/actions/shutdown")) { - LogManager.getLogger(MusicBot.class).info("Request to shutdown received"); + LoggerFactory.getLogger(NetNeutrality.class).info("Request to shutdown received"); sendStringResponse(exchange, "Shutting down.."); - MusicBot.shutdown(); + NetNeutrality.shutdown(); System.exit(0); return; @@ -34,8 +34,8 @@ public class ActionHandler extends AbstractHandler { if (path.equals("/actions/status")) { TreeMap json = new TreeMap<>(); - json.put("health", String.valueOf(MusicBot.getJDA().getStatus())); - json.put("ping", String.valueOf(MusicBot.getJDA().getGatewayPing())); + json.put("health", String.valueOf(NetNeutrality.getJDA().getStatus())); + json.put("ping", String.valueOf(NetNeutrality.getJDA().getGatewayPing())); sendJsonResponse(exchange, WebModule.createJson(json)); return; @@ -46,10 +46,10 @@ public class ActionHandler extends AbstractHandler { String[] args = exchange.getRequestURI().toString().split("/"); String guildId = args[args.length - 1]; - Guild guild = MusicBot.getJDA().getGuildById(guildId); + Guild guild = NetNeutrality.getJDA().getGuildById(guildId); if (guild != null) { GuildManager manager = GuildManager.getManager(guild); - Map settings = manager.getSettings(); + Map settings = manager.getSettings(); JSONObject setting = new JSONObject(settings); json.put("status", "ok"); @@ -67,13 +67,14 @@ public class ActionHandler extends AbstractHandler { String[] args = exchange.getRequestURI().toString().split("/"); String guildId = args[args.length - 1]; - Guild guild = MusicBot.getJDA().getGuildById(guildId); + Guild guild = NetNeutrality.getJDA().getGuildById(guildId); boolean ok; if (guild == null) ok = GuildManager.reloadSettingsForGuild(guildId); else ok = GuildManager.reloadSettingsForGuild(guild); + json.put("status", String.valueOf(ok)); sendJsonResponse(exchange, WebModule.createJson(json)); diff --git a/src/main/java/netneutrality/http/server/GuildHandler.java b/src/main/java/netneutrality/http/server/GuildHandler.java index 4ba2028..b709f13 100644 --- a/src/main/java/netneutrality/http/server/GuildHandler.java +++ b/src/main/java/netneutrality/http/server/GuildHandler.java @@ -9,7 +9,7 @@ package netneutrality.http.server; import com.sun.net.httpserver.HttpExchange; import net.dv8tion.jda.api.JDA; -import netneutrality.MusicBot; +import netneutrality.NetNeutrality; import org.json.JSONArray; import org.json.JSONObject; @@ -26,7 +26,7 @@ public class GuildHandler extends AbstractHandler { JSONArray array = new JSONArray(); - JDA jda = MusicBot.getJDA(); + JDA jda = NetNeutrality.getJDA(); jda.getGuilds().forEach(guild -> { JSONObject obj = new JSONObject(); @@ -46,7 +46,7 @@ public class GuildHandler extends AbstractHandler { String guild = args[args.length - 1]; JSONArray array = new JSONArray(); - JDA jda = MusicBot.getJDA(); + JDA jda = NetNeutrality.getJDA(); if (jda.getGuildById(guild) == null) { sendStringResponse(exchange, path); @@ -70,7 +70,7 @@ public class GuildHandler extends AbstractHandler { String[] args = exchange.getRequestURI().toString().split("/"); String guild = args[args.length - 1]; JSONArray array = new JSONArray(); - JDA jda = MusicBot.getJDA(); + JDA jda = NetNeutrality.getJDA(); if (jda.getGuildById(guild) == null) { sendStringResponse(exchange, path); diff --git a/src/main/java/netneutrality/music/MusicManager.java b/src/main/java/netneutrality/music/MusicManager.java index c6ee655..476d8eb 100644 --- a/src/main/java/netneutrality/music/MusicManager.java +++ b/src/main/java/netneutrality/music/MusicManager.java @@ -20,14 +20,13 @@ import net.dv8tion.jda.api.entities.Guild; import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.TextChannel; import net.dv8tion.jda.api.entities.VoiceChannel; -import netneutrality.GuildManager; -import netneutrality.ThreadManager; -import netneutrality.command.CommandContext; +import netneutrality.core.GuildManager; +import netneutrality.core.LogHandler; +import netneutrality.core.context.CommandContext; import netneutrality.exceptions.CommandErrorException; -import netneutrality.handler.LogHandler; import netneutrality.thread.MusicPlayerAutoDisconnectThread; +import netneutrality.thread.ThreadManager; import netneutrality.utils.MessageFunction; -import netneutrality.utils.Settings; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -51,17 +50,18 @@ public class MusicManager { private final AudioPlayerManager playerManager; private final TrackScheduler scheduler; private ScheduledFuture autoDisconnectThread; + private final int baseVolume; private MusicManager(Guild guild) { this.guild = guild; this.playerManager = new DefaultAudioPlayerManager(); this.player = playerManager.createPlayer(); this.scheduler = new TrackScheduler(player); + this.baseVolume = Integer.parseInt(GuildManager.getManager(guild).getSetting(GuildManager.Settings.MUSIC_VOLUME)); AudioSourceManagers.registerRemoteSources(playerManager); guild.getAudioManager().setSendingHandler(new AudioPlayerSendHandler(player)); player.addListener(scheduler); - player.setVolume((Integer) GuildManager.getManager(guild).getSetting(GuildManager.GuildSetting.MUSIC_VOLUME)); managers.put(guild.getId(), this); } @@ -75,8 +75,8 @@ public class MusicManager { } public static void initPlayerManager() { - YoutubeHttpContextFilter.setPAPISID(Settings.getInstance().get("BOT_PAPISID", "")); - YoutubeHttpContextFilter.setPSID(Settings.getInstance().get("BOT_PSID", "")); + YoutubeHttpContextFilter.setPAPISID(netneutrality.utils.Settings.getInstance().get("BOT_PAPISID", "")); + YoutubeHttpContextFilter.setPSID(netneutrality.utils.Settings.getInstance().get("BOT_PSID", "")); } public boolean isConnectedTo(VoiceChannel vChannel) { @@ -87,6 +87,7 @@ public class MusicManager { if (vChannel != null && !isConnectedTo(vChannel)) { guild.getAudioManager().openAudioConnection(vChannel); guild.getAudioManager().setSelfDeafened(true); + player.setVolume(baseVolume); if (autoDisconnectThread == null) autoDisconnectThread = executor.scheduleWithFixedDelay(new MusicPlayerAutoDisconnectThread(this), 120, 120, TimeUnit.SECONDS); @@ -142,7 +143,7 @@ public class MusicManager { } public boolean restoreQueue(List track) { - + //TODO: todo return false; } @@ -235,6 +236,10 @@ public class MusicManager { } } + public synchronized void stopTrack() { + player.stopTrack(); + } + public synchronized void skip(int nbTrack) { if (!scheduler.getQueue().isEmpty()) { if (nbTrack >= scheduler.getQueue().size()) { diff --git a/src/main/java/netneutrality/music/TrackScheduler.java b/src/main/java/netneutrality/music/TrackScheduler.java index e23380a..26e05da 100644 --- a/src/main/java/netneutrality/music/TrackScheduler.java +++ b/src/main/java/netneutrality/music/TrackScheduler.java @@ -17,7 +17,10 @@ import net.dv8tion.jda.api.entities.TextChannel; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.*; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Queue; +import java.util.Set; import java.util.concurrent.LinkedBlockingQueue; public class TrackScheduler extends AudioEventAdapter { diff --git a/src/main/java/netneutrality/thread/MusicPlayerAutoDisconnectThread.java b/src/main/java/netneutrality/thread/MusicPlayerAutoDisconnectThread.java index eebaf7b..4e3101b 100644 --- a/src/main/java/netneutrality/thread/MusicPlayerAutoDisconnectThread.java +++ b/src/main/java/netneutrality/thread/MusicPlayerAutoDisconnectThread.java @@ -8,7 +8,7 @@ package netneutrality.thread;/* import net.dv8tion.jda.api.entities.Guild; import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.VoiceChannel; -import netneutrality.MusicBot; +import netneutrality.NetNeutrality; import netneutrality.music.MusicManager; import java.util.List; @@ -32,7 +32,7 @@ public class MusicPlayerAutoDisconnectThread implements Runnable { } if (channel != null) { - List members = channel.getMembers().stream().filter(member -> !member.getId().equals(MusicBot.getSelf().getId())).toList(); + List members = channel.getMembers().stream().filter(member -> !member.getId().equals(NetNeutrality.getSelf().getId())).toList(); if (members.size() == 0) manager.leave(); diff --git a/src/main/java/netneutrality/thread/ShutdownThread.java b/src/main/java/netneutrality/thread/ShutdownThread.java index 34e1e1a..ca926b7 100644 --- a/src/main/java/netneutrality/thread/ShutdownThread.java +++ b/src/main/java/netneutrality/thread/ShutdownThread.java @@ -5,8 +5,7 @@ package netneutrality.thread;/* * https://discord.gg/CdFcyQ */ -import netneutrality.MusicBot; -import netneutrality.utils.UnsafeShutdown; +import netneutrality.NetNeutrality; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.core.LoggerContext; import org.apache.logging.log4j.core.config.Configurator; @@ -20,8 +19,8 @@ public class ShutdownThread implements Runnable { Configurator.shutdown((LoggerContext) LogManager.getContext()); } - if (MusicBot.getJDA() != null) { - MusicBot.shutdown(); + if (NetNeutrality.getJDA() != null) { + NetNeutrality.shutdown(); } } diff --git a/src/main/java/netneutrality/ThreadManager.java b/src/main/java/netneutrality/thread/ThreadManager.java similarity index 86% rename from src/main/java/netneutrality/ThreadManager.java rename to src/main/java/netneutrality/thread/ThreadManager.java index 2530aae..946ab44 100644 --- a/src/main/java/netneutrality/ThreadManager.java +++ b/src/main/java/netneutrality/thread/ThreadManager.java @@ -1,11 +1,16 @@ -package netneutrality; - -import netneutrality.thread.BaseThreadFactory; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +package netneutrality.thread; +/* + * Copyright (c) anthorob + * + * https://xtremcommunity.com/ + * https://discord.gg/CdFcyQ + */ import java.util.Map; -import java.util.concurrent.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; public class ThreadManager { @@ -14,7 +19,6 @@ public class ThreadManager { } private static final Map executors = new ConcurrentHashMap<>(); - private final static Logger logger = LoggerFactory.getLogger(ThreadManager.class); public static ExecutorService getExecutor(String name) { return executors.computeIfAbsent(name, s -> Executors.newSingleThreadExecutor(new BaseThreadFactory(name))); diff --git a/src/main/java/netneutrality/utils/ChannelFunction.java b/src/main/java/netneutrality/utils/ChannelFunction.java index 4cb37b1..abe112f 100644 --- a/src/main/java/netneutrality/utils/ChannelFunction.java +++ b/src/main/java/netneutrality/utils/ChannelFunction.java @@ -1,14 +1,18 @@ package netneutrality.utils; +import io.sentry.ISpan; +import io.sentry.ITransaction; +import io.sentry.Sentry; +import io.sentry.SpanStatus; +import net.dv8tion.jda.api.entities.Message; +import net.dv8tion.jda.api.entities.TextChannel; +import netneutrality.thread.ThreadManager; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import java.time.OffsetDateTime; import java.util.List; -import net.dv8tion.jda.api.entities.Message; -import net.dv8tion.jda.api.entities.TextChannel; -import netneutrality.ThreadManager; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - public class ChannelFunction { private static final Logger logger = LoggerFactory.getLogger(ChannelFunction.class); @@ -18,38 +22,74 @@ public class ChannelFunction { if (toDelete >= 2500) return; ThreadManager.getExecutor("bulk-delete", ThreadManager.ExecutorType.FIXED).submit(() -> { + ITransaction transaction = Sentry.startTransaction(String.format("bulkDeleteMessage(%s, %d)", channel.getId(), toDelete), "task"); + transaction.setData("channel", channel.getId()); + transaction.setData("toDelete", toDelete); + transaction.setTag("operation", "bulk-delete"); - int toDeleteFinal = toDelete + 1; - int iteration = toDeleteFinal / 100; - for (int i = 0; i < iteration; i++) { - List messages = channel.getHistory().retrievePast(100).complete(); - deleteFromList(messages, channel); - toDeleteFinal -= 100; + try { + int toDeleteFinal = toDelete + 1; + int iteration = toDeleteFinal / 100; + for (int i = 0; i < iteration; i++) { + ISpan innerSpan = transaction.startChild("task", "Processing iteration " + (i + 1) + "/" + iteration); + try { + List messages = channel.getHistory().retrievePast(100).complete(); + deleteFromList(messages, channel, innerSpan); + toDeleteFinal -= 100; + innerSpan.setStatus(SpanStatus.OK); + } catch (Exception e) { + innerSpan.setThrowable(e); + innerSpan.setStatus(SpanStatus.INTERNAL_ERROR); + throw e; + } finally { + innerSpan.finish(); + } + } + + if (toDeleteFinal > 0) { + ISpan innerSpan = transaction.startChild("task", String.format("Processing final iteration (%d messages)", toDeleteFinal)); + try { + List messages = channel.getHistory().retrievePast(toDeleteFinal).complete(); + deleteFromList(messages, channel, innerSpan); + innerSpan.setStatus(SpanStatus.OK); + } catch (Exception e) { + innerSpan.setThrowable(e); + innerSpan.setStatus(SpanStatus.INTERNAL_ERROR); + throw e; + } finally { + innerSpan.finish(); + } + + + innerSpan.finish(); + } + + transaction.setStatus(SpanStatus.OK); + } catch (Exception e) { + transaction.setThrowable(e); + transaction.setStatus(SpanStatus.INTERNAL_ERROR); + } finally { + transaction.finish(); } - - if (toDeleteFinal > 0) { - List messages = channel.getHistory().retrievePast(toDeleteFinal).complete(); - deleteFromList(messages, channel); - - } - }); - } - private synchronized static void deleteFromList(List messages, TextChannel channel) { + private synchronized static void deleteFromList(List messages, TextChannel channel, ISpan span) { + ISpan innerSpan = span.startChild("delete", "Executing delete of: " + messages.size() + " messages"); try { channel.deleteMessages(messages).complete(); - logger.debug("Deleted {} messages from channel [{}] in guild [{}]", messages.size(), channel.getName(), channel.getGuild().getName()); - + innerSpan.setStatus(SpanStatus.OK); } catch (IllegalArgumentException e) { + innerSpan.setThrowable(e); + innerSpan.setStatus(SpanStatus.OUT_OF_RANGE); messages.forEach(m -> { if (!m.getTimeCreated().isBefore(OffsetDateTime.now().minusWeeks(2))) { m.delete().queue(); } }); - + } finally { + innerSpan.finish(); } } -} \ No newline at end of file +} diff --git a/src/main/java/netneutrality/utils/JpaUtils.java b/src/main/java/netneutrality/utils/JpaUtils.java new file mode 100644 index 0000000..068c3b9 --- /dev/null +++ b/src/main/java/netneutrality/utils/JpaUtils.java @@ -0,0 +1,42 @@ +package netneutrality.utils;/* + * Copyright (c) anthorob + * + * https://xtremcommunity.com/ + * https://discord.gg/CdFcyQ + */ + +import io.sentry.Breadcrumb; +import io.sentry.Sentry; +import io.sentry.SentryLevel; +import netneutrality.core.GuildManager; +import netneutrality.db.entities.OGuild; +import org.hibernate.HibernateException; +import org.hibernate.ObjectNotFoundException; +import org.hibernate.Session; + +import java.io.Serializable; + +public class JpaUtils { + + public static void tryLoad(Session session, Object object, Serializable id) { + try { + session.load(object, id); + } catch (HibernateException exception) { + if (object instanceof OGuild oGuild) { + if (exception instanceof ObjectNotFoundException) { + Sentry.addBreadcrumb(Breadcrumb.error("ObjectNotFoundException")); + + String cachedId = oGuild.getGuildId(); + Sentry.captureMessage("Trying to load Guild[" + cachedId + "] while deleted from database, reloading..", SentryLevel.ERROR); + GuildManager guildManager = GuildManager.getManager(cachedId); + guildManager.reloadEntity(); + guildManager.getBlacklistCache().clear(); + Sentry.captureMessage("Guild[" + cachedId + "] reloaded", SentryLevel.INFO); + } + } + session.close(); + + throw exception; + } + } +} diff --git a/src/main/java/netneutrality/utils/MessageFunction.java b/src/main/java/netneutrality/utils/MessageFunction.java index 6c77edf..9c40b2b 100644 --- a/src/main/java/netneutrality/utils/MessageFunction.java +++ b/src/main/java/netneutrality/utils/MessageFunction.java @@ -7,27 +7,24 @@ package netneutrality.utils; * https://discord.gg/CdFcyQ */ -import java.awt.*; -import java.time.OffsetDateTime; -import java.util.*; -import java.util.List; - import com.sedmelluq.discord.lavaplayer.track.AudioPlaylist; import com.sedmelluq.discord.lavaplayer.track.AudioTrack; import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.entities.*; import netneutrality.command.AbstractCommand; -import netneutrality.command.CommandContext; import netneutrality.command.CommandType; -import netneutrality.db.DBController; -import netneutrality.db.controllers.DBBlacklist; -import netneutrality.db.models.MBlacklist; +import netneutrality.core.context.CommandContext; import netneutrality.exceptions.CommandExecutionException; import netneutrality.music.MusicManager; import org.apache.commons.lang3.time.DurationFormatUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.awt.*; +import java.time.OffsetDateTime; +import java.util.List; +import java.util.*; + public class MessageFunction { private final static Logger logger = LoggerFactory.getLogger(MessageFunction.class); @@ -89,7 +86,7 @@ public class MessageFunction { message.addField("Track title: ", track.getInfo().title, false); message.addField("Uploaded by: ", track.getInfo().author, false); message.addField("Duration: ", DurationFormatUtils.formatDuration(track.getDuration(), "**HH:mm:ss**", true), false); - message.setFooter("Requested by " + user.getUser().getName(), user.getUser().getAvatarUrl()); + message.setFooter("Requested by " + user.getEffectiveName(), user.getAvatarUrl()); message.setTimestamp(OffsetDateTime.now()); return message.build(); @@ -103,7 +100,7 @@ public class MessageFunction { message.setColor(Color.BLUE); message.addField("Playlist: ", playlist.getName(), false); message.addField("Number of tracks: ", String.valueOf(playlist.getTracks().size()), false); - message.setFooter("Requested by " + user.getUser().getName(), user.getUser().getAvatarUrl()); + message.setFooter("Requested by " + user.getEffectiveName(), user.getAvatarUrl()); message.setTimestamp(OffsetDateTime.now()); return message.build(); @@ -118,7 +115,7 @@ public class MessageFunction { message.setColor(Color.BLUE); int index = 0; - for (AudioTrack track: tracks) { + for (AudioTrack track : tracks) { if (track.getInfo().title.equals(current.getInfo().title) && currentlyPlaying) { message.addField("Track #" + ++index + " (Currently playing)", track.getInfo().title, false); } else { @@ -128,7 +125,7 @@ public class MessageFunction { if (index == 10) break; } - message.setFooter("Requested by " + user.getUser().getName(), user.getUser().getAvatarUrl()); + message.setFooter("Requested by " + user.getEffectiveName(), user.getAvatarUrl()); message.setTimestamp(OffsetDateTime.now()); return message.build(); @@ -140,7 +137,7 @@ public class MessageFunction { message.setColor(Color.BLUE); message.addField("Command", command.getCommandName(), false); message.addField("Description", command.getDescription(), false); - message.addField("Aliases", ((command.getAlias() == null || command.getAlias().length == 0) ? "None": Arrays.toString(command.getAlias()).replaceAll("[\\[\\]]", "")), false); + message.addField("Aliases", ((command.getAlias() == null || command.getAlias().length == 0) ? "None" : Arrays.toString(command.getAlias()).replaceAll("[\\[\\]]", "")), false); message.addField("Usage", (command.getUsage() == null ? "No arguments defined" : command.getUsage().toString()), false); return message.build(); @@ -217,32 +214,47 @@ public class MessageFunction { message.addField("Caused by:", cause, false); } - message.setFooter("Requested by " + context.getDiscordUser().getName(), context.getDiscordUser().getAvatarUrl()); + message.setFooter("Requested by " + context.getGuildUser().getEffectiveName(), context.getGuildUser().getAvatarUrl()); message.setTimestamp(OffsetDateTime.now()); return message.build(); } - public static void checkBlacklist(Guild guild, Message message, TextChannel channel) { + public static MessageEmbed buildEditMessage(Member member, Message message, String originalMessage) { + EmbedBuilder editEmbed = new EmbedBuilder(); + editEmbed.setColor(Color.RED); + editEmbed.setDescription(":pencil2: **Message edited by " + member.getEffectiveName() + "**"); + try { + editEmbed.addField("Original message", (originalMessage == null ? "Not available" : originalMessage), false); + } catch (IllegalArgumentException ex) { + editEmbed.addField("Original message:", "Message too long.", false); + } - ArrayList mBlacklists = ((DBBlacklist) DBController.get("blacklist")).getBlacklistFromServer(guild.getId()); - if (!mBlacklists.isEmpty()) { + try { + editEmbed.addField("Edited to:", message.getContentDisplay(), false); + } catch (IllegalArgumentException ex) { + editEmbed.addField("Edited to:", "Message too long.", false); + } - boolean found = false; - for (MBlacklist aBlacklist : mBlacklists) { - if (message.getContentRaw().toLowerCase().contains(aBlacklist.getWord())) { - found = true; - break; - } - } - - if (found) { - message.delete().queue(); - channel.sendMessage("Not in my christian server").queue(); - } - } + editEmbed.setFooter("ID : " + message.getId(), null); + editEmbed.setTimestamp(message.getTimeCreated()); + return editEmbed.build(); } + public static void testMessageAgainstBlacklist(Message message, TextChannel channel, Set cache) { + boolean found = false; + for (String word : cache) { + if (message.getContentRaw().toLowerCase().contains(word)) { + found = true; + break; + } + } + + if (found) { + message.delete().queue(); + channel.sendMessage("Not in my christian server").queue(); + } + } } diff --git a/src/main/java/netneutrality/utils/MusicUtils.java b/src/main/java/netneutrality/utils/MusicUtils.java index 2a83e44..a68973d 100644 --- a/src/main/java/netneutrality/utils/MusicUtils.java +++ b/src/main/java/netneutrality/utils/MusicUtils.java @@ -6,29 +6,45 @@ package netneutrality.utils;/* */ import net.dv8tion.jda.api.entities.VoiceChannel; -import netneutrality.command.CommandContext; -import netneutrality.exceptions.CommandErrorException; +import netneutrality.core.context.CommandContext; import netneutrality.exceptions.CommandExecutionException; import netneutrality.music.MusicManager; public class MusicUtils { - public static void checkIfConnected(MusicManager manager, CommandContext context) { + public static boolean checkIfConnected(MusicManager manager, CommandContext context) { if (context.getGuildUser().getVoiceState() == null) { - throw new CommandExecutionException("Voice state is null", context, null); + throw new CommandExecutionException("Voice state is null, this should not happen", context, null); } if (!context.getGuildUser().getVoiceState().inVoiceChannel()) { - throw new CommandErrorException("You are not in a voice channel", context, null); + context.reply("You are not in a voice channel"); + return false; } VoiceChannel vChannel = context.getGuildUser().getVoiceState().getChannel(); if (!manager.isConnected()) { - throw new CommandErrorException("Player is not in a voice channel", context, null); + context.reply("You are not in a voice channel"); + return false; } if (!manager.isConnectedTo(vChannel)) { - throw new CommandErrorException("Player is not in your voice channel", context, null); + context.reply("You are not in a voice channel"); + return false; } + + return true; + } + + public static boolean checkIfDj(MusicManager manager, CommandContext context) { + if (manager.getCurrentlyPlaying() != null) { + if (!UserFunction.isAdmin(context.getGuildUser()) || !manager.getRequesterOfCurrentTrack().getId().equals(context.getGuildUser().getId())) { + context.reply("You are not powerful enough, scrub"); + return false; + } else + return true; + } + + return false; } } diff --git a/src/main/java/netneutrality/utils/Settings.java b/src/main/java/netneutrality/utils/Settings.java index 0179810..17205be 100644 --- a/src/main/java/netneutrality/utils/Settings.java +++ b/src/main/java/netneutrality/utils/Settings.java @@ -1,6 +1,8 @@ package netneutrality.utils; -import java.io.*; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; import java.util.Map; import java.util.Properties; @@ -10,7 +12,7 @@ public class Settings { private final Properties prop = new Properties(); public Settings() { - File file = new File("bot.config"); + File file = new File("bot.properties"); FileInputStream fis = null; try { diff --git a/src/main/resources/META-INF/MANIFEST.MF b/src/main/resources/META-INF/MANIFEST.MF index 6d311f9..329b72b 100644 --- a/src/main/resources/META-INF/MANIFEST.MF +++ b/src/main/resources/META-INF/MANIFEST.MF @@ -1,3 +1,3 @@ Manifest-Version: 1.0 -Main-Class: netneutrality.MusicBot +Main-Class: netneutrality.NetNeutrality diff --git a/src/main/resources/hibernate.cfg.xml b/src/main/resources/hibernate.cfg.xml new file mode 100644 index 0000000..d92de99 --- /dev/null +++ b/src/main/resources/hibernate.cfg.xml @@ -0,0 +1,19 @@ + + + + + + + org.hibernate.dialect.MySQLDialect + com.mysql.cj.jdbc.Driver + org.hibernate.hikaricp.internal.HikariCPConnectionProvider + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/log4j2.properties b/src/main/resources/log4j2.properties new file mode 100644 index 0000000..ca00468 --- /dev/null +++ b/src/main/resources/log4j2.properties @@ -0,0 +1,34 @@ +status = warn + +appender.console.type = Console +appender.console.name = consoleLogger +appender.console.layout.type = PatternLayout +appender.console.layout.pattern = %d{yyyy-MM-dd HH:mm:ss.SSS} %p [%thread] %logger - %msg%n + +# Rotate log file +appender.rolling.type = RollingFile +appender.rolling.name = LogToRollingFile +appender.rolling.fileName = logs/debug.log +appender.rolling.filePattern = logs/$${date:yyyy-MM}/debug-%d{MM-dd-yyyy}-%i.log.gz +appender.rolling.layout.type = PatternLayout +appender.rolling.layout.pattern = %d{yyyy-MM-dd HH:mm:ss.SSS} %p [%thread] %logger - %msg%n +appender.rolling.policies.type = Policies +appender.rolling.policies.time.type = TimeBasedTriggeringPolicy +appender.rolling.policies.size.type = SizeBasedTriggeringPolicy +appender.rolling.policies.size.size=10MB +appender.rolling.strategy.type = DefaultRolloverStrategy +appender.rolling.strategy.max = 5 + +logger.hibernate.name = org.hibernate +logger.hibernate.level = info +logger.hibernate.additivity = false +logger.hibernate.appenderRef.rolling.ref = LogToRollingFile + +logger.app.name = netneutrality +logger.app.level = debug +logger.app.additivity = false +logger.app.appenderRef.rolling.ref = LogToRollingFile +logger.app.appenderRef.console.ref = consoleLogger + +rootLogger.level = error +rootLogger.appenderRef.stdout.ref = consoleLogger \ No newline at end of file diff --git a/src/main/resources/log4j2.xml b/src/main/resources/log4j2.xml deleted file mode 100644 index ac416cb..0000000 --- a/src/main/resources/log4j2.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/src/main/resources/spy.properties b/src/main/resources/spy.properties new file mode 100644 index 0000000..fa4d6da --- /dev/null +++ b/src/main/resources/spy.properties @@ -0,0 +1,4 @@ +driverlist=com.mysql.cj.jdbc.Driver +dateformat=yyyy-MM-dd hh:mm:ss a +appender=com.p6spy.engine.spy.appender.StdoutLogger +logMessageFormat=com.p6spy.engine.spy.appender.SingleLineFormat \ No newline at end of file