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 @@
-
-
-
-
+
+
+
+
+