diff --git a/pom.xml b/pom.xml index 5e7702d..3d1d899 100644 --- a/pom.xml +++ b/pom.xml @@ -18,17 +18,17 @@ - 6.4.2 + 6.4.3 8.0.20 - 5.4.16.Final + 5.4.17.Final 5.2.6.RELEASE 2.3.0.RELEASE 2.3.0.RELEASE - 2.10.1 - 2.12.1 - 1.7.28 - 3.0.0-M2 - 5.2.2 + 2.11.0 + 2.13.3 + 1.7.30 + 3.0.0-M3 + 5.3.2 3.0 https://nexus.locusworks.net @@ -154,7 +154,7 @@ net.dv8tion JDA - 4.1.0_88 + 4.1.1_155 com.fasterxml.jackson.core @@ -174,7 +174,7 @@ com.sedmelluq lavaplayer - 1.3.32 + 1.3.49 @@ -302,13 +302,13 @@ com.sun.xml.bind jaxb-core - 2.3.0.1 + 3.0.0-M3 com.sun.xml.bind jaxb-impl - 2.4.0-b180830.0438 + 3.0.0-M3 diff --git a/src/main/java/net/locusworks/discord/eighttrack/annotations/DiscordEventListener.java b/src/main/java/net/locusworks/discord/eighttrack/annotations/DiscordEventListener.java new file mode 100644 index 0000000..4544d87 --- /dev/null +++ b/src/main/java/net/locusworks/discord/eighttrack/annotations/DiscordEventListener.java @@ -0,0 +1,12 @@ +package net.locusworks.discord.eighttrack.annotations; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +public @interface DiscordEventListener { + +} diff --git a/src/main/java/net/locusworks/discord/eighttrack/database/config/EightTrackBeanConfiguration.java b/src/main/java/net/locusworks/discord/eighttrack/database/config/EightTrackBeanConfiguration.java index 093320d..4d0bb73 100644 --- a/src/main/java/net/locusworks/discord/eighttrack/database/config/EightTrackBeanConfiguration.java +++ b/src/main/java/net/locusworks/discord/eighttrack/database/config/EightTrackBeanConfiguration.java @@ -34,6 +34,9 @@ import javax.sql.DataSource; import org.flywaydb.core.Flyway; import org.flywaydb.core.api.configuration.FluentConfiguration; +import org.flywaydb.core.api.logging.Log; +import org.flywaydb.core.api.logging.LogCreator; +import org.flywaydb.core.api.logging.LogFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -48,6 +51,8 @@ import org.springframework.orm.jpa.vendor.Database; import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.annotation.EnableTransactionManagement; +import net.locusworks.logger.ApplicationLogger; +import net.locusworks.logger.ApplicationLoggerFactory; @Configuration(value="net.locusworks.discord.eighttrack.database.config.EightTrackBeanConfiguration") @EnableTransactionManagement @@ -140,6 +145,7 @@ public class EightTrackBeanConfiguration { @Bean(name="flyway", initMethod="migrate") public Flyway flyway() { + LogFactory.setLogCreator(new FlywayLogCreator()); FluentConfiguration fc = Flyway.configure(); fc.schemas("eighttrack"); fc.table("_flyway_migration"); @@ -149,5 +155,53 @@ public class EightTrackBeanConfiguration { return fc.load(); } + + private class FlywayLogCreator implements LogCreator { + + @Override + public Log createLogger(Class clazz) { + return new FlywayLog(clazz); + } + } + + private class FlywayLog implements Log { + + private ApplicationLogger logger; + + public FlywayLog(Class clazz) { + logger = ApplicationLoggerFactory.getLogger(clazz); + } + + @Override + public boolean isDebugEnabled() { + return logger.isDebugEnabled(); + } + + @Override + public void debug(String message) { + logger.debug(message); + } + + @Override + public void info(String message) { + logger.info(message); + } + + @Override + public void warn(String message) { + logger.warn(message); + } + + @Override + public void error(String message) { + logger.error(message); + } + + @Override + public void error(String message, Exception e) { + logger.error(message, e); + } + + } } diff --git a/src/main/java/net/locusworks/discord/eighttrack/database/config/EightTrackDataSource.java b/src/main/java/net/locusworks/discord/eighttrack/database/config/EightTrackDataSource.java index 6e7d557..dcff30f 100644 --- a/src/main/java/net/locusworks/discord/eighttrack/database/config/EightTrackDataSource.java +++ b/src/main/java/net/locusworks/discord/eighttrack/database/config/EightTrackDataSource.java @@ -36,14 +36,14 @@ import java.util.stream.Collectors; import javax.sql.DataSource; import org.apache.commons.lang3.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.jdbc.DataSourceBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Primary; import org.springframework.stereotype.Component; import net.locusworks.discord.eighttrack.services.ConfigurationService; +import net.locusworks.logger.ApplicationLogger; +import net.locusworks.logger.ApplicationLoggerFactory; @Primary @Component @@ -62,7 +62,7 @@ public class EightTrackDataSource { mysqlProperties.put("serverTimezone", TimeZone.getDefault().getDisplayName(false, TimeZone.SHORT)); } - private Logger logger = LoggerFactory.getLogger(EightTrackDataSource.class); + private ApplicationLogger logger = ApplicationLoggerFactory.getLogger(EightTrackDataSource.class); @Autowired private ConfigurationService confService; @@ -103,7 +103,7 @@ public class EightTrackDataSource { url = String.format("%s?%s", url, StringUtils.join(params, "&")); - logger.debug("Database connection string: %s", url); + logger.debug(String.format("Database connection string: %s", url)); return DataSourceBuilder .create() diff --git a/src/main/java/net/locusworks/discord/eighttrack/handlers/DiscordEventHandler.java b/src/main/java/net/locusworks/discord/eighttrack/handlers/DiscordEventHandler.java index 8c77a8f..f0c9034 100644 --- a/src/main/java/net/locusworks/discord/eighttrack/handlers/DiscordEventHandler.java +++ b/src/main/java/net/locusworks/discord/eighttrack/handlers/DiscordEventHandler.java @@ -106,33 +106,6 @@ public class DiscordEventHandler extends ListenerAdapter { } } - @Override - public void onGuildJoin(GuildJoinEvent event) { - try { - long guildId = event.getGuild().getIdLong(); - DiscordGuild discordGuild = guildSongRepoService.getGuildRepo().findByGuildId(guildId); - if (discordGuild != null) { - guildSongRepoService.logEntry(guildId, "Eight Track joined guild %s", discordGuild.getGuildName()); - return; - } - - logger.debug("Joining Server: " + event.getGuild().getName()); - - discordGuild = new DiscordGuild(); - discordGuild.setGuildId(guildId); - discordGuild.setGuildName(event.getGuild().getName()); - discordGuild.setDateJoined(new Date()); - - guildSongRepoService.getGuildRepo().save(discordGuild); - - guildSongRepoService.logEntry(guildId, "Eight Track joined guild %s", discordGuild.getGuildName()); - - } catch (Exception ex) { - logger.error("Unable to persist server information to database: " + ex.getMessage(), ex); - guildSongRepoService.logEntry(event.getGuild().getIdLong(), ex, "Unable to persist guild server info to database: %s", ex.getMessage()); - } - } - @Override public void onGuildMessageReceived(GuildMessageReceivedEvent event) { if (event.getAuthor().isBot()) return; diff --git a/src/main/java/net/locusworks/discord/eighttrack/listeners/DiscordGuildJoinEventListener.java b/src/main/java/net/locusworks/discord/eighttrack/listeners/DiscordGuildJoinEventListener.java new file mode 100644 index 0000000..ff019cf --- /dev/null +++ b/src/main/java/net/locusworks/discord/eighttrack/listeners/DiscordGuildJoinEventListener.java @@ -0,0 +1,50 @@ +package net.locusworks.discord.eighttrack.listeners; + +import java.util.Date; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import net.dv8tion.jda.api.events.guild.GuildJoinEvent; +import net.dv8tion.jda.api.hooks.ListenerAdapter; +import net.locusworks.discord.eighttrack.annotations.DiscordEventListener; +import net.locusworks.discord.eighttrack.database.entities.DiscordGuild; +import net.locusworks.discord.eighttrack.services.RepositoryService; +import net.locusworks.logger.ApplicationLogger; +import net.locusworks.logger.ApplicationLoggerFactory; + +@Service +@DiscordEventListener +public class DiscordGuildJoinEventListener extends ListenerAdapter { + + private ApplicationLogger logger = ApplicationLoggerFactory.getLogger(DiscordGuildJoinEventListener.class); + + @Autowired + private RepositoryService guildSongRepoService; + + @Override + public void onGuildJoin(GuildJoinEvent event) { + try { + long guildId = event.getGuild().getIdLong(); + DiscordGuild discordGuild = guildSongRepoService.getGuildRepo().findByGuildId(guildId); + if (discordGuild != null) { + guildSongRepoService.logEntry(guildId, "Eight Track joined guild %s", discordGuild.getGuildName()); + return; + } + + logger.debug("Joining Server: " + event.getGuild().getName()); + + discordGuild = new DiscordGuild(); + discordGuild.setGuildId(guildId); + discordGuild.setGuildName(event.getGuild().getName()); + discordGuild.setDateJoined(new Date()); + + guildSongRepoService.getGuildRepo().save(discordGuild); + + guildSongRepoService.logEntry(guildId, "Eight Track joined guild %s", discordGuild.getGuildName()); + + } catch (Exception ex) { + logger.error("Unable to persist server information to database: " + ex.getMessage(), ex); + guildSongRepoService.logEntry(event.getGuild().getIdLong(), ex, "Unable to persist guild server info to database: %s", ex.getMessage()); + } + } + +} diff --git a/src/main/java/net/locusworks/discord/eighttrack/services/DatabaseCleanupService.java b/src/main/java/net/locusworks/discord/eighttrack/services/DatabaseCleanupService.java index 7cae6c7..eb61d39 100644 --- a/src/main/java/net/locusworks/discord/eighttrack/services/DatabaseCleanupService.java +++ b/src/main/java/net/locusworks/discord/eighttrack/services/DatabaseCleanupService.java @@ -30,14 +30,14 @@ package net.locusworks.discord.eighttrack.services; import java.util.Set; import java.util.stream.Collectors; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; import net.dv8tion.jda.api.JDA; import net.locusworks.discord.eighttrack.database.repos.GuildRepository; +import net.locusworks.logger.ApplicationLogger; +import net.locusworks.logger.ApplicationLoggerFactory; @Service public class DatabaseCleanupService { @@ -47,7 +47,7 @@ public class DatabaseCleanupService { private static final long HOUR = 60 * MINUTE; private static final long DAY = 24 * HOUR; - private Logger logger = LoggerFactory.getLogger(DatabaseCleanupService.class); + private ApplicationLogger logger = ApplicationLoggerFactory.getLogger(DatabaseCleanupService.class); @Autowired private GuildRepository guildRepo; diff --git a/src/main/java/net/locusworks/discord/eighttrack/services/EightTrackService.java b/src/main/java/net/locusworks/discord/eighttrack/services/EightTrackService.java index ba10259..efd1a0a 100644 --- a/src/main/java/net/locusworks/discord/eighttrack/services/EightTrackService.java +++ b/src/main/java/net/locusworks/discord/eighttrack/services/EightTrackService.java @@ -27,42 +27,62 @@ */ package net.locusworks.discord.eighttrack.services; +import java.util.List; import javax.security.auth.login.LoginException; - +import org.springframework.beans.BeansException; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.type.filter.AnnotationTypeFilter; +import org.springframework.core.type.filter.TypeFilter; import org.springframework.stereotype.Service; -import net.dv8tion.jda.api.AccountType; import net.dv8tion.jda.api.JDA; import net.dv8tion.jda.api.JDABuilder; -import net.locusworks.discord.eighttrack.handlers.DiscordEventHandler; +import net.dv8tion.jda.api.hooks.ListenerAdapter; +import net.locusworks.discord.eighttrack.annotations.DiscordEventListener; +import net.locusworks.discord.eighttrack.utils.BeanFinder; import net.locusworks.logger.ApplicationLogger; import net.locusworks.logger.ApplicationLoggerFactory; @Service public class EightTrackService { - + private ApplicationLogger logger = ApplicationLoggerFactory.getLogger(EightTrackService.class); - + private static JDA client; - + @Autowired private ConfigurationService confService; - - @Autowired - private DiscordEventHandler eventListener; - + public void begin() throws LoginException { - String token = confService.getDiscordToken(); - logger.debug("Logging in with token %s", token); - - client = new JDABuilder(AccountType.BOT).setToken(token).build(); - client.addEventListener(eventListener); + try { + + final TypeFilter serviceFilter = new AnnotationTypeFilter(Service.class); + final TypeFilter eventListenerFilter = new AnnotationTypeFilter(DiscordEventListener.class); + + List eventListeners = BeanFinder.autowireBeans(ListenerAdapter.class, "net.locusworks.discord.eighttrack", serviceFilter, eventListenerFilter); + if (eventListeners == null ||eventListeners.size() < 1) { + throw new LoginException("No event listeners found. Exiting"); + } + + String token = confService.getDiscordToken(); + JDABuilder builder = JDABuilder.createDefault(token); + logger.debug("Logging in with token %s", token); + + logger.info(String.format("Loading %d listeners", eventListeners.size())); + for (ListenerAdapter la : eventListeners) { + logger.debug("Loading eventListener: %s", la.getClass().getName()); + builder.addEventListeners(la); + } + + client = builder.build(); + + } catch (BeansException e) { + throw new LoginException(e.getMessage()); + } } - + public static JDA getClient() { return client; } - } diff --git a/src/main/java/net/locusworks/discord/eighttrack/utils/ApplicationContextHolder.java b/src/main/java/net/locusworks/discord/eighttrack/utils/ApplicationContextHolder.java new file mode 100644 index 0000000..db4a752 --- /dev/null +++ b/src/main/java/net/locusworks/discord/eighttrack/utils/ApplicationContextHolder.java @@ -0,0 +1,24 @@ +package net.locusworks.discord.eighttrack.utils; + +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.stereotype.Component; + +@Component +public class ApplicationContextHolder implements ApplicationContextAware { + + private static ApplicationContext context; + + @Override + public void setApplicationContext(ApplicationContext ctx) throws BeansException { + if (context == null) { + context = ctx; + } + } + + public static ApplicationContext getContext() { + return context; + } + +} diff --git a/src/main/java/net/locusworks/discord/eighttrack/utils/BeanFinder.java b/src/main/java/net/locusworks/discord/eighttrack/utils/BeanFinder.java new file mode 100644 index 0000000..667c5e5 --- /dev/null +++ b/src/main/java/net/locusworks/discord/eighttrack/utils/BeanFinder.java @@ -0,0 +1,54 @@ +package net.locusworks.discord.eighttrack.utils; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.BeanInitializationException; +import org.springframework.beans.factory.annotation.Autowire; +import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider; +import org.springframework.core.type.classreading.MetadataReader; +import org.springframework.core.type.classreading.MetadataReaderFactory; +import org.springframework.core.type.filter.TypeFilter; + +public class BeanFinder { + + + public static List getBeans(String basePackage, TypeFilter... filters) { + ClassPathScanningCandidateComponentProvider scanner = new ClassPathScanningCandidateComponentProvider(false); + scanner.addIncludeFilter(new TypeFilter() { + + @Override + public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException { + boolean found = true; + + for (TypeFilter filter : filters) { + found &= filter.match(metadataReader, metadataReaderFactory); + } + + return found; + } + }); + + return scanner.findCandidateComponents(basePackage).stream().collect(Collectors.toList()); + } + + @SuppressWarnings("unchecked") + public static List autowireBeans(Class clazz, String basePackage, TypeFilter... filters) throws BeansException { + try { + List list = new ArrayList<>(); + for (BeanDefinition bd : getBeans(basePackage, filters)) { + Object obj = ApplicationContextHolder.getContext().getAutowireCapableBeanFactory().createBean(Class.forName(bd.getBeanClassName()), Autowire.BY_TYPE.value(), true); + if (clazz.isInstance(obj)) { + list.add((T) obj); + } + } + return list; + } catch (Exception ex) { + throw new BeanInitializationException(ex.getMessage(), ex); + } + } + +} diff --git a/src/main/resources/eighttrack.properties b/src/main/resources/eighttrack.properties index e236f40..bf6d46c 100644 --- a/src/main/resources/eighttrack.properties +++ b/src/main/resources/eighttrack.properties @@ -6,5 +6,5 @@ dbHost=localhost dbPort=3306 logLevel=INFO musicDir=E:/Music -discordToken=NjI5MTQ0OTk1ODA2MzE0NTA5.XZVlRQ.7hiB0u4Zp5pxPrPfvdOdyr4TCh4 +discordToken=NjMzMDA2ODIzNzk1OTgyMzQ0.XtLtpA.sramb2b8w4itTFPQ92HqZgyeBJU diff --git a/src/main/resources/log4j2.xml b/src/main/resources/log4j2.xml index 756ed17..3ec8350 100644 --- a/src/main/resources/log4j2.xml +++ b/src/main/resources/log4j2.xml @@ -3,7 +3,7 @@ - %d{dd-MMM-yyyy HH:mm:ss.SSS} [%-5p] [%c{1}] %m%n + %d{dd-MMM-yyyy HH:mm:ss.SSS} %m%n @@ -20,9 +20,10 @@ - - - - + + + + +