From 832fc0ff3dbe4416ef3c37ee0f8c11a82399c183 Mon Sep 17 00:00:00 2001 From: anthorob Date: Sun, 20 Mar 2022 16:56:33 -0400 Subject: [PATCH] Fix settings loading and add helpers for JPA --- .../java/netneutrality/core/GuildManager.java | 104 ++++++++---------- .../java/netneutrality/http/WebModule.java | 2 +- .../http/server/ActionHandler.java | 4 +- .../netneutrality/thread/ThreadManager.java | 1 - .../java/netneutrality/utils/JpaUtils.java | 45 +++++++- 5 files changed, 90 insertions(+), 66 deletions(-) diff --git a/src/main/java/netneutrality/core/GuildManager.java b/src/main/java/netneutrality/core/GuildManager.java index ea06606..c2fdea3 100644 --- a/src/main/java/netneutrality/core/GuildManager.java +++ b/src/main/java/netneutrality/core/GuildManager.java @@ -18,6 +18,7 @@ import netneutrality.db.entities.OGuild; import netneutrality.db.entities.OGuildSetting; import netneutrality.handler.ratelimiter.IMessageRateLimiter; import netneutrality.handler.ratelimiter.MessageRateLimiterImpl; +import netneutrality.thread.ThreadManager; import netneutrality.utils.JpaUtils; import netneutrality.utils.MessageFunction; import org.hibernate.Session; @@ -71,7 +72,8 @@ public class GuildManager { this.rateLimiter = new MessageRateLimiterImpl(); managers.put(guild.getId(), this); - reloadBlacklistCache(true); + reloadBlacklistCache(); + reloadSettingsCache(); } private GuildManager(String guildId) { @@ -84,7 +86,8 @@ public class GuildManager { this.rateLimiter = new MessageRateLimiterImpl(); managers.put(guild.getId(), this); - reloadBlacklistCache(true); + reloadBlacklistCache(); + reloadSettingsCache(); } public static GuildManager getManager(Guild guild) { @@ -148,28 +151,31 @@ public class GuildManager { public void setSettingValue(Settings setting, String value) { Session session = sessionFactory.openSession(); - session.load(guildEntity, guildEntity.getGuildId()); - - if (value == null || value.isEmpty()) { - value = setting.getDefaultValue(); - } + JpaUtils.tryLoad(session, guildEntity, guildEntity.getGuildId()); 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); + if (value == null || setting.getDefaultValue().equals(value)) { + if (oGuildSetting != null) { + session.delete(oGuildSetting); + } } else { - oGuildSetting.setValue(value); - session.update(oGuildSetting); + 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(); } @@ -178,67 +184,50 @@ public class GuildManager { if (toggle == isDebugEnabled()) return; - Session session = sessionFactory.openSession(); - session.beginTransaction(); - - guildEntity.setDebug(toggle); - - session.update(guildEntity); - session.getTransaction().commit(); - session.close(); + JpaUtils.updateWithTransaction(guildEntity, () -> guildEntity.setDebug(toggle)); } - 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) { + public boolean reloadSettingsCache(boolean close) { logger.debug("Reloading settings cache for guild: " + guild.getId()); settingsCache.clear(); - Session session = sessionFactory.openSession(); - JpaUtils.tryLoad(session, guildEntity, guildEntity.getGuildId()); + JpaUtils.getWithSession(guildEntity, close, () -> { + Set settingSet = guildEntity.getGuildSettings(); - Set settingSet = guildEntity.getGuildSettings(); - for (OGuildSetting setting : settingSet) { - settingsCache.put(setting.getName(), setting.getValue()); - } + for (OGuildSetting setting : settingSet) { + settingsCache.put(setting.getName(), setting.getValue()); + } + }); - if (close) - session.close(); + return true; + } + + public boolean reloadSettingsCache() { + return reloadSettingsCache(true); } 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()); + JpaUtils.getWithSession(guildEntity, close, () -> { + Set oBlacklistSet = guildEntity.getBlacklists(); - Set oBlacklistSet = guildEntity.getBlacklists(); - for (OBlacklist bl : oBlacklistSet) { - if (bl.getEnabled()) { - blacklistCache.add(bl.getWord()); + for (OBlacklist bl : oBlacklistSet) { + if (bl.getEnabled()) { + blacklistCache.add(bl.getWord()); + } } - } + }); + } - if (close) - session.close(); + public void reloadBlacklistCache() { + reloadBlacklistCache(true); } public void checkAndLogMessage(Message message, Member member, TextChannel channel) { if (isLoggingEnabled()) { - DBController.get("message", DBMessage.class).log(this, channel, member, message); + ThreadManager.getExecutor("log-messages").submit(() -> DBController.get("message", DBMessage.class).log(this, channel, member, message)); } } @@ -254,6 +243,7 @@ public class GuildManager { logger.debug("Guild[{}] doesn't exist in DB, creating entity..", guildId); session.beginTransaction(); entity = new OGuild(); + entity.setGuildId(guildId); session.save(entity); diff --git a/src/main/java/netneutrality/http/WebModule.java b/src/main/java/netneutrality/http/WebModule.java index 47eb57d..38a0b84 100644 --- a/src/main/java/netneutrality/http/WebModule.java +++ b/src/main/java/netneutrality/http/WebModule.java @@ -18,7 +18,7 @@ public class WebModule { private final OkHttpClient client = new OkHttpClient(); private Response response; //private final String userAgent = "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"; - private final String userAgent = "NetNeutrality/1.0 (Discord bot, anthorob@xtremmail.com)"; + private static final String userAgent = "NetNeutrality/1.0 (Discord bot, anthorob@xtremmail.com)"; public WebModule(String url) { diff --git a/src/main/java/netneutrality/http/server/ActionHandler.java b/src/main/java/netneutrality/http/server/ActionHandler.java index 78f9329..85bdb30 100644 --- a/src/main/java/netneutrality/http/server/ActionHandler.java +++ b/src/main/java/netneutrality/http/server/ActionHandler.java @@ -70,9 +70,9 @@ public class ActionHandler extends AbstractHandler { Guild guild = NetNeutrality.getJDA().getGuildById(guildId); boolean ok; if (guild == null) - ok = GuildManager.reloadSettingsForGuild(guildId); + ok = GuildManager.getManager(guildId).reloadSettingsCache(); else - ok = GuildManager.reloadSettingsForGuild(guild); + ok = GuildManager.getManager(guild).reloadSettingsCache(); json.put("status", String.valueOf(ok)); diff --git a/src/main/java/netneutrality/thread/ThreadManager.java b/src/main/java/netneutrality/thread/ThreadManager.java index 946ab44..791bb54 100644 --- a/src/main/java/netneutrality/thread/ThreadManager.java +++ b/src/main/java/netneutrality/thread/ThreadManager.java @@ -22,7 +22,6 @@ public class ThreadManager { public static ExecutorService getExecutor(String name) { return executors.computeIfAbsent(name, s -> Executors.newSingleThreadExecutor(new BaseThreadFactory(name))); - } public static ExecutorService getExecutor(String name, ExecutorType type) { diff --git a/src/main/java/netneutrality/utils/JpaUtils.java b/src/main/java/netneutrality/utils/JpaUtils.java index 068c3b9..4d3aebc 100644 --- a/src/main/java/netneutrality/utils/JpaUtils.java +++ b/src/main/java/netneutrality/utils/JpaUtils.java @@ -9,6 +9,7 @@ import io.sentry.Breadcrumb; import io.sentry.Sentry; import io.sentry.SentryLevel; import netneutrality.core.GuildManager; +import netneutrality.core.SessionManager; import netneutrality.db.entities.OGuild; import org.hibernate.HibernateException; import org.hibernate.ObjectNotFoundException; @@ -22,21 +23,55 @@ public class JpaUtils { try { session.load(object, id); } catch (HibernateException exception) { - if (object instanceof OGuild oGuild) { - if (exception instanceof ObjectNotFoundException) { - Sentry.addBreadcrumb(Breadcrumb.error("ObjectNotFoundException")); + if (exception instanceof ObjectNotFoundException) { + Sentry.addBreadcrumb(Breadcrumb.error("ObjectNotFoundException")); + if (object instanceof OGuild oGuild) { String cachedId = oGuild.getGuildId(); - Sentry.captureMessage("Trying to load Guild[" + cachedId + "] while deleted from database, reloading..", SentryLevel.ERROR); + Sentry.captureMessage("Trying to load Guild[" + cachedId + "] while deleted from database, reloading entity..", SentryLevel.ERROR); + GuildManager guildManager = GuildManager.getManager(cachedId); guildManager.reloadEntity(); guildManager.getBlacklistCache().clear(); Sentry.captureMessage("Guild[" + cachedId + "] reloaded", SentryLevel.INFO); } } - session.close(); + session.close(); throw exception; } } + + public static void updateWithTransaction(Object persistantEntity, Runnable runnable) { + Session session = SessionManager.getSessionFactory().openSession(); + session.beginTransaction(); + + runnable.run(); + + session.update(persistantEntity); + session.getTransaction().commit(); + session.close(); + } + + public static void getWithSession(OGuild oGuild, Runnable runnable) { + getWithSession(oGuild, oGuild.getGuildId(), runnable); + } + + public static void getWithSession(OGuild oGuild, boolean close, Runnable runnable) { + getWithSession(oGuild, oGuild.getGuildId(), close, runnable); + } + + public static void getWithSession(Object persistantEntity, Serializable id, Runnable runnable) { + getWithSession(persistantEntity, id, true, runnable); + } + + public static void getWithSession(Object persistantEntity, Serializable id, boolean close, Runnable runnable) { + Session session = SessionManager.getSessionFactory().openSession(); + tryLoad(session, persistantEntity, id); + + runnable.run(); + + if (close) + session.close(); + } }