Compare commits

22 Commits

Author SHA1 Message Date
eb612e1761 Updated license information
All checks were successful
Locusworks Team/eight-track/pipeline/head This commit looks good
2021-09-14 23:26:42 -05:00
a24810a53a Updated libraries
All checks were successful
Locusworks Team/eight-track/pipeline/head This commit looks good
2021-09-14 23:17:06 -05:00
599052a235 Added license header info
All checks were successful
Locusworks Team/eight-track/pipeline/head This commit looks good
2020-10-23 22:47:12 -05:00
2305b314cb Changed music file metadata reader library
All checks were successful
Locusworks Team/eight-track/pipeline/head This commit looks good
2020-10-23 21:35:42 -05:00
4c40d33050 Rework
All checks were successful
Locusworks Team/eight-track/pipeline/head This commit looks good
2020-10-23 11:56:48 -05:00
f051e98768 Updated files to work properly with applogger. Reworking how commands are called?
All checks were successful
Locusworks Team/eight-track/pipeline/head This commit looks good
2020-05-30 21:58:46 -05:00
bbddcb93ba Updated file headers
All checks were successful
Locusworks Team/eight-track/pipeline/head This commit looks good
2020-05-30 17:48:48 -05:00
f4805fd8b5 Switched to using HikariCP for connection pool
All checks were successful
Locusworks Team/eight-track/pipeline/head This commit looks good
2020-05-24 00:32:07 -05:00
79b5c695b0 updated pom.xml
All checks were successful
Locusworks Team/eight-track/pipeline/head This commit looks good
2020-05-22 20:32:58 +01:00
2f89362a8b Refactored how the music handler was being referenced
Some checks failed
Locusworks Team/eight-track/pipeline/head There was a failure building this commit
2020-01-06 21:22:54 -06:00
4c68e6bf09 Fixed an issue with the reaction handler 2020-01-01 14:46:23 -06:00
bc2edd70fe refactored admin actions and updated licenses 2020-01-01 14:35:52 -06:00
431b93d5b8 updated license plugin 2020-01-01 14:11:00 -06:00
c85bea52a2 Refactored how commands are handled 2020-01-01 13:36:33 -06:00
c8260444bb Restructured how events were being handled to clean up the mess 2020-01-01 00:22:02 -06:00
52c8253aa0 Fixed issue with displaying song list 2019-12-30 23:59:30 -06:00
6ec37452f9 switched from dbcp2 to c3p0 pooling. updating libraries 2019-12-30 21:32:32 -06:00
fd3c942164 Added more functionality for admins 2019-12-30 20:22:20 -06:00
75c3892e61 Added ability to list all playlists 2019-10-24 21:33:54 -05:00
232fd1746d Reworked how mp3s are being read and loaded int player 2019-10-15 00:19:48 -05:00
68a472d804 Changed to use local database and started adding admin rights 2019-10-13 16:00:05 -05:00
c169061b07 started implement admin rights
#16 admin rights
2019-10-12 23:33:28 -05:00
69 changed files with 3473 additions and 1091 deletions

1
.gitignore vendored
View File

@ -10,3 +10,4 @@
/key.bin
/logs/
/conf/
.metadata/

112
Jenkinsfile vendored
View File

@ -1,5 +1,16 @@
#!groovy
// Required Jenkins plugins:
// https://wiki.jenkins-ci.org/display/JENKINS/Timestamper
// https://wiki.jenkins-ci.org/display/JENKINS/Static+Code+Analysis+Plug-ins
// https://wiki.jenkins-ci.org/display/JENKINS/Checkstyle+Plugin ?
// https://wiki.jenkins-ci.org/display/JENKINS/FindBugs+Plugin
// https://wiki.jenkins-ci.org/display/JENKINS/PMD+Plugin ?
// https://wiki.jenkins-ci.org/display/JENKINS/DRY+Plugin ?
// https://wiki.jenkins-ci.org/display/JENKINS/Task+Scanner+Plugin
// https://wiki.jenkins-ci.org/display/JENKINS/Javadoc+Plugin
// https://wiki.jenkins-ci.org/display/JENKINS/JaCoCo+Plugin ?
init()
@ -23,7 +34,8 @@ def init() {
build_url = env.BUILD_URL
job_name = "${env.JOB_NAME}"
branch_name = env.BRANCH_NAME
persist = branch_name
branch_name_docker = branch_name.replaceAll(/\//,'.')
persist = "/var/lib/jenkins/PERSIST/${branch_name_docker}"
// execute the branch type specific pipeline code
try {
@ -31,24 +43,27 @@ def init() {
if (branch_name.indexOf('release/')==0) build_type='release'
if (branch_name.indexOf('feature/')==0) build_type='feature'
if (branch_name.indexOf('develop')==0) build_type='develop'
if (branch_name.indexOf('hotfix')==0) build_type='hotfix'
if (branch_name.indexOf('bugfix')==0) build_type='bugfix'
if (branch_name.indexOf('master')==0) build_type='master'
if (branch_name.indexOf('hotfix/')==0) build_type='hotfix'
if (branch_name.indexOf('bugfix/')==0) build_type='bugfix'
switch(build_type) {
case ~/feature/:
case ~/hotfix/:
case ~/bugfix/:
case ~/master/:
case ~/develop/:
CommonBuild();
break;
case ~/release/:
CommonBuild();
// common pipeline elements
node('master') {
Initialize()
SetVersion(build_type)
print_vars() // after SetVersion - all variables now defined
set_result('INPROGRESS')
Build() // builds database via flyway migration
}
if (branch_name.indexOf('develop')==0) {
node('master') {
Deploy();
break;
default:
throw "unsupported branch type: ${branch_name}"
}
} else if (branch_name.indexOf('release/')==0) {
node('master') {
Deploy();
}
}
node('master') {
@ -63,20 +78,9 @@ def init() {
}
}
def CommonBuild() {
// common pipeline elements
node('master') {
Initialize()
SetVersion(build_type)
print_vars() // after SetVersion - all variables now defined
set_result('INPROGRESS')
Build()
}
}
def Build() {
stage ('build') {
mvn_alt("install -DskipTests=true -Dbuild.revision=${git_commit}")
mvn "install -DskipTests=true -Dbuild.revision=${git_commit}"
step([$class: 'ArtifactArchiver', artifacts: '**/target/*.jar', fingerprint: true])
}
}
@ -92,10 +96,8 @@ def Initialize() {
}
def Deploy() {
node('master') {
stage ('deploy') {
mvn_alt("deploy -DskipTests=true -Dbuild.number=${build_number} -Dbuild.revision=${git_commit}")
}
mvn "deploy -DskipTests=true -Dbuild.number=${build_number} -Dbuild.revision=${git_commit}"
}
}
@ -105,17 +107,19 @@ def getSha1() {
return sha1
}
def mvn_initial(args) {
mvn_alt(args)
def mvn(args) {
withMaven(
maven: 'maven-3.6.1',
globalMavenSettingsConfig: 'locusworks-settings'
) {
sh "mvn ${args}"
}
}
def mvn_alt(args) {
// add maven tools to path before calling maven
withMaven(maven: 'maven-3.6.1', jdk: 'jdk1.8.0_221', mavenSettingsConfig: 'maven_settings') {
writeFile file: '.skip-task-scanner', text: ''
writeFile file: '.skip-publish-junit-results', text: ''
sh "mvn ${args}"
}
def mvn_initial(args) {
mvn(args)
}
def set_result(status) {
@ -130,10 +134,13 @@ def set_result(status) {
} else {
error ("unknown status")
}
// save in persistence file for access the status page
// make sure the directory exists first
sh "mkdir -p $persist && echo $status > $persist/build.result"
}
def notify_bitbucket(state) {
echo "notify bitbucket, state = $state, commit: ${git_commit}"
}
def print_vars() {
@ -146,34 +153,33 @@ def print_vars() {
echo "display_name = ${currentBuild.displayName}"
echo "version = ${version}"
echo "git_commit = ${git_commit}"
}
def SetVersion( v ) {
stage ('set version') {
echo "set version ${v}"
branch_name_base = (branch_name =~ /([^\/]+$)/)[0][0]
switch(build_type) {
case ~/develop/:
version = build_number + '-SNAPSHOT'
currentBuild.displayName = version
break;
case ~/release/:
if ( v == 'release' ) {
// for release branches, where the branch is named "release/1.2.3",
// derive the version and display name derive from the numeric suffix and append the build number
// 3.2.1.100
version = branch_name_base + '.' + build_number + '-RELEASE'
version = branch_name_base + "." + build_number + "-RELEASE";
//version = branch_name.substring('release/'.length()) + "." + build_number
currentBuild.displayName = version
break;
default:
} else if (v == 'develop') {
version = branch_name_base + "." + build_number + "-SNAPSHOT";
currentBuild.displayName = version
} else {
// for all other branches the version number is 0 with an appended build number
// and for the display name use the jenkins default #n and add the branch name
// #101 - feature/user/foo
//version = '0.' + build_number
version = branch_name_base + "." + build_number
currentBuild.displayName = "#" + build_number + " - " + branch_name_base
}
display_name = currentBuild.displayName
mvn_initial("versions:set -DnewVersion=${version}")
mvn_initial "versions:set -DnewVersion=${version}"
}
}

View File

@ -1,7 +1,7 @@
Project: ${project.name}, File: ${file.name}
Copyright 2019-${license.git.copyrightLastYear} Locusworks LLC.
Copyright ${project.inceptionYear}-${license.git.copyrightLastYear} Locusworks LLC.
All rights reserved. Federal copyright law prohibits unauthorized reproduction by
any means and imposes fines up to $25,000 for violation. No part of this material
may be reproduced, transmitted, transcribed, stored in a retrieval system, copied,

159
pom.xml
View File

@ -14,23 +14,23 @@
</organization>
<scm>
<url>git@gitea.locusworks.net:Locusworks/eight-track.git</url>
<url>ssh://gitea@gitea.locusworks.net:7999/locusworks/eight-track.git</url>
</scm>
<properties>
<flyway.version>6.0.3</flyway.version>
<mariadb.version>2.4.4</mariadb.version>
<hibernate.version>5.4.4.Final</hibernate.version>
<spring.version>5.1.9.RELEASE</spring.version>
<spring.boot.version>2.1.8.RELEASE</spring.boot.version>
<spring.data.version>2.1.10.RELEASE</spring.data.version>
<log4j.version>2.12.1</log4j.version>
<slf4j.version>1.7.28</slf4j.version>
<maven.enforcer.version>3.0.0-M2</maven.enforcer.version>
<dep.check.version>5.2.2</dep.check.version>
<license-maven-plugin.version>3.0</license-maven-plugin.version>
<nexus.repo>http://nexus.locusworks.net</nexus.repo>
<flyway.version>7.15.0</flyway.version>
<mysql.version>8.0.26</mysql.version>
<hibernate.version>5.5.7.Final</hibernate.version>
<spring.version>5.3.9</spring.version>
<spring.boot.version>2.5.4</spring.boot.version>
<spring.data.version>2.5.4</spring.data.version>
<jackson.version>2.12.5</jackson.version>
<log4j.version>2.14.1</log4j.version>
<slf4j.version>1.7.32</slf4j.version>
<maven.enforcer.version>3.0.0</maven.enforcer.version>
<dep.check.version>6.3.1</dep.check.version>
<license-maven-plugin.version>4.1</license-maven-plugin.version>
<nexus.repo>https://nexus.locusworks.net</nexus.repo>
</properties>
<build>
@ -38,7 +38,7 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<version>3.0.0-M2</version>
<version>${maven.enforcer.version}</version>
<configuration>
<rules>
<dependencyConvergence />
@ -93,13 +93,14 @@
<artifactId>license-maven-plugin</artifactId>
<version>${license-maven-plugin.version}</version>
<configuration>
<quiet>false</quiet>
<header>${basedir}/licenses/LICENSE.template</header>
<strictCheck>true</strictCheck>
<useDefaultExcludes>true</useDefaultExcludes>
<licenseSets>
<licenseSet>
<header>${project.baseUri}/licenses/LICENSE.template</header>
<includes>
<include>**/*.java</include>
</includes>
</licenseSet>
</licenseSets>
</configuration>
<dependencies>
<!-- this dependency allows ${license.git.copyrightLastYear} in the
@ -116,7 +117,7 @@
<artifactId>flyway-maven-plugin</artifactId>
<version>${flyway.version}</version>
<configuration>
<url>jdbc:mariadb://devops.locusworks.net:3306/</url>
<url>jdbc:mysql://localhost:3306/</url>
<outOfOrder>false</outOfOrder>
<schemas>
<schema>eighttrack</schema>
@ -126,13 +127,11 @@
<location>filesystem:${basedir}/src/main/resources/database/migration</location>
</locations>
</configuration>
<!-- <executions> <execution> <phase>process-sources</phase> <goals>
<goal>migrate</goal> </goals> </execution> </executions> -->
<dependencies>
<dependency>
<groupId>org.mariadb.jdbc</groupId>
<artifactId>mariadb-java-client</artifactId>
<version>${mariadb.version}</version>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
</dependencies>
</plugin>
@ -149,26 +148,14 @@
<dependency>
<groupId>net.locusworks</groupId>
<artifactId>crypto</artifactId>
<version>1.0.5-RELEASE</version>
</dependency>
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-core</artifactId>
<version>1.22</version>
</dependency>
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-parsers</artifactId>
<version>1.22</version>
<version>1.0.2-RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/net.dv8tion/JDA2 -->
<dependency>
<groupId>net.dv8tion</groupId>
<artifactId>JDA</artifactId>
<version>4.0.0_50</version>
<version>4.3.0_277</version>
<exclusions>
<exclusion>
<groupId>com.fasterxml.jackson.core</groupId>
@ -188,9 +175,34 @@
<dependency>
<groupId>com.sedmelluq</groupId>
<artifactId>lavaplayer</artifactId>
<version>1.3.22</version>
<version>1.3.77</version>
<exclusions>
<exclusion>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</exclusion>
<exclusion>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.13</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.jsoup/jsoup -->
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.14.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.flywaydb/flyway-core -->
<dependency>
<groupId>org.flywaydb</groupId>
@ -198,17 +210,11 @@
<version>${flyway.version}</version>
</dependency>
<dependency>
<groupId>org.mariadb.jdbc</groupId>
<artifactId>mariadb-java-client</artifactId>
<version>${mariadb.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.17</version>
<version>${mysql.version}</version>
</dependency>
<dependency>
@ -217,14 +223,13 @@
<version>${hibernate.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-dbcp2 -->
<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-c3p0 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>2.7.0</version>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-hikaricp</artifactId>
<version>${hibernate.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot -->
<dependency>
<groupId>org.springframework.boot</groupId>
@ -296,43 +301,54 @@
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.10.0.pr3</version>
<version>${jackson.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.10.0.pr3</version>
<version>${jackson.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.10.0.pr3</version>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.2.11</version>
<version>2.4.0-b180830.0359</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.sun.xml.bind/jaxb-core -->
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-core</artifactId>
<version>2.2.11</version>
<version>3.0.0-M3</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.2.11</version>
<version>3.0.0-M3</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>net.jthink</groupId>
<artifactId>jaudiotagger</artifactId>
<version>2.2.3</version>
</dependency>
</dependencies>
<distributionManagement>
@ -346,4 +362,31 @@
</repository>
</distributionManagement>
<repositories>
<repository>
<id>locusworks-public</id>
<name>locusworks-public</name>
<url>${nexus.repo}/repository/locusworks-public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>locusworks-public</id>
<url>${nexus.repo}/repository/locusworks-public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</project>

1
scripts/start-mysql.ps1 Normal file
View File

@ -0,0 +1 @@
Start-Service -Name "MySQL80"

1
scripts/stop-mysql.ps1 Normal file
View File

@ -0,0 +1 @@
Stop-Service -Name "MySQL80"

View File

@ -0,0 +1,39 @@
/*
*
* Project: Eight Track, File: DiscordEventListener.java
*
* Copyright 2019-2021 Locusworks LLC.
* All rights reserved. Federal copyright law prohibits unauthorized reproduction by
* any means and imposes fines up to $25,000 for violation. No part of this material
* may be reproduced, transmitted, transcribed, stored in a retrieval system, copied,
* modified, duplicated, adapted or translated into another program language in any
* form or by any means, electronic, mechanical, photocopying, recording, or
* otherwise, without the prior written permission from Locusworks. Locusworks
* affirms that Eight-Track(R) software and data is subject to United States
* Government Purpose Rights. Contact Locusworks, 1313 Lawnview Drive
* Forney TX 75126, (802) 488-0438, for commercial licensing opportunities.
*
* IN NO EVENT SHALL LOCUSWORKS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL,
* INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT
* OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF LOCUSWORKS HAS BEEN
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. NO RESPONSIBILITY IS ASSUMED BY
* LOCUSWORKS FOR ITS USE, OR FOR ANY INFRINGEMENTS OF PATENTS OR OTHER RIGHTS OF
* THIRD PARTIES RESULTING FROM ITS USE. LOCUSWORKS SPECIFICALLY DISCLAIMS ANY
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE AND
* ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED HEREUNDER IS PROVIDED "AS
* IS". LOCUSWORKS HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES,
* ENHANCEMENTS, OR MODIFICATIONS.
*/
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 {
}

View File

@ -1,8 +1,8 @@
/**
/*
*
* Project: Eight Track, File: EightTrackAudioSendHandler.java
*
* Copyright 2019-2019 Locusworks LLC.
* Copyright 2019-2021 Locusworks LLC.
* All rights reserved. Federal copyright law prohibits unauthorized reproduction by
* any means and imposes fines up to $25,000 for violation. No part of this material
* may be reproduced, transmitted, transcribed, stored in a retrieval system, copied,
@ -25,7 +25,7 @@
* IS". LOCUSWORKS HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES,
* ENHANCEMENTS, OR MODIFICATIONS.
*/
package net.locusworks.discord.eighttrack.handlers;
package net.locusworks.discord.eighttrack.audio;
import java.nio.ByteBuffer;

View File

@ -1,8 +1,8 @@
/**
/*
*
* Project: Eight Track, File: Mp3UploadHandler.java
*
* Copyright 2019-2019 Locusworks LLC.
* Copyright 2019-2021 Locusworks LLC.
* All rights reserved. Federal copyright law prohibits unauthorized reproduction by
* any means and imposes fines up to $25,000 for violation. No part of this material
* may be reproduced, transmitted, transcribed, stored in a retrieval system, copied,
@ -25,34 +25,31 @@
* IS". LOCUSWORKS HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES,
* ENHANCEMENTS, OR MODIFICATIONS.
*/
package net.locusworks.discord.eighttrack.handlers;
package net.locusworks.discord.eighttrack.audio;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import org.apache.tika.exception.TikaException;
import org.apache.tika.metadata.Metadata;
import org.apache.tika.parser.ParseContext;
import org.apache.tika.parser.mp3.Mp3Parser;
import org.apache.tika.sax.BodyContentHandler;
import java.util.UUID;
import org.jaudiotagger.audio.AudioFile;
import org.jaudiotagger.audio.AudioFileIO;
import org.jaudiotagger.tag.Tag;
import org.springframework.stereotype.Component;
import org.xml.sax.SAXException;
@Component
public class Mp3UploadHandler {
public Mp3UploadResults parse(Path file) throws IOException {
InputStream is = Files.newInputStream(file);
return parse(is);
return parse(is, file.getFileName().toString());
}
public Mp3UploadResults parse(InputStream is) throws IOException {
public Mp3UploadResults parse(InputStream is, String fileName) throws IOException {
byte[] data;
Path tmp = null;
try(InputStream in = is; ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
int read = 0;
byte[] buffer = new byte[1024 * 1024];
@ -60,29 +57,23 @@ public class Mp3UploadHandler {
baos.write(buffer, 0, read);
}
data = baos.toByteArray();
}
try (InputStream in = new ByteArrayInputStream(data)) {
BodyContentHandler handler = new BodyContentHandler();
Metadata metadata = new Metadata();
ParseContext context = new ParseContext();
String id = UUID.nameUUIDFromBytes(data).toString();
Mp3Parser parser = new Mp3Parser();
tmp = Paths.get(String.format("%s_%s", id, fileName));
parser.parse(in, handler, metadata, context);
Files.write(tmp, data);
return new Mp3UploadResults(metadata, data);
AudioFile f = AudioFileIO.read(tmp.toFile());
Tag tag = f.getTag();
return new Mp3UploadResults(tag, data);
} catch (Exception ex) {
throw new IOException(ex);
return new Mp3UploadResults(ex);
} finally {
if (tmp != null) {
Files.deleteIfExists(tmp);
}
}
public static void main(String args[]) throws IOException, SAXException, TikaException {
String file = "E:\\Music2\\Alan Walker\\Itinerary_ Dallas.pdf";
Path path = Paths.get(file);
Mp3UploadHandler fuh = new Mp3UploadHandler();
fuh.parse(path);
}
}

View File

@ -1,8 +1,8 @@
/**
/*
*
* Project: Eight Track, File: Mp3UploadResults.java
*
* Copyright 2019-2019 Locusworks LLC.
* Copyright 2019-2021 Locusworks LLC.
* All rights reserved. Federal copyright law prohibits unauthorized reproduction by
* any means and imposes fines up to $25,000 for violation. No part of this material
* may be reproduced, transmitted, transcribed, stored in a retrieval system, copied,
@ -25,34 +25,13 @@
* IS". LOCUSWORKS HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES,
* ENHANCEMENTS, OR MODIFICATIONS.
*/
package net.locusworks.discord.eighttrack.handlers;
package net.locusworks.discord.eighttrack.audio;
import org.apache.tika.metadata.Metadata;
import org.jaudiotagger.tag.FieldKey;
import org.jaudiotagger.tag.Tag;
public class Mp3UploadResults {
private enum MetaDataField {
GENRE("xmpDM:genre"),
COMPOSER("xmpDM:composer"),
ALBUM("xmpDM:album"),
TRACK_NUMBER("xmpDM:trackNumber"),
DISC_NUMBER("xmpDM:discNumber"),
ARTIST("xmpDM:artist"),
TITLE("title"),
RELEASE_DATE("xmpDM:releaseDate"),
DURATION("xmpDM:duration");
private String value;
private MetaDataField(String value) {
this.value = value;
}
public String getValue() {
return this.value;
}
}
private String genre;
private String composure;
private String album;
@ -61,29 +40,28 @@ public class Mp3UploadResults {
private String artist;
private String title;
private String releaseDate;
private Long duration;
private byte[] rawData;
private Throwable err;
public Mp3UploadResults( Metadata metadata, byte[] data) {
parseResults(metadata);
public Mp3UploadResults(Tag tag, byte[] data) {
parseResults(tag);
this.rawData = data;
}
private void parseResults(Metadata metadata) {
genre = metadata.get(MetaDataField.GENRE.getValue());
composure = metadata.get(MetaDataField.COMPOSER.getValue());
album = metadata.get(MetaDataField.ALBUM.getValue());
trackNumber = metadata.get(MetaDataField.TRACK_NUMBER.getValue());
discNumber = metadata.get(MetaDataField.DISC_NUMBER.getValue());
artist = metadata.get(MetaDataField.ARTIST.getValue());
title = metadata.get(MetaDataField.TITLE.getValue());
releaseDate = metadata.get(MetaDataField.RELEASE_DATE.getValue());
String durationStr = metadata.get(MetaDataField.DURATION.getValue()).trim();
if (durationStr != null) {
duration = Double.valueOf(metadata.get(MetaDataField.DURATION.getValue())).longValue();
public Mp3UploadResults(Throwable err) {
this.err = err;
}
private void parseResults(Tag tag) {
genre = tag.getFirst(FieldKey.GENRE);
composure = tag.getFirst(FieldKey.COMPOSER);
album = tag.getFirst(FieldKey.ALBUM);
trackNumber = tag.getFirst(FieldKey.TRACK);
discNumber = tag.getFirst(FieldKey.DISC_NO);
artist = tag.getFirst(FieldKey.ARTIST);
title = tag.getFirst(FieldKey.TITLE);
releaseDate = tag.getFirst(FieldKey.ORIGINAL_YEAR);
}
public final byte[] getData() {
@ -146,23 +124,24 @@ public class Mp3UploadResults {
return releaseDate;
}
/**
* @return the duration
*/
public final Long getDuration() {
return duration;
}
public final String getDurationFormat() {
return dateFormat(duration);
}
public boolean validFile() {
return getTitle() != null && !getTitle().isEmpty();
return (getTitle() != null && !getTitle().isEmpty() && getArtist() != null && !getArtist().trim().isEmpty()) || this.err != null;
}
public boolean hasError() {
return this.err != null;
}
public Throwable getError() {
return this.err;
}
@Override
public String toString() {
if (this.hasError()) {
return "Unable to parse file due to exception: " + this.err.getMessage();
}
StringBuilder sb = new StringBuilder();
if (getTitle() != null)
sb.append(String.format("%-10s: %s%n", "Title", getTitle()));
@ -185,32 +164,10 @@ public class Mp3UploadResults {
if (getGenre() != null)
sb.append(String.format("%-10s: %s%n", "Genre", getGenre()));
if (duration != null)
sb.append(String.format("%-10s: %s%n", "Duration", dateFormat(getDuration())));
return sb.toString();
}
public void clear() {
rawData = new byte[0];
}
private String dateFormat(long timeInMilliSeconds) {
long seconds = timeInMilliSeconds / 1000;
long minutes = seconds / 60;
long hours = minutes / 60;
long days = hours / 24;
long sec = seconds % 60;
long min = minutes % 60;
long hr = hours % 24;
String time = "" + sec;
if (min > 0) time = min + ":" + time;
if (hr > 0) time = hr + ":" + time;
if (days > 0) time = days + ":" + time;
return time;
}
}

View File

@ -0,0 +1,101 @@
/*
*
* Project: Eight Track, File: TrackManager.java
*
* Copyright 2019-2021 Locusworks LLC.
* All rights reserved. Federal copyright law prohibits unauthorized reproduction by
* any means and imposes fines up to $25,000 for violation. No part of this material
* may be reproduced, transmitted, transcribed, stored in a retrieval system, copied,
* modified, duplicated, adapted or translated into another program language in any
* form or by any means, electronic, mechanical, photocopying, recording, or
* otherwise, without the prior written permission from Locusworks. Locusworks
* affirms that Eight-Track(R) software and data is subject to United States
* Government Purpose Rights. Contact Locusworks, 1313 Lawnview Drive
* Forney TX 75126, (802) 488-0438, for commercial licensing opportunities.
*
* IN NO EVENT SHALL LOCUSWORKS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL,
* INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT
* OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF LOCUSWORKS HAS BEEN
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. NO RESPONSIBILITY IS ASSUMED BY
* LOCUSWORKS FOR ITS USE, OR FOR ANY INFRINGEMENTS OF PATENTS OR OTHER RIGHTS OF
* THIRD PARTIES RESULTING FROM ITS USE. LOCUSWORKS SPECIFICALLY DISCLAIMS ANY
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE AND
* ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED HEREUNDER IS PROVIDED "AS
* IS". LOCUSWORKS HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES,
* ENHANCEMENTS, OR MODIFICATIONS.
*/
package net.locusworks.discord.eighttrack.audio;
import java.lang.reflect.Field;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.function.Consumer;
import com.sedmelluq.discord.lavaplayer.player.AudioPlayerManager;
import com.sedmelluq.discord.lavaplayer.player.DefaultAudioPlayer;
import com.sedmelluq.discord.lavaplayer.player.DefaultAudioPlayerManager;
import com.sedmelluq.discord.lavaplayer.source.AudioSourceManagers;
import com.sedmelluq.discord.lavaplayer.track.AudioTrack;
import com.sedmelluq.discord.lavaplayer.track.AudioTrackEndReason;
public class TrackManager extends DefaultAudioPlayer {
private LinkedBlockingDeque<String> queue;
private AudioPlayerManager playerManager;
private TrackScheduler trackScheduler;
private String currentItem;
public TrackManager() {
super(new DefaultAudioPlayerManager());
this.queue = new LinkedBlockingDeque<String>();
this.trackScheduler = new TrackScheduler();
addListener(trackScheduler);
try {
Field f = this.getClass().getSuperclass().getDeclaredField("manager");
f.setAccessible(true);
this.playerManager = (AudioPlayerManager) f.get(this);
} catch (SecurityException | NoSuchFieldException | IllegalArgumentException | IllegalAccessException e) {
throw new IllegalArgumentException(e);
}
AudioSourceManagers.registerLocalSource(this.playerManager);
}
public void queueLast(String track) {
queue.addLast(track);
}
public void queueNext(String track) {
queue.addFirst(track);
}
public boolean hasTracks() {
return queue.peek() != null && !queue.isEmpty();
}
public String getCurrentItem() {
return currentItem;
}
public AudioTrack play() {
if (!queue.isEmpty()) {
try {
currentItem = queue.poll();
playerManager.loadItem(currentItem, trackScheduler).get();
return trackScheduler.getNextTrack();
} catch (InterruptedException | ExecutionException e) {}
}
return null;
}
public void setFinishedCallback(Consumer<AudioTrackEndReason> callback) {
trackScheduler.setFinishedCallback(callback);
}
public void clearTracks() {
queue.clear();
trackScheduler.clearTracks();
}
}

View File

@ -1,8 +1,8 @@
/**
/*
*
* Project: Eight Track, File: TrackScheduler.java
*
* Copyright 2019-2019 Locusworks LLC.
* Copyright 2019-2021 Locusworks LLC.
* All rights reserved. Federal copyright law prohibits unauthorized reproduction by
* any means and imposes fines up to $25,000 for violation. No part of this material
* may be reproduced, transmitted, transcribed, stored in a retrieval system, copied,
@ -25,7 +25,7 @@
* IS". LOCUSWORKS HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES,
* ENHANCEMENTS, OR MODIFICATIONS.
*/
package net.locusworks.discord.eighttrack.scheduler;
package net.locusworks.discord.eighttrack.audio;
import java.util.Deque;
import java.util.concurrent.LinkedBlockingDeque;

View File

@ -1,8 +1,8 @@
/**
/*
*
* Project: Eight Track, File: EightTrackBeanConfiguration.java
*
* Copyright 2019-2019 Locusworks LLC.
* Copyright 2019-2021 Locusworks LLC.
* All rights reserved. Federal copyright law prohibits unauthorized reproduction by
* any means and imposes fines up to $25,000 for violation. No part of this material
* may be reproduced, transmitted, transcribed, stored in a retrieval system, copied,
@ -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
@ -69,9 +74,6 @@ public class EightTrackBeanConfiguration {
static {
hibernateProperties = new Properties();
hibernateProperties.setProperty("hibernate.connection.zeroDateTimeBehavior", "convertToNull");
hibernateProperties.setProperty("hibernate.dbcp.maxActive", "50");
hibernateProperties.setProperty("hibernate.dbcp.maxIdle", "10");
hibernateProperties.setProperty("hibernate.dbcp.maxWait", "5000");
hibernateProperties.setProperty("hibernate.jdbc.batch_size property", "50");
hibernateProperties.setProperty("hibernate.connection.charSet", "utf8");
hibernateProperties.setProperty("hibernate.connection.characterEncoding", "utf8");
@ -143,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");
@ -153,4 +156,52 @@ 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);
}
}
}

View File

@ -1,8 +1,8 @@
/**
/*
*
* Project: Eight Track, File: EightTrackDataSource.java
*
* Copyright 2019-2019 Locusworks LLC.
* Copyright 2019-2021 Locusworks LLC.
* All rights reserved. Federal copyright law prohibits unauthorized reproduction by
* any means and imposes fines up to $25,000 for violation. No part of this material
* may be reproduced, transmitted, transcribed, stored in a retrieval system, copied,
@ -30,30 +30,20 @@ package net.locusworks.discord.eighttrack.database.config;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.TimeZone;
import java.util.stream.Collectors;
import javax.sql.DataSource;
import org.apache.commons.dbcp2.ConnectionFactory;
import org.apache.commons.dbcp2.DriverManagerConnectionFactory;
import org.apache.commons.dbcp2.PoolableConnection;
import org.apache.commons.dbcp2.PoolableConnectionFactory;
import org.apache.commons.dbcp2.PoolingDataSource;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.pool2.impl.AbandonedConfig;
import org.apache.commons.pool2.impl.GenericObjectPool;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.mariadb.jdbc.MariaDbDataSource;
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
@ -72,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;
@ -84,36 +74,17 @@ public class EightTrackDataSource {
*/
@Bean
public DataSource dataSource() throws Exception {
return getDataSource(false);
logger.debug("Getting datasource");
return getDataSource(confService.getDatabaseUsername(), confService.getDatabasePassword(), "/eighttrack");
}
@Bean
public DataSource flywayDataSource() throws Exception {
logger.debug("Logging in with flyway for migrations");
String user = confService.getDatabaseRootUsername();
String passwd = confService.getDatabaseRootPassword();
String url = String.format("jdbc:mariadb://%s:%d?user=%s&password=%s",
confService.getDatabaseHost(), confService.getDatabasePort(),
user, passwd);
MariaDbDataSource mariadbDS = new MariaDbDataSource(url);
return mariadbDS;
logger.debug("Logging in with flyway for migrations");;
return getDataSource(confService.getDatabaseRootUsername(), confService.getDatabaseRootPassword(), "");
}
private DataSource getDataSource(Boolean isFlyway) throws Exception {
logger.debug("Gettind datasource");
Class.forName(DRIVER).getDeclaredConstructor().newInstance();
String user = confService.getDatabaseUsername();
String passwd = confService.getDatabasePassword();
Properties props = new Properties();
props.setProperty("user", user);
props.setProperty("password", passwd);
private DataSource getDataSource(String user, String passwd, String db) throws Exception {
List<String> params = mysqlProperties
.entrySet()
.stream()
@ -123,40 +94,19 @@ public class EightTrackDataSource {
String host = confService.getDatabaseHost();
int port = confService.getDatabasePort();
String url = String.format(JNDI_STRING, host, port, "/eighttrack");
String url = String.format(JNDI_STRING, host, port, db);
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));
ConnectionFactory cf = new DriverManagerConnectionFactory(url, props);
//Create the poolable connection factory
PoolableConnectionFactory pcf = new PoolableConnectionFactory(cf, null);
pcf.setValidationQuery("SELECT 1");
pcf.setDefaultAutoCommit(true);
GenericObjectPoolConfig<PoolableConnection> poolConfig = new GenericObjectPoolConfig<>();
poolConfig.setMinIdle(10);
poolConfig.setMaxTotal(100);
AbandonedConfig abandonConfig = new AbandonedConfig();
abandonConfig.setRemoveAbandonedTimeout(60);
abandonConfig.setLogAbandoned(false);
abandonConfig.setRemoveAbandonedOnBorrow(true);
abandonConfig.setRemoveAbandonedOnMaintenance(true);
//Create the pool of connections
GenericObjectPool<PoolableConnection> connectionPool = new GenericObjectPool<>(pcf, poolConfig);
connectionPool.setTestOnBorrow(true);
connectionPool.setTestWhileIdle(true);
connectionPool.setTimeBetweenEvictionRunsMillis(10000);
connectionPool.setMinEvictableIdleTimeMillis(1000);
connectionPool.setAbandonedConfig(abandonConfig);
pcf.setPool(connectionPool);
//Pooling data source itself
PoolingDataSource<PoolableConnection> dataSource = new PoolingDataSource<>(connectionPool);
return dataSource;
return DataSourceBuilder
.create()
.username(user)
.password(passwd)
.url(url)
.driverClassName(DRIVER)
.build();
}
}

View File

@ -1,3 +1,30 @@
/*
*
* Project: Eight Track, File: DiscordGuild.java
*
* Copyright 2019-2021 Locusworks LLC.
* All rights reserved. Federal copyright law prohibits unauthorized reproduction by
* any means and imposes fines up to $25,000 for violation. No part of this material
* may be reproduced, transmitted, transcribed, stored in a retrieval system, copied,
* modified, duplicated, adapted or translated into another program language in any
* form or by any means, electronic, mechanical, photocopying, recording, or
* otherwise, without the prior written permission from Locusworks. Locusworks
* affirms that Eight-Track(R) software and data is subject to United States
* Government Purpose Rights. Contact Locusworks, 1313 Lawnview Drive
* Forney TX 75126, (802) 488-0438, for commercial licensing opportunities.
*
* IN NO EVENT SHALL LOCUSWORKS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL,
* INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT
* OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF LOCUSWORKS HAS BEEN
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. NO RESPONSIBILITY IS ASSUMED BY
* LOCUSWORKS FOR ITS USE, OR FOR ANY INFRINGEMENTS OF PATENTS OR OTHER RIGHTS OF
* THIRD PARTIES RESULTING FROM ITS USE. LOCUSWORKS SPECIFICALLY DISCLAIMS ANY
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE AND
* ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED HEREUNDER IS PROVIDED "AS
* IS". LOCUSWORKS HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES,
* ENHANCEMENTS, OR MODIFICATIONS.
*/
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
@ -50,6 +77,8 @@ public class DiscordGuild implements Serializable {
@OneToMany(cascade = CascadeType.ALL, mappedBy = "guild")
private List<GuildSong> guildSongList;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "guild")
private List<Log> logList;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "guild")
private List<GuildPlaylist> guildPlaylistList;
public DiscordGuild() {
@ -105,6 +134,14 @@ public class DiscordGuild implements Serializable {
this.guildSongList = guildSongList;
}
public List<Log> getLogList() {
return logList;
}
public void setLogList(List<Log> logList) {
this.logList = logList;
}
public List<GuildPlaylist> getGuildPlaylistList() {
return guildPlaylistList;
}

View File

@ -1,3 +1,30 @@
/*
*
* Project: Eight Track, File: GuildPlaylist.java
*
* Copyright 2019-2021 Locusworks LLC.
* All rights reserved. Federal copyright law prohibits unauthorized reproduction by
* any means and imposes fines up to $25,000 for violation. No part of this material
* may be reproduced, transmitted, transcribed, stored in a retrieval system, copied,
* modified, duplicated, adapted or translated into another program language in any
* form or by any means, electronic, mechanical, photocopying, recording, or
* otherwise, without the prior written permission from Locusworks. Locusworks
* affirms that Eight-Track(R) software and data is subject to United States
* Government Purpose Rights. Contact Locusworks, 1313 Lawnview Drive
* Forney TX 75126, (802) 488-0438, for commercial licensing opportunities.
*
* IN NO EVENT SHALL LOCUSWORKS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL,
* INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT
* OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF LOCUSWORKS HAS BEEN
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. NO RESPONSIBILITY IS ASSUMED BY
* LOCUSWORKS FOR ITS USE, OR FOR ANY INFRINGEMENTS OF PATENTS OR OTHER RIGHTS OF
* THIRD PARTIES RESULTING FROM ITS USE. LOCUSWORKS SPECIFICALLY DISCLAIMS ANY
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE AND
* ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED HEREUNDER IS PROVIDED "AS
* IS". LOCUSWORKS HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES,
* ENHANCEMENTS, OR MODIFICATIONS.
*/
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates

View File

@ -1,3 +1,30 @@
/*
*
* Project: Eight Track, File: GuildPlaylistSong.java
*
* Copyright 2019-2021 Locusworks LLC.
* All rights reserved. Federal copyright law prohibits unauthorized reproduction by
* any means and imposes fines up to $25,000 for violation. No part of this material
* may be reproduced, transmitted, transcribed, stored in a retrieval system, copied,
* modified, duplicated, adapted or translated into another program language in any
* form or by any means, electronic, mechanical, photocopying, recording, or
* otherwise, without the prior written permission from Locusworks. Locusworks
* affirms that Eight-Track(R) software and data is subject to United States
* Government Purpose Rights. Contact Locusworks, 1313 Lawnview Drive
* Forney TX 75126, (802) 488-0438, for commercial licensing opportunities.
*
* IN NO EVENT SHALL LOCUSWORKS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL,
* INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT
* OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF LOCUSWORKS HAS BEEN
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. NO RESPONSIBILITY IS ASSUMED BY
* LOCUSWORKS FOR ITS USE, OR FOR ANY INFRINGEMENTS OF PATENTS OR OTHER RIGHTS OF
* THIRD PARTIES RESULTING FROM ITS USE. LOCUSWORKS SPECIFICALLY DISCLAIMS ANY
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE AND
* ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED HEREUNDER IS PROVIDED "AS
* IS". LOCUSWORKS HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES,
* ENHANCEMENTS, OR MODIFICATIONS.
*/
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates

View File

@ -1,3 +1,30 @@
/*
*
* Project: Eight Track, File: GuildSong.java
*
* Copyright 2019-2021 Locusworks LLC.
* All rights reserved. Federal copyright law prohibits unauthorized reproduction by
* any means and imposes fines up to $25,000 for violation. No part of this material
* may be reproduced, transmitted, transcribed, stored in a retrieval system, copied,
* modified, duplicated, adapted or translated into another program language in any
* form or by any means, electronic, mechanical, photocopying, recording, or
* otherwise, without the prior written permission from Locusworks. Locusworks
* affirms that Eight-Track(R) software and data is subject to United States
* Government Purpose Rights. Contact Locusworks, 1313 Lawnview Drive
* Forney TX 75126, (802) 488-0438, for commercial licensing opportunities.
*
* IN NO EVENT SHALL LOCUSWORKS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL,
* INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT
* OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF LOCUSWORKS HAS BEEN
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. NO RESPONSIBILITY IS ASSUMED BY
* LOCUSWORKS FOR ITS USE, OR FOR ANY INFRINGEMENTS OF PATENTS OR OTHER RIGHTS OF
* THIRD PARTIES RESULTING FROM ITS USE. LOCUSWORKS SPECIFICALLY DISCLAIMS ANY
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE AND
* ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED HEREUNDER IS PROVIDED "AS
* IS". LOCUSWORKS HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES,
* ENHANCEMENTS, OR MODIFICATIONS.
*/
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates

View File

@ -0,0 +1,173 @@
/*
*
* Project: Eight Track, File: Log.java
*
* Copyright 2019-2021 Locusworks LLC.
* All rights reserved. Federal copyright law prohibits unauthorized reproduction by
* any means and imposes fines up to $25,000 for violation. No part of this material
* may be reproduced, transmitted, transcribed, stored in a retrieval system, copied,
* modified, duplicated, adapted or translated into another program language in any
* form or by any means, electronic, mechanical, photocopying, recording, or
* otherwise, without the prior written permission from Locusworks. Locusworks
* affirms that Eight-Track(R) software and data is subject to United States
* Government Purpose Rights. Contact Locusworks, 1313 Lawnview Drive
* Forney TX 75126, (802) 488-0438, for commercial licensing opportunities.
*
* IN NO EVENT SHALL LOCUSWORKS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL,
* INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT
* OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF LOCUSWORKS HAS BEEN
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. NO RESPONSIBILITY IS ASSUMED BY
* LOCUSWORKS FOR ITS USE, OR FOR ANY INFRINGEMENTS OF PATENTS OR OTHER RIGHTS OF
* THIRD PARTIES RESULTING FROM ITS USE. LOCUSWORKS SPECIFICALLY DISCLAIMS ANY
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE AND
* ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED HEREUNDER IS PROVIDED "AS
* IS". LOCUSWORKS HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES,
* ENHANCEMENTS, OR MODIFICATIONS.
*/
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package net.locusworks.discord.eighttrack.database.entities;
import java.io.Serializable;
import java.util.Date;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.Lob;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
/**
*
* @author isaac
*/
@Entity
@Table(name = "log", catalog = "eighttrack", schema = "")
@NamedQueries({
@NamedQuery(name = "Log.findAll", query = "SELECT l FROM Log l")})
public class Log implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
private Long id;
@Basic(optional = false)
@Lob
@Column(name = "log")
private String log;
@Lob
@Column(name = "exception")
private byte[] exception;
@Basic(optional = false)
@Column(name = "is_exception")
private boolean isException;
@Basic(optional = false)
@Column(name = "date_added")
@Temporal(TemporalType.TIMESTAMP)
private Date dateAdded;
@JoinColumn(name = "guild", referencedColumnName = "id")
@ManyToOne(optional = false)
private DiscordGuild guild;
public Log() {
}
public Log(Long id) {
this.id = id;
}
public Log(Long id, String log, boolean isException, Date dateAdded) {
this.id = id;
this.log = log;
this.isException = isException;
this.dateAdded = dateAdded;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getLog() {
return log;
}
public void setLog(String log) {
this.log = log;
}
public byte[] getException() {
return exception;
}
public void setException(byte[] exception) {
this.exception = exception;
}
public boolean getIsException() {
return isException;
}
public void setIsException(boolean isException) {
this.isException = isException;
}
public Date getDateAdded() {
return dateAdded;
}
public void setDateAdded(Date dateAdded) {
this.dateAdded = dateAdded;
}
public DiscordGuild getGuild() {
return guild;
}
public void setGuild(DiscordGuild guild) {
this.guild = guild;
}
@Override
public int hashCode() {
int hash = 0;
hash += (id != null ? id.hashCode() : 0);
return hash;
}
@Override
public boolean equals(Object object) {
// TODO: Warning - this method won't work in the case the id fields are not set
if (!(object instanceof Log)) {
return false;
}
Log other = (Log) object;
if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
return false;
}
return true;
}
@Override
public String toString() {
return "net.locusworks.discord.eighttrack.database.entities.Log[ id=" + id + " ]";
}
}

View File

@ -1,3 +1,30 @@
/*
*
* Project: Eight Track, File: Song.java
*
* Copyright 2019-2021 Locusworks LLC.
* All rights reserved. Federal copyright law prohibits unauthorized reproduction by
* any means and imposes fines up to $25,000 for violation. No part of this material
* may be reproduced, transmitted, transcribed, stored in a retrieval system, copied,
* modified, duplicated, adapted or translated into another program language in any
* form or by any means, electronic, mechanical, photocopying, recording, or
* otherwise, without the prior written permission from Locusworks. Locusworks
* affirms that Eight-Track(R) software and data is subject to United States
* Government Purpose Rights. Contact Locusworks, 1313 Lawnview Drive
* Forney TX 75126, (802) 488-0438, for commercial licensing opportunities.
*
* IN NO EVENT SHALL LOCUSWORKS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL,
* INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT
* OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF LOCUSWORKS HAS BEEN
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. NO RESPONSIBILITY IS ASSUMED BY
* LOCUSWORKS FOR ITS USE, OR FOR ANY INFRINGEMENTS OF PATENTS OR OTHER RIGHTS OF
* THIRD PARTIES RESULTING FROM ITS USE. LOCUSWORKS SPECIFICALLY DISCLAIMS ANY
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE AND
* ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED HEREUNDER IS PROVIDED "AS
* IS". LOCUSWORKS HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES,
* ENHANCEMENTS, OR MODIFICATIONS.
*/
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates

View File

@ -0,0 +1,39 @@
/*
*
* Project: Eight Track, File: GuildLogRepository.java
*
* Copyright 2019-2021 Locusworks LLC.
* All rights reserved. Federal copyright law prohibits unauthorized reproduction by
* any means and imposes fines up to $25,000 for violation. No part of this material
* may be reproduced, transmitted, transcribed, stored in a retrieval system, copied,
* modified, duplicated, adapted or translated into another program language in any
* form or by any means, electronic, mechanical, photocopying, recording, or
* otherwise, without the prior written permission from Locusworks. Locusworks
* affirms that Eight-Track(R) software and data is subject to United States
* Government Purpose Rights. Contact Locusworks, 1313 Lawnview Drive
* Forney TX 75126, (802) 488-0438, for commercial licensing opportunities.
*
* IN NO EVENT SHALL LOCUSWORKS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL,
* INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT
* OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF LOCUSWORKS HAS BEEN
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. NO RESPONSIBILITY IS ASSUMED BY
* LOCUSWORKS FOR ITS USE, OR FOR ANY INFRINGEMENTS OF PATENTS OR OTHER RIGHTS OF
* THIRD PARTIES RESULTING FROM ITS USE. LOCUSWORKS SPECIFICALLY DISCLAIMS ANY
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE AND
* ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED HEREUNDER IS PROVIDED "AS
* IS". LOCUSWORKS HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES,
* ENHANCEMENTS, OR MODIFICATIONS.
*/
package net.locusworks.discord.eighttrack.database.repos;
import java.util.List;
import org.springframework.data.repository.CrudRepository;
import net.locusworks.discord.eighttrack.database.entities.DiscordGuild;
import net.locusworks.discord.eighttrack.database.entities.Log;
public interface GuildLogRepository extends CrudRepository<Log, Long> {
List<Log> findByGuild(DiscordGuild guild);
}

View File

@ -1,8 +1,8 @@
/**
/*
*
* Project: Eight Track, File: GuildSongRepository.java
* Project: Eight Track, File: GuildPlaylistRepository.java
*
* Copyright 2019-2019 Locusworks LLC.
* Copyright 2019-2021 Locusworks LLC.
* All rights reserved. Federal copyright law prohibits unauthorized reproduction by
* any means and imposes fines up to $25,000 for violation. No part of this material
* may be reproduced, transmitted, transcribed, stored in a retrieval system, copied,
@ -42,6 +42,11 @@ public interface GuildPlaylistRepository extends CrudRepository<GuildPlaylist, L
@Query("SELECT gpl FROM GuildPlaylist gpl WHERE gpl.guild.guildId = ?1 AND gpl.userId = ?2 AND gpl.playlist = ?3")
GuildPlaylist findByGuildAndUserIdAndPlaylist(Long guild, Long userId, String playlist);
List<GuildPlaylist> findByGuild(DiscordGuild guild);
@Query("SELECT DISTINCT gpl FROM GuildPlaylist gpl LEFT JOIN FETCH gpl.guildPlaylistSongList WHERE gpl.guild.guildId = ?1")
List<GuildPlaylist> findByGuildFetchSongs(Long guild);
List<GuildPlaylist> findByGuildAndUserId(DiscordGuild guild, Long userId);
@Query("SELECT gpl FROM GuildPlaylist gpl WHERE gpl.guild.guildId = ?1 AND gpl.userId = ?2")
@ -51,6 +56,6 @@ public interface GuildPlaylistRepository extends CrudRepository<GuildPlaylist, L
List<GuildPlaylist> findByGuildAndUserIdFetchSongs(Long guild, Long userId);
@Query("SELECT DISTINCT gpl FROM GuildPlaylist gpl LEFT JOIN FETCH gpl.guildPlaylistSongList WHERE gpl.guild.guildId = ?1 AND gpl.userId = ?2 AND gpl.playlist = ?3")
GuildPlaylist findGuildUserPlaylistFetchSongs(Long guild, Long userId, String playlist);
GuildPlaylist findByGuildUserPlaylistFetchSongs(Long guild, Long userId, String playlist);
}

View File

@ -1,8 +1,8 @@
/**
/*
*
* Project: Eight Track, File: GuildSongRepository.java
* Project: Eight Track, File: GuildPlaylistSongRepository.java
*
* Copyright 2019-2019 Locusworks LLC.
* Copyright 2019-2021 Locusworks LLC.
* All rights reserved. Federal copyright law prohibits unauthorized reproduction by
* any means and imposes fines up to $25,000 for violation. No part of this material
* may be reproduced, transmitted, transcribed, stored in a retrieval system, copied,

View File

@ -1,8 +1,8 @@
/**
/*
*
* Project: Eight Track, File: GuildRepository.java
*
* Copyright 2019-2019 Locusworks LLC.
* Copyright 2019-2021 Locusworks LLC.
* All rights reserved. Federal copyright law prohibits unauthorized reproduction by
* any means and imposes fines up to $25,000 for violation. No part of this material
* may be reproduced, transmitted, transcribed, stored in a retrieval system, copied,

View File

@ -1,8 +1,8 @@
/**
/*
*
* Project: Eight Track, File: GuildSongRepository.java
*
* Copyright 2019-2019 Locusworks LLC.
* Copyright 2019-2021 Locusworks LLC.
* All rights reserved. Federal copyright law prohibits unauthorized reproduction by
* any means and imposes fines up to $25,000 for violation. No part of this material
* may be reproduced, transmitted, transcribed, stored in a retrieval system, copied,
@ -28,6 +28,7 @@
package net.locusworks.discord.eighttrack.database.repos;
import java.util.List;
import java.util.Set;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
@ -53,4 +54,9 @@ public interface GuildSongRepository extends CrudRepository<GuildSong, Long> {
@Query("SELECT gs FROM GuildSong gs WHERE gs.guild.guildId = ?1 ORDER BY RAND()")
List<GuildSong> findRandomSong(Long guildId);
List<GuildSong> findByGuildAndUuidIn(DiscordGuild guild, Set<String> uuid);
@Query("SELECT gs FROM GuildSong gs WHERE gs.guild.guildId = ?1 AND gs.uuid in ?2")
List<GuildSong> findByGuildAndUuidIn(Long guildId, Set<String> uuid);
}

View File

@ -1,8 +1,8 @@
/**
/*
*
* Project: Eight Track, File: SongRepository.java
*
* Copyright 2019-2019 Locusworks LLC.
* Copyright 2019-2021 Locusworks LLC.
* All rights reserved. Federal copyright law prohibits unauthorized reproduction by
* any means and imposes fines up to $25,000 for violation. No part of this material
* may be reproduced, transmitted, transcribed, stored in a retrieval system, copied,

View File

@ -1,8 +1,8 @@
/**
/*
*
* Project: Eight Track, File: Configuration.java
*
* Copyright 2019-2019 Locusworks LLC.
* Copyright 2019-2021 Locusworks LLC.
* All rights reserved. Federal copyright law prohibits unauthorized reproduction by
* any means and imposes fines up to $25,000 for violation. No part of this material
* may be reproduced, transmitted, transcribed, stored in a retrieval system, copied,

View File

@ -0,0 +1,106 @@
/*
*
* Project: Eight Track, File: AbstractEvent.java
*
* Copyright 2019-2021 Locusworks LLC.
* All rights reserved. Federal copyright law prohibits unauthorized reproduction by
* any means and imposes fines up to $25,000 for violation. No part of this material
* may be reproduced, transmitted, transcribed, stored in a retrieval system, copied,
* modified, duplicated, adapted or translated into another program language in any
* form or by any means, electronic, mechanical, photocopying, recording, or
* otherwise, without the prior written permission from Locusworks. Locusworks
* affirms that Eight-Track(R) software and data is subject to United States
* Government Purpose Rights. Contact Locusworks, 1313 Lawnview Drive
* Forney TX 75126, (802) 488-0438, for commercial licensing opportunities.
*
* IN NO EVENT SHALL LOCUSWORKS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL,
* INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT
* OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF LOCUSWORKS HAS BEEN
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. NO RESPONSIBILITY IS ASSUMED BY
* LOCUSWORKS FOR ITS USE, OR FOR ANY INFRINGEMENTS OF PATENTS OR OTHER RIGHTS OF
* THIRD PARTIES RESULTING FROM ITS USE. LOCUSWORKS SPECIFICALLY DISCLAIMS ANY
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE AND
* ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED HEREUNDER IS PROVIDED "AS
* IS". LOCUSWORKS HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES,
* ENHANCEMENTS, OR MODIFICATIONS.
*/
package net.locusworks.discord.eighttrack.events;
import java.util.List;
import net.dv8tion.jda.api.Permission;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent;
import net.dv8tion.jda.api.exceptions.ErrorResponseException;
import net.dv8tion.jda.api.requests.ErrorResponse;
import net.locusworks.discord.eighttrack.handlers.ReactionHandler;
public abstract class AbstractEvent {
private String command;
protected AbstractEvent(String command) {
this.command = command;
}
public String getCommand() {
return this.command;
}
public abstract void executeEvent(GuildMessageReceivedEvent event, List<String> commands);
public abstract String help();
protected boolean isAdmin(GuildMessageReceivedEvent event) {
if (!event.getMessage().getMember().hasPermission(Permission.ADMINISTRATOR, Permission.MANAGE_SERVER)) {
event.getChannel().sendMessage(String.format("Sorry <@%s> i can't do that. *psst: you have to have manage server, or administrator role*", event.getMember().getIdLong())).queue();
return false;
}
return true;
}
protected boolean checkCommands(GuildMessageReceivedEvent event, List<String> commands, String msg) {
return checkCommands(event, commands, 0, msg);
}
protected boolean checkCommands(GuildMessageReceivedEvent event, List<String> commands, int minParams, String msg) {
if (commands == null || commands.isEmpty() || commands.size() < minParams) {
event.getChannel().sendMessage(msg).queue();
return false;
}
return true;
}
protected void sendMessage(GuildMessageReceivedEvent event, String msg) {
sendMessage(event, msg, false);
}
protected void sendMessage(GuildMessageReceivedEvent event, String msg, boolean wait) {
if (!wait) {
event.getChannel().sendMessage(msg).queue();
} else {
event.getChannel().sendMessage(msg).complete();
}
}
protected void sendMessage(GuildMessageReceivedEvent event, String msgFmt, Object... args) {
sendMessage(event, String.format(msgFmt, args));
}
protected void sendMessage(GuildMessageReceivedEvent event, boolean wait, String msgFmt, Object... args) {
sendMessage(event, String.format(msgFmt, args), wait);
}
protected void deleteMessage(Message msg, ReactionHandler reactionHandler, Long guildId) {
try {
msg.delete().complete();
if (reactionHandler != null) {
reactionHandler.removeReactionListener(guildId, msg.getIdLong());
}
} catch (ErrorResponseException ex) {
if (ex.getErrorResponse() != ErrorResponse.UNKNOWN_MESSAGE) throw ex;
}
}
}

View File

@ -0,0 +1,39 @@
/*
*
* Project: Eight Track, File: AbstractAdminEventHandler.java
*
* Copyright 2019-2021 Locusworks LLC.
* All rights reserved. Federal copyright law prohibits unauthorized reproduction by
* any means and imposes fines up to $25,000 for violation. No part of this material
* may be reproduced, transmitted, transcribed, stored in a retrieval system, copied,
* modified, duplicated, adapted or translated into another program language in any
* form or by any means, electronic, mechanical, photocopying, recording, or
* otherwise, without the prior written permission from Locusworks. Locusworks
* affirms that Eight-Track(R) software and data is subject to United States
* Government Purpose Rights. Contact Locusworks, 1313 Lawnview Drive
* Forney TX 75126, (802) 488-0438, for commercial licensing opportunities.
*
* IN NO EVENT SHALL LOCUSWORKS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL,
* INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT
* OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF LOCUSWORKS HAS BEEN
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. NO RESPONSIBILITY IS ASSUMED BY
* LOCUSWORKS FOR ITS USE, OR FOR ANY INFRINGEMENTS OF PATENTS OR OTHER RIGHTS OF
* THIRD PARTIES RESULTING FROM ITS USE. LOCUSWORKS SPECIFICALLY DISCLAIMS ANY
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE AND
* ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED HEREUNDER IS PROVIDED "AS
* IS". LOCUSWORKS HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES,
* ENHANCEMENTS, OR MODIFICATIONS.
*/
package net.locusworks.discord.eighttrack.events.admin;
import net.locusworks.discord.eighttrack.events.AbstractEvent;
public abstract class AbstractAdminEventHandler extends AbstractEvent {
public AbstractAdminEventHandler(String command) {
super(command);
}
}

View File

@ -0,0 +1,129 @@
/*
*
* Project: Eight Track, File: AdminPlaylistDeleteHandler.java
*
* Copyright 2019-2021 Locusworks LLC.
* All rights reserved. Federal copyright law prohibits unauthorized reproduction by
* any means and imposes fines up to $25,000 for violation. No part of this material
* may be reproduced, transmitted, transcribed, stored in a retrieval system, copied,
* modified, duplicated, adapted or translated into another program language in any
* form or by any means, electronic, mechanical, photocopying, recording, or
* otherwise, without the prior written permission from Locusworks. Locusworks
* affirms that Eight-Track(R) software and data is subject to United States
* Government Purpose Rights. Contact Locusworks, 1313 Lawnview Drive
* Forney TX 75126, (802) 488-0438, for commercial licensing opportunities.
*
* IN NO EVENT SHALL LOCUSWORKS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL,
* INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT
* OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF LOCUSWORKS HAS BEEN
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. NO RESPONSIBILITY IS ASSUMED BY
* LOCUSWORKS FOR ITS USE, OR FOR ANY INFRINGEMENTS OF PATENTS OR OTHER RIGHTS OF
* THIRD PARTIES RESULTING FROM ITS USE. LOCUSWORKS SPECIFICALLY DISCLAIMS ANY
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE AND
* ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED HEREUNDER IS PROVIDED "AS
* IS". LOCUSWORKS HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES,
* ENHANCEMENTS, OR MODIFICATIONS.
*/
package net.locusworks.discord.eighttrack.events.admin.handlers;
import java.awt.Color;
import java.time.OffsetDateTime;
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.MessageEmbed;
import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent;
import net.locusworks.discord.eighttrack.database.entities.GuildPlaylist;
import net.locusworks.discord.eighttrack.events.admin.AbstractAdminEventHandler;
import net.locusworks.discord.eighttrack.handlers.ReactionHandler;
import net.locusworks.discord.eighttrack.listeners.ReactionListener;
import net.locusworks.discord.eighttrack.services.RepositoryService;
import net.locusworks.discord.eighttrack.utils.Reactions;
import net.locusworks.logger.ApplicationLogger;
import net.locusworks.logger.ApplicationLoggerFactory;
@Component
public class AdminPlaylistDeleteHandler extends AbstractAdminEventHandler {
private ApplicationLogger logger;
@Autowired
private RepositoryService guildRepoService;
@Autowired
private ReactionHandler reactionHandler;
public AdminPlaylistDeleteHandler() {
super("delete");
logger = ApplicationLoggerFactory.getLogger(AdminPlaylistDeleteHandler.class);
}
@Override
public void executeEvent(GuildMessageReceivedEvent event, List<String> commands) {
if (!isAdmin(event)) return;
if (!checkCommands(event, commands, 2, "Must provide playlist and user's tag (in that order)")) return;
String playlist = commands.remove(0);
String userTag = commands.remove(0);
Member m = event.getGuild().getMemberByTag(userTag);
if (m == null) {
sendMessage(event, String.format("Unable to find user with tag %s", userTag));
return;
}
GuildPlaylist gpl = guildRepoService.getGuildPlaylistRepo().findByGuildAndUserIdAndPlaylist(event.getGuild().getIdLong(), m.getIdLong(), playlist);
if (gpl == null) {
sendMessage(event, String.format("Unable to find play list %s for user %s", playlist, userTag));
return;
}
long userId = event.getMember().getIdLong();
MessageEmbed embed = new EmbedBuilder()
.setColor(Color.RED)
.setTitle("Delete Playlist " + playlist)
.setDescription("Are you sure you want to delete the playlist " + playlist)
.setTimestamp(OffsetDateTime.now())
.setFooter(event.getGuild().getSelfMember().getEffectiveName(), event.getGuild().getSelfMember().getUser().getAvatarUrl())
.build();
event.getChannel().sendMessage(embed).queue((msg) -> {
ReactionListener<String> handler = new ReactionListener<>(userId, msg.getId());
handler.setExpiresIn(TimeUnit.MINUTES, 1);
handler.registerReaction(Reactions.CHECK_MARK_BUTTON, (ret) -> deletePlayListConfirm(gpl, event.getMember().getAsMention(), msg));
handler.registerReaction(Reactions.CROSS_MARK_BUTTON, (ret) -> deleteMessage(msg, reactionHandler, event.getGuild().getIdLong()));
reactionHandler.addReactionListener( event.getGuild().getIdLong(), msg, handler);
});
return;
}
private void deletePlayListConfirm(GuildPlaylist gpl, String user, Message msg) {
String playlist = gpl.getPlaylist();
try {
guildRepoService.getGuildPlaylistRepo().delete(gpl);
msg.getChannel().sendMessage(user + " " + playlist + " deleted successfully").complete();
} catch (Exception ex) {
msg.getChannel().sendMessage("Sorry " + user + " I was unable to remove playlist " + playlist + ". Reason: " + ex.getMessage()).complete();
logger.error("Unable to delete playlist " + playlist + ": " + ex.getMessage());
logger.error(ex);
guildRepoService.logEntry(msg.getGuild().getIdLong(), ex, "Unable to delete playlist: %s", ex.getMessage());
} finally {
deleteMessage(msg, reactionHandler, msg.getGuild().getIdLong());
}
}
@Override
public String help() {
return "delete <playlist name> <user discord tag>";
}
}

View File

@ -0,0 +1,93 @@
/*
*
* Project: Eight Track, File: AdminPlaylistListHandler.java
*
* Copyright 2019-2021 Locusworks LLC.
* All rights reserved. Federal copyright law prohibits unauthorized reproduction by
* any means and imposes fines up to $25,000 for violation. No part of this material
* may be reproduced, transmitted, transcribed, stored in a retrieval system, copied,
* modified, duplicated, adapted or translated into another program language in any
* form or by any means, electronic, mechanical, photocopying, recording, or
* otherwise, without the prior written permission from Locusworks. Locusworks
* affirms that Eight-Track(R) software and data is subject to United States
* Government Purpose Rights. Contact Locusworks, 1313 Lawnview Drive
* Forney TX 75126, (802) 488-0438, for commercial licensing opportunities.
*
* IN NO EVENT SHALL LOCUSWORKS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL,
* INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT
* OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF LOCUSWORKS HAS BEEN
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. NO RESPONSIBILITY IS ASSUMED BY
* LOCUSWORKS FOR ITS USE, OR FOR ANY INFRINGEMENTS OF PATENTS OR OTHER RIGHTS OF
* THIRD PARTIES RESULTING FROM ITS USE. LOCUSWORKS SPECIFICALLY DISCLAIMS ANY
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE AND
* ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED HEREUNDER IS PROVIDED "AS
* IS". LOCUSWORKS HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES,
* ENHANCEMENTS, OR MODIFICATIONS.
*/
package net.locusworks.discord.eighttrack.events.admin.handlers;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent;
import net.locusworks.discord.eighttrack.database.entities.GuildPlaylist;
import net.locusworks.discord.eighttrack.events.admin.AbstractAdminEventHandler;
import net.locusworks.discord.eighttrack.services.RepositoryService;
@Component
public class AdminPlaylistListHandler extends AbstractAdminEventHandler {
@Autowired
private RepositoryService guildRepoService;
public AdminPlaylistListHandler() {
super("list");
}
@Override
public void executeEvent(GuildMessageReceivedEvent event, List<String> commands) {
if (!isAdmin(event)) return;
List<GuildPlaylist> userPlaylist = guildRepoService.getGuildPlaylistRepo().findByGuildFetchSongs(event.getGuild().getIdLong());
if (userPlaylist == null || userPlaylist.isEmpty()) {
event.getChannel().sendMessage(event.getAuthor().getAsMention() + ", there are no playlists for this guild").queue();
return;
}
int longestPlaylist = 10;
int longestUserName = 10;
Map<Long, String> userMap = new HashMap<>();
for(GuildPlaylist gpl : userPlaylist) {
if (gpl.getPlaylist().length() > longestPlaylist) longestPlaylist = gpl.getPlaylist().length();
Member m = event.getGuild().getMemberById(gpl.getUserId());
if (m == null) continue;
if (m.getUser().getAsTag().length() > longestUserName) longestUserName = m.getUser().getAsTag().length();
userMap.put(gpl.getUserId(), m.getUser().getAsTag());
}
String fmt = "%6s | %-" + longestPlaylist +"s | %-" + longestUserName + "s | %s%n";
StringBuilder sb = new StringBuilder("```");
sb.append(String.format(fmt, "", "Playlist", "User", "Song Count"));
sb.append(StringUtils.repeat("-", 24 + longestPlaylist + longestUserName)).append("\n");
int count = 0;
for(GuildPlaylist gpl : userPlaylist) {
sb.append(String.format(fmt, ++count, gpl.getPlaylist(), userMap.get(gpl.getUserId()), gpl.getGuildPlaylistSongList().size()));
}
sb.append("```");
event.getChannel().sendMessage("**Playlists for " + event.getGuild().getName() + "**").queue((succcess)->
event.getChannel().sendMessage(sb.toString()).queue());
}
@Override
public String help() {
return "list" ;
}
}

View File

@ -0,0 +1,39 @@
/*
*
* Project: Eight Track, File: AbstractMainEventHandler.java
*
* Copyright 2019-2021 Locusworks LLC.
* All rights reserved. Federal copyright law prohibits unauthorized reproduction by
* any means and imposes fines up to $25,000 for violation. No part of this material
* may be reproduced, transmitted, transcribed, stored in a retrieval system, copied,
* modified, duplicated, adapted or translated into another program language in any
* form or by any means, electronic, mechanical, photocopying, recording, or
* otherwise, without the prior written permission from Locusworks. Locusworks
* affirms that Eight-Track(R) software and data is subject to United States
* Government Purpose Rights. Contact Locusworks, 1313 Lawnview Drive
* Forney TX 75126, (802) 488-0438, for commercial licensing opportunities.
*
* IN NO EVENT SHALL LOCUSWORKS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL,
* INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT
* OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF LOCUSWORKS HAS BEEN
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. NO RESPONSIBILITY IS ASSUMED BY
* LOCUSWORKS FOR ITS USE, OR FOR ANY INFRINGEMENTS OF PATENTS OR OTHER RIGHTS OF
* THIRD PARTIES RESULTING FROM ITS USE. LOCUSWORKS SPECIFICALLY DISCLAIMS ANY
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE AND
* ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED HEREUNDER IS PROVIDED "AS
* IS". LOCUSWORKS HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES,
* ENHANCEMENTS, OR MODIFICATIONS.
*/
package net.locusworks.discord.eighttrack.events.main;
import net.locusworks.discord.eighttrack.events.AbstractEvent;
public abstract class AbstractMainEventHandler extends AbstractEvent {
public AbstractMainEventHandler(String command) {
super(command);
}
}

View File

@ -0,0 +1,102 @@
/*
*
* Project: Eight Track, File: AdminPlaylistHandler.java
*
* Copyright 2019-2021 Locusworks LLC.
* All rights reserved. Federal copyright law prohibits unauthorized reproduction by
* any means and imposes fines up to $25,000 for violation. No part of this material
* may be reproduced, transmitted, transcribed, stored in a retrieval system, copied,
* modified, duplicated, adapted or translated into another program language in any
* form or by any means, electronic, mechanical, photocopying, recording, or
* otherwise, without the prior written permission from Locusworks. Locusworks
* affirms that Eight-Track(R) software and data is subject to United States
* Government Purpose Rights. Contact Locusworks, 1313 Lawnview Drive
* Forney TX 75126, (802) 488-0438, for commercial licensing opportunities.
*
* IN NO EVENT SHALL LOCUSWORKS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL,
* INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT
* OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF LOCUSWORKS HAS BEEN
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. NO RESPONSIBILITY IS ASSUMED BY
* LOCUSWORKS FOR ITS USE, OR FOR ANY INFRINGEMENTS OF PATENTS OR OTHER RIGHTS OF
* THIRD PARTIES RESULTING FROM ITS USE. LOCUSWORKS SPECIFICALLY DISCLAIMS ANY
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE AND
* ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED HEREUNDER IS PROVIDED "AS
* IS". LOCUSWORKS HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES,
* ENHANCEMENTS, OR MODIFICATIONS.
*/
package net.locusworks.discord.eighttrack.events.main.handlers;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeMap;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent;
import net.locusworks.discord.eighttrack.events.admin.AbstractAdminEventHandler;
import net.locusworks.discord.eighttrack.events.main.AbstractMainEventHandler;
import net.locusworks.discord.eighttrack.services.RepositoryService;
import net.locusworks.logger.ApplicationLogger;
import net.locusworks.logger.ApplicationLoggerFactory;
@Component
public class AdminPlaylistHandler extends AbstractMainEventHandler {
private ApplicationLogger logger;
@Autowired
private RepositoryService guildRepoService;
private Map<String, AbstractAdminEventHandler> handlers;
public AdminPlaylistHandler() {
super("+playlist");
logger = ApplicationLoggerFactory.getLogger(AdminPlaylistHandler.class);
}
@Autowired
private void init(List<AbstractAdminEventHandler> eventHandlers) {
handlers = new TreeMap<>();
for(AbstractAdminEventHandler apeh : eventHandlers) {
handlers.put(apeh.getCommand(), apeh);
}
}
@Override
public void executeEvent(GuildMessageReceivedEvent event, List<String> commands) {
if (!isAdmin(event)) return;
if (commands == null || commands.isEmpty()) {
event.getChannel().sendMessage("Missing command for +playlist. Valid commands are: list, delete").queue();
return;
}
try {
String command = commands.remove(0);
AbstractAdminEventHandler apeh = handlers.get(command);
if (apeh == null) {
sendMessage(event, help());
return;
}
apeh.executeEvent(event, commands);
} catch (Exception ex) {
logger.error("Unable to display playlist: " + ex.getMessage(), ex);
guildRepoService.logEntry(event.getGuild().getIdLong(), ex, "Unable to display playlist: %s", ex.getMessage());
sendMessage(event, "Sorry I am unable to display the playlist: " + ex.getMessage());
}
}
@Override
public String help() {
StringBuilder sb = new StringBuilder();
for(Entry<String, AbstractAdminEventHandler> entry : handlers.entrySet()) {
sb.append(entry.getValue().help()).append("\n");
}
return "+playlist | " + sb.toString();
}
}

View File

@ -0,0 +1,134 @@
/*
*
* Project: Eight Track, File: DeleteSongHandler.java
*
* Copyright 2019-2021 Locusworks LLC.
* All rights reserved. Federal copyright law prohibits unauthorized reproduction by
* any means and imposes fines up to $25,000 for violation. No part of this material
* may be reproduced, transmitted, transcribed, stored in a retrieval system, copied,
* modified, duplicated, adapted or translated into another program language in any
* form or by any means, electronic, mechanical, photocopying, recording, or
* otherwise, without the prior written permission from Locusworks. Locusworks
* affirms that Eight-Track(R) software and data is subject to United States
* Government Purpose Rights. Contact Locusworks, 1313 Lawnview Drive
* Forney TX 75126, (802) 488-0438, for commercial licensing opportunities.
*
* IN NO EVENT SHALL LOCUSWORKS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL,
* INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT
* OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF LOCUSWORKS HAS BEEN
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. NO RESPONSIBILITY IS ASSUMED BY
* LOCUSWORKS FOR ITS USE, OR FOR ANY INFRINGEMENTS OF PATENTS OR OTHER RIGHTS OF
* THIRD PARTIES RESULTING FROM ITS USE. LOCUSWORKS SPECIFICALLY DISCLAIMS ANY
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE AND
* ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED HEREUNDER IS PROVIDED "AS
* IS". LOCUSWORKS HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES,
* ENHANCEMENTS, OR MODIFICATIONS.
*/
package net.locusworks.discord.eighttrack.events.main.handlers;
import java.awt.Color;
import java.time.OffsetDateTime;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.MessageEmbed;
import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent;
import net.locusworks.discord.eighttrack.database.entities.GuildSong;
import net.locusworks.discord.eighttrack.events.main.AbstractMainEventHandler;
import net.locusworks.discord.eighttrack.handlers.ReactionHandler;
import net.locusworks.discord.eighttrack.listeners.ReactionListener;
import net.locusworks.discord.eighttrack.services.RepositoryService;
import net.locusworks.discord.eighttrack.utils.Reactions;
import net.locusworks.logger.ApplicationLogger;
import net.locusworks.logger.ApplicationLoggerFactory;
@Component
public class DeleteSongHandler extends AbstractMainEventHandler {
private ApplicationLogger logger;
@Autowired
private RepositoryService guildRepoService;
@Autowired
private ReactionHandler reactionHandler;
public DeleteSongHandler() {
super("+delete");
logger = ApplicationLoggerFactory.getLogger(DeleteSongHandler.class);
}
@Override
public void executeEvent(GuildMessageReceivedEvent event, List<String> commands) {
if(!isAdmin(event)) return;
if (commands == null || commands.isEmpty()) {
event.getChannel().sendMessage(event.getMember().getAsMention() + ", Missing command for +delete. Valid command is : +delete uuids...").queue();
return;
}
deleteSong(event, commands);
}
private void deleteSong(GuildMessageReceivedEvent event, List<String> commands) {
if(!checkCommands(event, commands,
event.getAuthor().getAsMention() + ", you have to provide the list of uuids for songs to remove")) return;
List<GuildSong> songs = guildRepoService.getGuildSongRepo().findByGuildAndUuidIn(event.getGuild().getIdLong(), commands.stream().collect(Collectors.toSet()));
if (songs.isEmpty()) {
event.getChannel().sendMessage(event.getAuthor().getAsMention() + ", there are no songs for this guild").queue();
return;
}
StringBuilder sb = new StringBuilder("Are you sure you want to delete the following songs?\n");
for (GuildSong gs : songs) {
sb.append(String.format("**%s** by __%s__%n", gs.getSong().getTitle(), gs.getSong().getArtist()));
}
MessageEmbed embed = new EmbedBuilder()
.setColor(Color.RED)
.setTitle("Delete Playlist Songs")
.setDescription(sb.toString())
.setTimestamp(OffsetDateTime.now())
.setFooter(event.getGuild().getSelfMember().getEffectiveName(), event.getGuild().getSelfMember().getUser().getAvatarUrl())
.build();
event.getChannel().sendMessage(embed).queue((msg) -> {
ReactionListener<String> handler = new ReactionListener<>(event.getAuthor().getIdLong(), msg.getId());
handler.setExpiresIn(TimeUnit.MINUTES, 1);
handler.registerReaction(Reactions.CHECK_MARK_BUTTON, (ret) -> deleteGuildSongsConfirm(songs, event.getMember().getAsMention(), msg));
handler.registerReaction(Reactions.CROSS_MARK_BUTTON, (ret) -> deleteMessage(msg, reactionHandler, event.getGuild().getIdLong()));
reactionHandler.addReactionListener(event.getGuild().getIdLong(), msg, handler);
});
}
private void deleteGuildSongsConfirm(List<GuildSong> songs, String user, Message msg) {
try {
guildRepoService.getGuildSongRepo().deleteAll(songs);
msg.getChannel().sendMessage(user + ", songs were deleted successfully").complete();
} catch (Exception ex) {
msg.getChannel().sendMessage("Sorry " + user + " I was unable to remove the selected songs. Reason: " + ex.getMessage()).complete();
logger.error("Unable to delete songs: " + ex.getMessage());
logger.error(ex);
guildRepoService.logEntry(msg.getGuild().getIdLong(), ex, "Unable to delete songs: %s", ex.getMessage());
} finally {
deleteMessage(msg, reactionHandler, msg.getGuild().getIdLong());
}
}
@Override
public String help() {
return "-next <id of song to play> (will stop song if one already playing)";
}
}

View File

@ -0,0 +1,74 @@
/*
*
* Project: Eight Track, File: NextSongHandler.java
*
* Copyright 2019-2021 Locusworks LLC.
* All rights reserved. Federal copyright law prohibits unauthorized reproduction by
* any means and imposes fines up to $25,000 for violation. No part of this material
* may be reproduced, transmitted, transcribed, stored in a retrieval system, copied,
* modified, duplicated, adapted or translated into another program language in any
* form or by any means, electronic, mechanical, photocopying, recording, or
* otherwise, without the prior written permission from Locusworks. Locusworks
* affirms that Eight-Track(R) software and data is subject to United States
* Government Purpose Rights. Contact Locusworks, 1313 Lawnview Drive
* Forney TX 75126, (802) 488-0438, for commercial licensing opportunities.
*
* IN NO EVENT SHALL LOCUSWORKS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL,
* INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT
* OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF LOCUSWORKS HAS BEEN
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. NO RESPONSIBILITY IS ASSUMED BY
* LOCUSWORKS FOR ITS USE, OR FOR ANY INFRINGEMENTS OF PATENTS OR OTHER RIGHTS OF
* THIRD PARTIES RESULTING FROM ITS USE. LOCUSWORKS SPECIFICALLY DISCLAIMS ANY
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE AND
* ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED HEREUNDER IS PROVIDED "AS
* IS". LOCUSWORKS HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES,
* ENHANCEMENTS, OR MODIFICATIONS.
*/
package net.locusworks.discord.eighttrack.events.main.handlers;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent;
import net.locusworks.discord.eighttrack.events.main.AbstractMainEventHandler;
import net.locusworks.discord.eighttrack.handlers.GuildMusicHandler;
import net.locusworks.discord.eighttrack.services.GuildMusicService;
import net.locusworks.discord.eighttrack.services.RepositoryService;
import net.locusworks.logger.ApplicationLogger;
import net.locusworks.logger.ApplicationLoggerFactory;
@Component
public class NextSongHandler extends AbstractMainEventHandler {
private ApplicationLogger logger;
@Autowired
private RepositoryService guildRepoService;
@Autowired
private GuildMusicService musicService;
public NextSongHandler() {
super("-next");
logger = ApplicationLoggerFactory.getLogger(NextSongHandler.class);
}
@Override
public void executeEvent(GuildMessageReceivedEvent event, List<String> commands) {
try {
GuildMusicHandler musicHandler = musicService.getMusicHandler(event.getGuild().getIdLong());
musicHandler.next(event, commands);
} catch (Exception ex) {
logger.error("Unable to play next song: " + ex.getMessage(), ex);
guildRepoService.logEntry(event.getGuild().getIdLong(), ex, "Unable to play next song: %s", ex.getMessage());
sendMessage(event, "Sorry I am unable to play next song: " + ex.getMessage());
}
}
@Override
public String help() {
return "-next <id of song to play> (will stop song if one already playing)";
}
}

View File

@ -0,0 +1,75 @@
/*
*
* Project: Eight Track, File: PlaySongHandler.java
*
* Copyright 2019-2021 Locusworks LLC.
* All rights reserved. Federal copyright law prohibits unauthorized reproduction by
* any means and imposes fines up to $25,000 for violation. No part of this material
* may be reproduced, transmitted, transcribed, stored in a retrieval system, copied,
* modified, duplicated, adapted or translated into another program language in any
* form or by any means, electronic, mechanical, photocopying, recording, or
* otherwise, without the prior written permission from Locusworks. Locusworks
* affirms that Eight-Track(R) software and data is subject to United States
* Government Purpose Rights. Contact Locusworks, 1313 Lawnview Drive
* Forney TX 75126, (802) 488-0438, for commercial licensing opportunities.
*
* IN NO EVENT SHALL LOCUSWORKS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL,
* INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT
* OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF LOCUSWORKS HAS BEEN
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. NO RESPONSIBILITY IS ASSUMED BY
* LOCUSWORKS FOR ITS USE, OR FOR ANY INFRINGEMENTS OF PATENTS OR OTHER RIGHTS OF
* THIRD PARTIES RESULTING FROM ITS USE. LOCUSWORKS SPECIFICALLY DISCLAIMS ANY
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE AND
* ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED HEREUNDER IS PROVIDED "AS
* IS". LOCUSWORKS HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES,
* ENHANCEMENTS, OR MODIFICATIONS.
*/
package net.locusworks.discord.eighttrack.events.main.handlers;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent;
import net.locusworks.discord.eighttrack.events.main.AbstractMainEventHandler;
import net.locusworks.discord.eighttrack.handlers.GuildMusicHandler;
import net.locusworks.discord.eighttrack.services.GuildMusicService;
import net.locusworks.discord.eighttrack.services.RepositoryService;
import net.locusworks.logger.ApplicationLogger;
import net.locusworks.logger.ApplicationLoggerFactory;
@Component
public class PlaySongHandler extends AbstractMainEventHandler {
private ApplicationLogger logger;
@Autowired
private RepositoryService guildRepoService;
@Autowired
private GuildMusicService musicService;
public PlaySongHandler() {
super("-play");
logger = ApplicationLoggerFactory.getLogger(PlaySongHandler.class);
}
@Override
public void executeEvent(GuildMessageReceivedEvent event, List<String> commands) {
try {
GuildMusicHandler musicHandler = musicService.getMusicHandler(event.getGuild().getIdLong());
musicHandler.play(event, commands);
musicHandler.isPlaying(true);
} catch (Exception ex) {
logger.error("Unable to play song: " + ex.getMessage(), ex);
guildRepoService.logEntry(event.getGuild().getIdLong(), ex, "Unable to play song: %s", ex.getMessage());
sendMessage(event, "Sorry I am unable to play requested song: " + ex.getMessage());
}
}
@Override
public String help() {
return "-play <id of song to play> (will not play song if a song is already playing)";
}
}

View File

@ -0,0 +1,101 @@
/*
*
* Project: Eight Track, File: PlaylistHandler.java
*
* Copyright 2019-2021 Locusworks LLC.
* All rights reserved. Federal copyright law prohibits unauthorized reproduction by
* any means and imposes fines up to $25,000 for violation. No part of this material
* may be reproduced, transmitted, transcribed, stored in a retrieval system, copied,
* modified, duplicated, adapted or translated into another program language in any
* form or by any means, electronic, mechanical, photocopying, recording, or
* otherwise, without the prior written permission from Locusworks. Locusworks
* affirms that Eight-Track(R) software and data is subject to United States
* Government Purpose Rights. Contact Locusworks, 1313 Lawnview Drive
* Forney TX 75126, (802) 488-0438, for commercial licensing opportunities.
*
* IN NO EVENT SHALL LOCUSWORKS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL,
* INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT
* OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF LOCUSWORKS HAS BEEN
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. NO RESPONSIBILITY IS ASSUMED BY
* LOCUSWORKS FOR ITS USE, OR FOR ANY INFRINGEMENTS OF PATENTS OR OTHER RIGHTS OF
* THIRD PARTIES RESULTING FROM ITS USE. LOCUSWORKS SPECIFICALLY DISCLAIMS ANY
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE AND
* ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED HEREUNDER IS PROVIDED "AS
* IS". LOCUSWORKS HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES,
* ENHANCEMENTS, OR MODIFICATIONS.
*/
package net.locusworks.discord.eighttrack.events.main.handlers;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeMap;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent;
import net.locusworks.discord.eighttrack.events.main.AbstractMainEventHandler;
import net.locusworks.discord.eighttrack.events.playlist.AbstractPlaylistEventHandler;
import net.locusworks.discord.eighttrack.services.RepositoryService;
import net.locusworks.logger.ApplicationLogger;
import net.locusworks.logger.ApplicationLoggerFactory;
@Component
public class PlaylistHandler extends AbstractMainEventHandler {
private ApplicationLogger logger;
@Autowired
private RepositoryService guildRepoService;
private Map<String, AbstractPlaylistEventHandler> handlers;
public PlaylistHandler() {
super("-playlist");
logger = ApplicationLoggerFactory.getLogger(PlaylistHandler.class);
}
@Autowired
private void init(List<AbstractPlaylistEventHandler> eventHandlers) {
handlers = new TreeMap<>();
for(AbstractPlaylistEventHandler apeh : eventHandlers) {
handlers.put(apeh.getCommand(), apeh);
}
}
@Override
public void executeEvent(GuildMessageReceivedEvent event, List<String> commands) {
if (commands == null || commands.isEmpty()) {
event.getChannel().sendMessage("Missing command for -playlist. Valid commands are: add, delete, list, play").queue();
return;
}
try {
String command = commands.remove(0);
AbstractPlaylistEventHandler apeh = handlers.get(command);
if (apeh == null) {
sendMessage(event, help());
return;
}
apeh.executeEvent(event, commands);
} catch (Exception ex) {
logger.error("Unable to display playlist: " + ex.getMessage(), ex);
guildRepoService.logEntry(event.getGuild().getIdLong(), ex, "Unable to display playlist: %s", ex.getMessage());
sendMessage(event, "Sorry I am unable to display the playlist: " + ex.getMessage());
}
}
@Override
public String help() {
StringBuilder sb = new StringBuilder();
for(Entry<String, AbstractPlaylistEventHandler> entry : handlers.entrySet()) {
sb.append(entry.getValue().help()).append("\n");
}
return "-playlist | " + sb.toString();
}
}

View File

@ -0,0 +1,75 @@
/*
*
* Project: Eight Track, File: RepeatSongHandler.java
*
* Copyright 2019-2021 Locusworks LLC.
* All rights reserved. Federal copyright law prohibits unauthorized reproduction by
* any means and imposes fines up to $25,000 for violation. No part of this material
* may be reproduced, transmitted, transcribed, stored in a retrieval system, copied,
* modified, duplicated, adapted or translated into another program language in any
* form or by any means, electronic, mechanical, photocopying, recording, or
* otherwise, without the prior written permission from Locusworks. Locusworks
* affirms that Eight-Track(R) software and data is subject to United States
* Government Purpose Rights. Contact Locusworks, 1313 Lawnview Drive
* Forney TX 75126, (802) 488-0438, for commercial licensing opportunities.
*
* IN NO EVENT SHALL LOCUSWORKS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL,
* INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT
* OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF LOCUSWORKS HAS BEEN
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. NO RESPONSIBILITY IS ASSUMED BY
* LOCUSWORKS FOR ITS USE, OR FOR ANY INFRINGEMENTS OF PATENTS OR OTHER RIGHTS OF
* THIRD PARTIES RESULTING FROM ITS USE. LOCUSWORKS SPECIFICALLY DISCLAIMS ANY
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE AND
* ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED HEREUNDER IS PROVIDED "AS
* IS". LOCUSWORKS HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES,
* ENHANCEMENTS, OR MODIFICATIONS.
*/
package net.locusworks.discord.eighttrack.events.main.handlers;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent;
import net.locusworks.discord.eighttrack.events.main.AbstractMainEventHandler;
import net.locusworks.discord.eighttrack.handlers.GuildMusicHandler;
import net.locusworks.discord.eighttrack.services.GuildMusicService;
import net.locusworks.discord.eighttrack.services.RepositoryService;
import net.locusworks.logger.ApplicationLogger;
import net.locusworks.logger.ApplicationLoggerFactory;
@Component
public class RepeatSongHandler extends AbstractMainEventHandler {
private ApplicationLogger logger;
@Autowired
private RepositoryService guildRepoService;
@Autowired
private GuildMusicService musicService;
public RepeatSongHandler() {
super("-repeat");
logger = ApplicationLoggerFactory.getLogger(RepeatSongHandler.class);
}
@Override
public void executeEvent(GuildMessageReceivedEvent event, List<String> commands) {
try {
GuildMusicHandler musicHandler = musicService.getMusicHandler(event.getGuild().getIdLong());
musicHandler.repeat(event);
musicHandler.isPlaying(true);
} catch (Exception ex) {
logger.error("Unable to repeat songs: " + ex.getMessage(), ex);
guildRepoService.logEntry(event.getGuild().getIdLong(), ex, "Unable to repeat song: %s", ex.getMessage());
sendMessage(event, "Sorry I am unable to repeat songs: " + ex.getMessage());
}
}
@Override
public String help() {
return "-repeat (repeats the current song list)";
}
}

View File

@ -0,0 +1,107 @@
/*
*
* Project: Eight Track, File: SongListHandler.java
*
* Copyright 2019-2021 Locusworks LLC.
* All rights reserved. Federal copyright law prohibits unauthorized reproduction by
* any means and imposes fines up to $25,000 for violation. No part of this material
* may be reproduced, transmitted, transcribed, stored in a retrieval system, copied,
* modified, duplicated, adapted or translated into another program language in any
* form or by any means, electronic, mechanical, photocopying, recording, or
* otherwise, without the prior written permission from Locusworks. Locusworks
* affirms that Eight-Track(R) software and data is subject to United States
* Government Purpose Rights. Contact Locusworks, 1313 Lawnview Drive
* Forney TX 75126, (802) 488-0438, for commercial licensing opportunities.
*
* IN NO EVENT SHALL LOCUSWORKS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL,
* INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT
* OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF LOCUSWORKS HAS BEEN
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. NO RESPONSIBILITY IS ASSUMED BY
* LOCUSWORKS FOR ITS USE, OR FOR ANY INFRINGEMENTS OF PATENTS OR OTHER RIGHTS OF
* THIRD PARTIES RESULTING FROM ITS USE. LOCUSWORKS SPECIFICALLY DISCLAIMS ANY
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE AND
* ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED HEREUNDER IS PROVIDED "AS
* IS". LOCUSWORKS HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES,
* ENHANCEMENTS, OR MODIFICATIONS.
*/
package net.locusworks.discord.eighttrack.events.main.handlers;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent;
import net.locusworks.discord.eighttrack.database.entities.GuildSong;
import net.locusworks.discord.eighttrack.events.main.AbstractMainEventHandler;
import net.locusworks.discord.eighttrack.services.RepositoryService;
import net.locusworks.logger.ApplicationLogger;
import net.locusworks.logger.ApplicationLoggerFactory;
@Component
public class SongListHandler extends AbstractMainEventHandler {
private ApplicationLogger logger;
@Autowired
private RepositoryService guildRepoService;
public SongListHandler() {
super("-list");
logger = ApplicationLoggerFactory.getLogger(SongListHandler.class);
}
@Override
public void executeEvent(GuildMessageReceivedEvent event, List<String> commands) {
try {
listSongs(event, commands);
} catch (Exception ex) {
logger.error("Unable to play next song: " + ex.getMessage(), ex);
guildRepoService.logEntry(event.getGuild().getIdLong(), ex, "Unable to play next song: %s", ex.getMessage());
sendMessage(event, "Sorry I am unable to play next song: " + ex.getMessage());
}
}
private void listSongs(GuildMessageReceivedEvent event, List<String> commands) throws Exception {
List<GuildSong> gsList = guildRepoService.getGuildSongRepo().findByGuild(event.getGuild().getIdLong());
if (gsList == null || gsList.isEmpty()) {
sendMessage(event, "There is no music for this guild.");
return;
}
int longestSong = 0;
int longestArtist = 0;
for(GuildSong gs : gsList) {
if (gs.getSong().getTitle().length() > longestSong) longestSong = gs.getSong().getTitle().length();
if (gs.getSong().getArtist().length() > longestArtist) longestArtist = gs.getSong().getArtist().length();
}
sendMessage(event, true, "**Currently available songs for %s**\n\n", event.getGuild().getName());
int count = 0;
String fmt = "%6s | %-" + longestSong +"s | %-" + longestArtist +"s | %s%n";
StringBuilder sb = new StringBuilder("```");
sb.append(String.format(fmt, "Track", "Title", "Artist", "id"));
sb.append(StringUtils.repeat("-", 27 + longestSong + longestArtist)).append("\n");
for(GuildSong gs : gsList) {
String msg = String.format(fmt, ++count, gs.getSong().getTitle(), gs.getSong().getArtist(), gs.getUuid());
if (sb.length() + msg.length() > 2000) {
sb.append("```");
sendMessage(event, sb.toString(), true);
sb = new StringBuilder("```");
} else {
sb.append(msg);
}
}
sb.append("```");
sendMessage(event, sb.toString());
}
@Override
public String help() {
return "-list (lists the sonds to play)";
}
}

View File

@ -0,0 +1,76 @@
/*
*
* Project: Eight Track, File: StopSongHandler.java
*
* Copyright 2019-2021 Locusworks LLC.
* All rights reserved. Federal copyright law prohibits unauthorized reproduction by
* any means and imposes fines up to $25,000 for violation. No part of this material
* may be reproduced, transmitted, transcribed, stored in a retrieval system, copied,
* modified, duplicated, adapted or translated into another program language in any
* form or by any means, electronic, mechanical, photocopying, recording, or
* otherwise, without the prior written permission from Locusworks. Locusworks
* affirms that Eight-Track(R) software and data is subject to United States
* Government Purpose Rights. Contact Locusworks, 1313 Lawnview Drive
* Forney TX 75126, (802) 488-0438, for commercial licensing opportunities.
*
* IN NO EVENT SHALL LOCUSWORKS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL,
* INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT
* OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF LOCUSWORKS HAS BEEN
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. NO RESPONSIBILITY IS ASSUMED BY
* LOCUSWORKS FOR ITS USE, OR FOR ANY INFRINGEMENTS OF PATENTS OR OTHER RIGHTS OF
* THIRD PARTIES RESULTING FROM ITS USE. LOCUSWORKS SPECIFICALLY DISCLAIMS ANY
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE AND
* ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED HEREUNDER IS PROVIDED "AS
* IS". LOCUSWORKS HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES,
* ENHANCEMENTS, OR MODIFICATIONS.
*/
package net.locusworks.discord.eighttrack.events.main.handlers;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent;
import net.locusworks.discord.eighttrack.events.main.AbstractMainEventHandler;
import net.locusworks.discord.eighttrack.handlers.GuildMusicHandler;
import net.locusworks.discord.eighttrack.services.GuildMusicService;
import net.locusworks.discord.eighttrack.services.RepositoryService;
import net.locusworks.logger.ApplicationLogger;
import net.locusworks.logger.ApplicationLoggerFactory;
@Component
public class StopSongHandler extends AbstractMainEventHandler {
private ApplicationLogger logger;
@Autowired
private RepositoryService guildRepoService;
@Autowired
private GuildMusicService musicService;
public StopSongHandler() {
super("-stop");
logger = ApplicationLoggerFactory.getLogger(StopSongHandler.class);
}
@Override
public void executeEvent(GuildMessageReceivedEvent event, List<String> commands) {
try {
GuildMusicHandler musicHandler = musicService.getMusicHandler(event.getGuild().getIdLong());
musicHandler.isPlaying(false);
musicHandler.stop(event);
event.getGuild().getAudioManager().closeAudioConnection();
} catch (Exception ex) {
logger.error("Unable to stop song: " + ex.getMessage(), ex);
guildRepoService.logEntry(event.getGuild().getIdLong(), ex, "Unable to stop song: %s", ex.getMessage());
sendMessage(event, "Sorry I am unable to stop current song: " + ex.getMessage());
}
}
@Override
public String help() {
return "-stop (stops the current song)";
}
}

View File

@ -0,0 +1,75 @@
/*
*
* Project: Eight Track, File: UpNextSongHandler.java
*
* Copyright 2019-2021 Locusworks LLC.
* All rights reserved. Federal copyright law prohibits unauthorized reproduction by
* any means and imposes fines up to $25,000 for violation. No part of this material
* may be reproduced, transmitted, transcribed, stored in a retrieval system, copied,
* modified, duplicated, adapted or translated into another program language in any
* form or by any means, electronic, mechanical, photocopying, recording, or
* otherwise, without the prior written permission from Locusworks. Locusworks
* affirms that Eight-Track(R) software and data is subject to United States
* Government Purpose Rights. Contact Locusworks, 1313 Lawnview Drive
* Forney TX 75126, (802) 488-0438, for commercial licensing opportunities.
*
* IN NO EVENT SHALL LOCUSWORKS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL,
* INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT
* OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF LOCUSWORKS HAS BEEN
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. NO RESPONSIBILITY IS ASSUMED BY
* LOCUSWORKS FOR ITS USE, OR FOR ANY INFRINGEMENTS OF PATENTS OR OTHER RIGHTS OF
* THIRD PARTIES RESULTING FROM ITS USE. LOCUSWORKS SPECIFICALLY DISCLAIMS ANY
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE AND
* ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED HEREUNDER IS PROVIDED "AS
* IS". LOCUSWORKS HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES,
* ENHANCEMENTS, OR MODIFICATIONS.
*/
package net.locusworks.discord.eighttrack.events.main.handlers;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent;
import net.locusworks.discord.eighttrack.events.main.AbstractMainEventHandler;
import net.locusworks.discord.eighttrack.handlers.GuildMusicHandler;
import net.locusworks.discord.eighttrack.services.GuildMusicService;
import net.locusworks.discord.eighttrack.services.RepositoryService;
import net.locusworks.logger.ApplicationLogger;
import net.locusworks.logger.ApplicationLoggerFactory;
@Component
public class UpNextSongHandler extends AbstractMainEventHandler {
private ApplicationLogger logger;
@Autowired
private RepositoryService guildRepoService;
@Autowired
private GuildMusicService musicService;
public UpNextSongHandler() {
super("-upnext");
logger = ApplicationLoggerFactory.getLogger(UpNextSongHandler.class);
}
@Override
public void executeEvent(GuildMessageReceivedEvent event, List<String> commands) {
try {
GuildMusicHandler musicHandler = musicService.getMusicHandler(event.getGuild().getIdLong());
musicHandler.repeat(event);
musicHandler.isPlaying(true);
} catch (Exception ex) {
logger.error("Unable to show the next songs: " + ex.getMessage(), ex);
guildRepoService.logEntry(event.getGuild().getIdLong(), ex, "Unable to show next song: %s", ex.getMessage());
sendMessage(event, "Sorry I am unable to show next songs: " + ex.getMessage());
}
}
@Override
public String help() {
return "-upnext (shows which song is up next)";
}
}

View File

@ -0,0 +1,230 @@
/*
*
* Project: Eight Track, File: UploadHandler.java
*
* Copyright 2019-2021 Locusworks LLC.
* All rights reserved. Federal copyright law prohibits unauthorized reproduction by
* any means and imposes fines up to $25,000 for violation. No part of this material
* may be reproduced, transmitted, transcribed, stored in a retrieval system, copied,
* modified, duplicated, adapted or translated into another program language in any
* form or by any means, electronic, mechanical, photocopying, recording, or
* otherwise, without the prior written permission from Locusworks. Locusworks
* affirms that Eight-Track(R) software and data is subject to United States
* Government Purpose Rights. Contact Locusworks, 1313 Lawnview Drive
* Forney TX 75126, (802) 488-0438, for commercial licensing opportunities.
*
* IN NO EVENT SHALL LOCUSWORKS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL,
* INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT
* OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF LOCUSWORKS HAS BEEN
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. NO RESPONSIBILITY IS ASSUMED BY
* LOCUSWORKS FOR ITS USE, OR FOR ANY INFRINGEMENTS OF PATENTS OR OTHER RIGHTS OF
* THIRD PARTIES RESULTING FROM ITS USE. LOCUSWORKS SPECIFICALLY DISCLAIMS ANY
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE AND
* ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED HEREUNDER IS PROVIDED "AS
* IS". LOCUSWORKS HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES,
* ENHANCEMENTS, OR MODIFICATIONS.
*/
package net.locusworks.discord.eighttrack.events.main.handlers;
import java.awt.Color;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.time.OffsetDateTime;
import java.util.Date;
import java.util.List;
import java.util.UUID;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.entities.MessageEmbed;
import net.dv8tion.jda.api.entities.Message.Attachment;
import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent;
import net.locusworks.crypto.utils.HashUtils;
import net.locusworks.discord.eighttrack.audio.Mp3UploadHandler;
import net.locusworks.discord.eighttrack.audio.Mp3UploadResults;
import net.locusworks.discord.eighttrack.database.entities.DiscordGuild;
import net.locusworks.discord.eighttrack.database.entities.GuildSong;
import net.locusworks.discord.eighttrack.database.entities.Song;
import net.locusworks.discord.eighttrack.events.main.AbstractMainEventHandler;
import net.locusworks.discord.eighttrack.services.ConfigurationService;
import net.locusworks.discord.eighttrack.services.RepositoryService;
import net.locusworks.logger.ApplicationLogger;
import net.locusworks.logger.ApplicationLoggerFactory;
@Component
public class UploadHandler extends AbstractMainEventHandler {
private ApplicationLogger logger;
@Autowired
private Mp3UploadHandler uploadHandler;
@Autowired
private RepositoryService guildSongRepoService;
@Autowired
private ConfigurationService confService;
public UploadHandler() {
super("+upload");
logger = ApplicationLoggerFactory.getLogger(UploadHandler.class);
}
@Override
public void executeEvent(GuildMessageReceivedEvent event, List<String> commands) {
if (!isAdmin(event)) return;
for(Attachment attachment : event.getMessage().getAttachments()) {
attachment.retrieveInputStream().thenAccept((in) -> {
Mp3UploadResults res = null;
MessageEmbed embed = null;
try {
res = uploadHandler.parse(in, attachment.getFileName());
if (res.validFile()) {
embed = persistSong(res, event, attachment.getFileName());
} else {
embed = wrongFile(event, attachment.getFileName());
}
} catch (Exception ex) {
logger.error("Unable to get file information: %s", ex.getMessage());
logger.error(ex);
embed = error(event, ex, attachment.getFileName());
} finally {
event.getMessage().delete().queue();
if (res != null) res.clear();
if (embed != null) event.getChannel().sendMessage(embed).queue();
}
}).exceptionally((err) -> {
event.getMessage().delete().queue();
MessageEmbed embed = error(event, err, attachment.getFileName());
if (embed != null) event.getChannel().sendMessage(embed).queue();
return null;
});
}
}
private MessageEmbed error(GuildMessageReceivedEvent event, Throwable ex, String fileName) {
return new EmbedBuilder()
.setTitle("Unable to upload file: " + fileName)
.setDescription("There was an error uploading your file: " + ex.getMessage() + ". Please contact admin")
.setColor(Color.RED)
.setTimestamp(OffsetDateTime.now())
.setFooter(event.getGuild().getSelfMember().getEffectiveName(), event.getGuild().getSelfMember().getUser().getAvatarUrl())
.build();
}
private MessageEmbed wrongFile(GuildMessageReceivedEvent event, String fileName) {
return new EmbedBuilder()
.setTitle("Invalid File: " + fileName)
.setDescription("Only music type files are allowed to be uploaded")
.setColor(Color.RED)
.setTimestamp(OffsetDateTime.now())
.setFooter(event.getGuild().getSelfMember().getEffectiveName(), event.getGuild().getSelfMember().getUser().getAvatarUrl())
.build();
}
private MessageEmbed persistSong(Mp3UploadResults result, GuildMessageReceivedEvent event, String fileName) throws Exception {
DiscordGuild guild = guildSongRepoService.getGuildRepo().findByGuildId(event.getGuild().getIdLong());
if(guild == null) {
throw new IOException("Unable to find guild in database. Please contact administrator");
}
String hash = HashUtils.hash("SHA-1", result.getData());
GuildSong gs = guildSongRepoService.getGuildSongRepo().findByGuildAndSongHash(event.getGuild().getIdLong(), hash);
if (gs != null) {
MessageEmbed embed = new EmbedBuilder()
.setColor(Color.ORANGE)
.setThumbnail(event.getGuild().getIconUrl())
.setTitle("Upload Results for " + fileName)
.setDescription(String.format("**%s** by __%s__ already exists. ID: `%s`", gs.getSong().getTitle(), gs.getSong().getArtist(), gs.getUuid()))
.setTimestamp(OffsetDateTime.now())
.setFooter(event.getGuild().getSelfMember().getEffectiveName(), event.getGuild().getSelfMember().getUser().getAvatarUrl())
.build();
return embed;
}
Song song = guildSongRepoService.getSongRepo().findByFileHash(hash);
if (song == null) {
Path output = confService.getMusicDirectory();
if (result.getArtist() != null) {
output = output.resolve(result.getArtist());
if (result.getAlbum() != null) {
output = output.resolve(result.getAlbum());
}
}
output = output.resolve(fileName);
if (!Files.exists(output.toAbsolutePath().getParent())) {
Files.createDirectories(output.toAbsolutePath().getParent());
}
Files.write(output, result.getData());
song = new Song();
song.setAlbum(result.getAlbum());
song.setArtist(result.getArtist());
song.setDateAdded(new Date());
song.setDiscNumber(result.getDiscNumber());
song.setFileHash(hash);
song.setFilePath(output.toAbsolutePath().toString());
song.setGenre(result.getGenre());
song.setReleaseYear(result.getReleaseDate());
song.setTitle(result.getTitle());
song.setTrackNumber(result.getTrackNumber());
guildSongRepoService.getSongRepo().save(song);
}
gs = new GuildSong();
gs.setDateAdded(new Date());
gs.setGuild(guild);
gs.setSong(song);
String[] uuidArray = UUID.randomUUID().toString().split("-");
gs.setUuid(uuidArray[uuidArray.length - 1]);
guildSongRepoService.getGuildSongRepo().save(gs);
EmbedBuilder builder = new EmbedBuilder()
.setColor(Color.GREEN)
.setThumbnail(event.getGuild().getIconUrl())
.setTitle("Upload Results for " + fileName)
.setTimestamp(OffsetDateTime.now())
.setFooter(event.getGuild().getSelfMember().getEffectiveName(), event.getGuild().getSelfMember().getUser().getAvatarUrl())
.addField("Title", result.getTitle(), true);
if (!StringUtils.isBlank(result.getArtist())) builder.addField("Artist", result.getArtist(), true);
if (!StringUtils.isBlank(result.getAlbum())) builder.addField("Album", result.getAlbum(), true);
if (!StringUtils.isBlank(result.getTrackNumber())) builder.addField("Track", result.getTrackNumber(), true);
if (!StringUtils.isBlank(result.getDiscNumber())) builder.addField("Disc", result.getDiscNumber(), true);
if (!StringUtils.isBlank(result.getReleaseDate())) builder.addField("Year", result.getReleaseDate(), true);
builder.addField("ID", gs.getUuid(), true);
MessageEmbed embed = builder.build();
try {
guildSongRepoService.logEntry(event.getGuild().getIdLong(), "%s uploaded", result);
} catch (Exception ex) {}
return embed;
}
@Override
public String help() {
return "upload song";
}
}

View File

@ -0,0 +1,39 @@
/*
*
* Project: Eight Track, File: AbstractPlaylistEventHandler.java
*
* Copyright 2019-2021 Locusworks LLC.
* All rights reserved. Federal copyright law prohibits unauthorized reproduction by
* any means and imposes fines up to $25,000 for violation. No part of this material
* may be reproduced, transmitted, transcribed, stored in a retrieval system, copied,
* modified, duplicated, adapted or translated into another program language in any
* form or by any means, electronic, mechanical, photocopying, recording, or
* otherwise, without the prior written permission from Locusworks. Locusworks
* affirms that Eight-Track(R) software and data is subject to United States
* Government Purpose Rights. Contact Locusworks, 1313 Lawnview Drive
* Forney TX 75126, (802) 488-0438, for commercial licensing opportunities.
*
* IN NO EVENT SHALL LOCUSWORKS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL,
* INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT
* OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF LOCUSWORKS HAS BEEN
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. NO RESPONSIBILITY IS ASSUMED BY
* LOCUSWORKS FOR ITS USE, OR FOR ANY INFRINGEMENTS OF PATENTS OR OTHER RIGHTS OF
* THIRD PARTIES RESULTING FROM ITS USE. LOCUSWORKS SPECIFICALLY DISCLAIMS ANY
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE AND
* ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED HEREUNDER IS PROVIDED "AS
* IS". LOCUSWORKS HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES,
* ENHANCEMENTS, OR MODIFICATIONS.
*/
package net.locusworks.discord.eighttrack.events.playlist;
import net.locusworks.discord.eighttrack.events.AbstractEvent;
public abstract class AbstractPlaylistEventHandler extends AbstractEvent {
public AbstractPlaylistEventHandler(String command) {
super(command);
}
}

View File

@ -0,0 +1,146 @@
/*
*
* Project: Eight Track, File: PlaylistAddHandler.java
*
* Copyright 2019-2021 Locusworks LLC.
* All rights reserved. Federal copyright law prohibits unauthorized reproduction by
* any means and imposes fines up to $25,000 for violation. No part of this material
* may be reproduced, transmitted, transcribed, stored in a retrieval system, copied,
* modified, duplicated, adapted or translated into another program language in any
* form or by any means, electronic, mechanical, photocopying, recording, or
* otherwise, without the prior written permission from Locusworks. Locusworks
* affirms that Eight-Track(R) software and data is subject to United States
* Government Purpose Rights. Contact Locusworks, 1313 Lawnview Drive
* Forney TX 75126, (802) 488-0438, for commercial licensing opportunities.
*
* IN NO EVENT SHALL LOCUSWORKS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL,
* INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT
* OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF LOCUSWORKS HAS BEEN
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. NO RESPONSIBILITY IS ASSUMED BY
* LOCUSWORKS FOR ITS USE, OR FOR ANY INFRINGEMENTS OF PATENTS OR OTHER RIGHTS OF
* THIRD PARTIES RESULTING FROM ITS USE. LOCUSWORKS SPECIFICALLY DISCLAIMS ANY
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE AND
* ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED HEREUNDER IS PROVIDED "AS
* IS". LOCUSWORKS HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES,
* ENHANCEMENTS, OR MODIFICATIONS.
*/
package net.locusworks.discord.eighttrack.events.playlist.handlers;
import java.awt.Color;
import java.time.OffsetDateTime;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.entities.MessageEmbed;
import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent;
import net.locusworks.discord.eighttrack.database.entities.DiscordGuild;
import net.locusworks.discord.eighttrack.database.entities.GuildPlaylist;
import net.locusworks.discord.eighttrack.database.entities.GuildPlaylistSong;
import net.locusworks.discord.eighttrack.database.entities.GuildSong;
import net.locusworks.discord.eighttrack.events.playlist.AbstractPlaylistEventHandler;
import net.locusworks.discord.eighttrack.services.RepositoryService;
@Component
public class PlaylistAddHandler extends AbstractPlaylistEventHandler {
@Autowired
private RepositoryService guildRepoService;
public PlaylistAddHandler() {
super("add");
}
@Override
public void executeEvent(GuildMessageReceivedEvent event, List<String> commands) {
if(!checkCommands(event, commands,
event.getAuthor().getAsMention() + " you have to provide the playlist to create a new playlist (no spaces in name) and optionally a list of uuids for songs to add")) return;
Long guildId = event.getGuild().getIdLong();
DiscordGuild guild = guildRepoService.getGuildRepo().findByGuildId(guildId);
if (guild == null) {
event.getChannel().sendMessage("Unable to find guild in local database. Please contact administrator").queue();
return;
}
String playlist = commands.remove(0);
long userId = event.getMember().getIdLong();
GuildPlaylist gpl = guildRepoService.getGuildPlaylistRepo().findByGuildAndUserIdAndPlaylist(guild, userId, playlist);
boolean newList = false;
if (gpl != null && commands.isEmpty()) {
event.getChannel().sendMessage(event.getAuthor().getAsMention() + " a playlist with the name " + playlist + " already exist for you.").queue();
return;
} else if (gpl == null) {
newList = true;
gpl = new GuildPlaylist();
gpl.setDateAdded(new Date());
gpl.setGuild(guild);
gpl.setPlaylist(playlist);
gpl.setUserId(userId);
guildRepoService.getGuildPlaylistRepo().save(gpl);
}
if (commands.isEmpty() && newList) {
event.getChannel().sendMessage(event.getAuthor().getAsMention() + " playlist " + playlist + " successfully created.").queue();
return;
}
Set<String> songIds = guildRepoService.getGuildPlaylistSongRepo()
.findByGuildPlaylistAndSongIds(gpl, commands).stream()
.map(g -> g.getGuildSong().getUuid())
.collect(Collectors.toSet());
List<GuildPlaylistSong> gplsList = new ArrayList<>();
StringBuilder sb = new StringBuilder();
for(String id : commands.stream().collect(Collectors.toSet())) {
GuildSong gs = guildRepoService.getGuildSongRepo().findByUuid(id);
if (songIds.contains(id)) {
sb.append(String.format("**%s** by __%s__ already exists in this playlist.%n", gs.getSong().getTitle(), gs.getSong().getArtist()));
continue;
}
if (gs == null) {
sb.append("Song with id `" + id + "` not found. Please check id\n");
continue;
}
GuildPlaylistSong gpls = new GuildPlaylistSong();
gpls.setDateAdded(new Date());
gpls.setGuildPlaylist(gpl);
gpls.setGuildSong(gs);
gplsList.add(gpls);
sb.append(String.format("**%s** by __%s__ added to playlist.%n", gs.getSong().getTitle(), gs.getSong().getArtist()));
}
if (!gplsList.isEmpty()) {
guildRepoService.getGuildPlaylistSongRepo().saveAll(gplsList);
}
MessageEmbed embed = new EmbedBuilder()
.setTitle("Results for adding playlist " + playlist)
.setAuthor(event.getMember().getEffectiveName(), null, event.getAuthor().getAvatarUrl())
.setColor(Color.GREEN)
.setDescription(sb.toString())
.setFooter("", event.getGuild().getSelfMember().getUser().getAvatarUrl())
.setTimestamp(OffsetDateTime.now())
.build();
event.getChannel().sendMessage(embed).queue();
}
@Override
public String help() {
// TODO Auto-generated method stub
return null;
}
}

View File

@ -0,0 +1,170 @@
/*
*
* Project: Eight Track, File: PlaylistDeleteHandler.java
*
* Copyright 2019-2021 Locusworks LLC.
* All rights reserved. Federal copyright law prohibits unauthorized reproduction by
* any means and imposes fines up to $25,000 for violation. No part of this material
* may be reproduced, transmitted, transcribed, stored in a retrieval system, copied,
* modified, duplicated, adapted or translated into another program language in any
* form or by any means, electronic, mechanical, photocopying, recording, or
* otherwise, without the prior written permission from Locusworks. Locusworks
* affirms that Eight-Track(R) software and data is subject to United States
* Government Purpose Rights. Contact Locusworks, 1313 Lawnview Drive
* Forney TX 75126, (802) 488-0438, for commercial licensing opportunities.
*
* IN NO EVENT SHALL LOCUSWORKS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL,
* INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT
* OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF LOCUSWORKS HAS BEEN
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. NO RESPONSIBILITY IS ASSUMED BY
* LOCUSWORKS FOR ITS USE, OR FOR ANY INFRINGEMENTS OF PATENTS OR OTHER RIGHTS OF
* THIRD PARTIES RESULTING FROM ITS USE. LOCUSWORKS SPECIFICALLY DISCLAIMS ANY
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE AND
* ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED HEREUNDER IS PROVIDED "AS
* IS". LOCUSWORKS HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES,
* ENHANCEMENTS, OR MODIFICATIONS.
*/
package net.locusworks.discord.eighttrack.events.playlist.handlers;
import java.awt.Color;
import java.time.OffsetDateTime;
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.MessageEmbed;
import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent;
import net.locusworks.discord.eighttrack.database.entities.DiscordGuild;
import net.locusworks.discord.eighttrack.database.entities.GuildPlaylist;
import net.locusworks.discord.eighttrack.database.entities.GuildPlaylistSong;
import net.locusworks.discord.eighttrack.database.entities.GuildSong;
import net.locusworks.discord.eighttrack.events.playlist.AbstractPlaylistEventHandler;
import net.locusworks.discord.eighttrack.handlers.ReactionHandler;
import net.locusworks.discord.eighttrack.listeners.ReactionListener;
import net.locusworks.discord.eighttrack.services.RepositoryService;
import net.locusworks.discord.eighttrack.utils.Reactions;
import net.locusworks.logger.ApplicationLogger;
import net.locusworks.logger.ApplicationLoggerFactory;
@Component
public class PlaylistDeleteHandler extends AbstractPlaylistEventHandler {
@Autowired
private RepositoryService guildRepoService;
@Autowired
private ReactionHandler reactionHandler;
private ApplicationLogger logger;
public PlaylistDeleteHandler() {
super("delete");
logger = ApplicationLoggerFactory.getLogger(PlaylistDeleteHandler.class);
}
@Override
public void executeEvent(GuildMessageReceivedEvent event, List<String> commands) {
if(!checkCommands(event, commands,
event.getAuthor().getAsMention() + " you have to provide the playlist name and optionally a list of uuids for songs to remove")) return;
Long guildId = event.getGuild().getIdLong();
DiscordGuild guild = guildRepoService.getGuildRepo().findByGuildId(guildId);
if (guild == null) {
event.getChannel().sendMessage("Unable to find guild in local database. Please contact administrator").queue();
return;
}
String playlist = commands.remove(0);
long userId = event.getMember().getIdLong();
GuildPlaylist gpl = guildRepoService.getGuildPlaylistRepo().findByGuildAndUserIdAndPlaylist(guild, userId, playlist);
if (commands.isEmpty()) {
MessageEmbed embed = new EmbedBuilder()
.setColor(Color.RED)
.setTitle("Delete Playlist " + playlist)
.setDescription("Are you sure you want to delete the playlist " + playlist)
.setTimestamp(OffsetDateTime.now())
.setFooter(event.getGuild().getSelfMember().getEffectiveName(), event.getGuild().getSelfMember().getUser().getAvatarUrl())
.build();
event.getChannel().sendMessage(embed).queue((msg) -> {
ReactionListener<String> handler = new ReactionListener<>(userId, msg.getId());
handler.setExpiresIn(TimeUnit.MINUTES, 1);
handler.registerReaction(Reactions.CHECK_MARK_BUTTON, (ret) -> deletePlayListConfirm(gpl, event.getMember().getAsMention(), msg));
handler.registerReaction(Reactions.CROSS_MARK_BUTTON, (ret) -> deleteMessage(msg, reactionHandler, event.getGuild().getIdLong()));
reactionHandler.addReactionListener(guildId, msg, handler);
});
return;
}
List<GuildPlaylistSong> songs = guildRepoService.getGuildPlaylistSongRepo().findByGuildPlaylistAndSongIds(gpl, commands);
StringBuilder sb = new StringBuilder("Are you sure you want to delete the following songs from playlist " + playlist + "?\n");
for (GuildPlaylistSong gpls : songs) {
GuildSong gs = gpls.getGuildSong();
sb.append(String.format("**%s** by __%s__%n", gs.getSong().getTitle(), gs.getSong().getArtist()));
}
MessageEmbed embed = new EmbedBuilder()
.setColor(Color.RED)
.setTitle("Delete Playlist Songs")
.setDescription(sb.toString())
.setTimestamp(OffsetDateTime.now())
.setFooter(event.getGuild().getSelfMember().getEffectiveName(), event.getGuild().getSelfMember().getUser().getAvatarUrl())
.build();
event.getChannel().sendMessage(embed).queue((msg) -> {
ReactionListener<String> handler = new ReactionListener<>(userId, msg.getId());
handler.setExpiresIn(TimeUnit.MINUTES, 1);
handler.registerReaction(Reactions.CHECK_MARK_BUTTON, (ret) -> deletePlayListSongConfirm(songs, event.getMember().getAsMention(), msg));
handler.registerReaction(Reactions.CROSS_MARK_BUTTON, (ret) -> deleteMessage(msg, reactionHandler, event.getGuild().getIdLong()));
reactionHandler.addReactionListener(guildId, msg, handler);
});
}
private void deletePlayListSongConfirm(List<GuildPlaylistSong> songs, String user, Message msg) {
try {
guildRepoService.getGuildPlaylistSongRepo().deleteAll(songs);
msg.getChannel().sendMessage(user + ", songs removed successfully fom playlist").complete();
} catch (Exception ex) {
msg.getChannel().sendMessage("Sorry " + user + " I was unable to remove songs from the playlist. Reason: " + ex.getMessage()).complete();
logger.error("Unable to delete songs from playlist : " + ex.getMessage());
logger.error(ex);
guildRepoService.logEntry(msg.getGuild().getIdLong(), ex, "Unable to delete playlist: %s", ex.getMessage());
} finally {
deleteMessage(msg, reactionHandler, msg.getGuild().getIdLong());
}
}
private void deletePlayListConfirm(GuildPlaylist gpl, String user, Message msg) {
String playlist = gpl.getPlaylist();
try {
guildRepoService.getGuildPlaylistRepo().delete(gpl);
msg.getChannel().sendMessage(user + " " + playlist + " deleted successfully").complete();
} catch (Exception ex) {
msg.getChannel().sendMessage("Sorry " + user + " I was unable to remove playlist " + playlist + ". Reason: " + ex.getMessage()).complete();
logger.error("Unable to delete playlist " + playlist + ": " + ex.getMessage());
logger.error(ex);
guildRepoService.logEntry(msg.getGuild().getIdLong(), ex, "Unable to delete playlist: %s", ex.getMessage());
} finally {
deleteMessage(msg, reactionHandler, msg.getGuild().getIdLong());
}
}
@Override
public String help() {
// TODO Auto-generated method stub
return null;
}
}

View File

@ -0,0 +1,123 @@
/*
*
* Project: Eight Track, File: PlaylistListHandler.java
*
* Copyright 2019-2021 Locusworks LLC.
* All rights reserved. Federal copyright law prohibits unauthorized reproduction by
* any means and imposes fines up to $25,000 for violation. No part of this material
* may be reproduced, transmitted, transcribed, stored in a retrieval system, copied,
* modified, duplicated, adapted or translated into another program language in any
* form or by any means, electronic, mechanical, photocopying, recording, or
* otherwise, without the prior written permission from Locusworks. Locusworks
* affirms that Eight-Track(R) software and data is subject to United States
* Government Purpose Rights. Contact Locusworks, 1313 Lawnview Drive
* Forney TX 75126, (802) 488-0438, for commercial licensing opportunities.
*
* IN NO EVENT SHALL LOCUSWORKS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL,
* INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT
* OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF LOCUSWORKS HAS BEEN
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. NO RESPONSIBILITY IS ASSUMED BY
* LOCUSWORKS FOR ITS USE, OR FOR ANY INFRINGEMENTS OF PATENTS OR OTHER RIGHTS OF
* THIRD PARTIES RESULTING FROM ITS USE. LOCUSWORKS SPECIFICALLY DISCLAIMS ANY
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE AND
* ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED HEREUNDER IS PROVIDED "AS
* IS". LOCUSWORKS HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES,
* ENHANCEMENTS, OR MODIFICATIONS.
*/
package net.locusworks.discord.eighttrack.events.playlist.handlers;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent;
import net.locusworks.discord.eighttrack.database.entities.GuildPlaylist;
import net.locusworks.discord.eighttrack.database.entities.GuildPlaylistSong;
import net.locusworks.discord.eighttrack.database.entities.GuildSong;
import net.locusworks.discord.eighttrack.events.playlist.AbstractPlaylistEventHandler;
import net.locusworks.discord.eighttrack.services.RepositoryService;
@Component
public class PlaylistListHandler extends AbstractPlaylistEventHandler {
@Autowired
private RepositoryService guildRepoService;
public PlaylistListHandler() {
super("list");
}
@Override
public void executeEvent(GuildMessageReceivedEvent event, List<String> commands) {
if (commands == null || commands.isEmpty()) {
List<GuildPlaylist> userPlaylist = guildRepoService.getGuildPlaylistRepo().findByGuildAndUserIdFetchSongs(event.getGuild().getIdLong(), event.getMember().getIdLong());
if (userPlaylist.isEmpty()) {
event.getChannel().sendMessage(event.getMember().getAsMention() + " you have no defined playlists on this server").queue();
return;
}
int longestPlaylist = 10;
for(GuildPlaylist gpl : userPlaylist) {
if (gpl.getPlaylist().length() > longestPlaylist) longestPlaylist = gpl.getPlaylist().length();
}
String fmt = "%6s | %-" + longestPlaylist +"s | %s%n";
StringBuilder sb = new StringBuilder("```");
sb.append(String.format(fmt, "", "Playlist", "Song Count"));
sb.append(StringUtils.repeat("-", 24 + longestPlaylist)).append("\n");
int count = 0;
for(GuildPlaylist gpl : userPlaylist) {
sb.append(String.format(fmt, ++count, gpl.getPlaylist(), gpl.getGuildPlaylistSongList().size()));
}
sb.append("```");
event.getChannel().sendMessage("**" + "Currently available playlists for " + event.getMember().getAsMention() + "**").queue((succcess)->
event.getChannel().sendMessage(sb.toString()).queue());
return;
}
String playlist = commands.remove(0);
GuildPlaylist gpl = guildRepoService.getGuildPlaylistRepo().findByGuildUserPlaylistFetchSongs(event.getGuild().getIdLong(), event.getMember().getIdLong(), playlist);
if (gpl == null) {
event.getChannel().sendMessage(event.getMember().getAsMention() + " you have no defined playlists on this server by the name of " + playlist).queue();
return;
}
if (gpl.getGuildPlaylistSongList().isEmpty()) {
event.getChannel().sendMessage(event.getMember().getAsMention() + " you have no defined songs for playlist " + playlist).queue();
return;
}
int longestSong = 0;
int longestArtist = 0;
for(GuildPlaylistSong gpls : gpl.getGuildPlaylistSongList()) {
GuildSong gs = gpls.getGuildSong();
if (gs.getSong().getTitle().length() > longestSong) longestSong = gs.getSong().getTitle().length();
if (gs.getSong().getArtist().length() > longestArtist) longestArtist = gs.getSong().getArtist().length();
}
String fmt = "%6s | %-" + longestSong +"s | %-" + longestArtist +"s | %s%n";
int count = 0;
StringBuilder sb = new StringBuilder("```");
sb.append(String.format(fmt, "Track", "Title", "Artist", "id"));
sb.append(StringUtils.repeat("-", 27 + longestSong + longestArtist)).append("\n");
for(GuildPlaylistSong gpls : gpl.getGuildPlaylistSongList()) {
GuildSong gs = gpls.getGuildSong();
sb.append(String.format(fmt, ++count, gs.getSong().getTitle(), gs.getSong().getArtist(), gs.getUuid()));
}
sb.append("```");
event.getChannel().sendMessage("**" + "Current songs in playlists " + playlist + " for " + event.getMember().getAsMention() + "**").queue((succcess)->
event.getChannel().sendMessage(sb.toString()).queue());
}
@Override
public String help() {
// TODO Auto-generated method stub
return null;
}
}

View File

@ -0,0 +1,104 @@
/*
*
* Project: Eight Track, File: PlaylistPlayHandler.java
*
* Copyright 2019-2021 Locusworks LLC.
* All rights reserved. Federal copyright law prohibits unauthorized reproduction by
* any means and imposes fines up to $25,000 for violation. No part of this material
* may be reproduced, transmitted, transcribed, stored in a retrieval system, copied,
* modified, duplicated, adapted or translated into another program language in any
* form or by any means, electronic, mechanical, photocopying, recording, or
* otherwise, without the prior written permission from Locusworks. Locusworks
* affirms that Eight-Track(R) software and data is subject to United States
* Government Purpose Rights. Contact Locusworks, 1313 Lawnview Drive
* Forney TX 75126, (802) 488-0438, for commercial licensing opportunities.
*
* IN NO EVENT SHALL LOCUSWORKS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL,
* INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT
* OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF LOCUSWORKS HAS BEEN
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. NO RESPONSIBILITY IS ASSUMED BY
* LOCUSWORKS FOR ITS USE, OR FOR ANY INFRINGEMENTS OF PATENTS OR OTHER RIGHTS OF
* THIRD PARTIES RESULTING FROM ITS USE. LOCUSWORKS SPECIFICALLY DISCLAIMS ANY
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE AND
* ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED HEREUNDER IS PROVIDED "AS
* IS". LOCUSWORKS HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES,
* ENHANCEMENTS, OR MODIFICATIONS.
*/
package net.locusworks.discord.eighttrack.events.playlist.handlers;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent;
import net.locusworks.discord.eighttrack.database.entities.GuildPlaylist;
import net.locusworks.discord.eighttrack.database.entities.GuildPlaylistSong;
import net.locusworks.discord.eighttrack.database.entities.Song;
import net.locusworks.discord.eighttrack.events.playlist.AbstractPlaylistEventHandler;
import net.locusworks.discord.eighttrack.handlers.GuildMusicHandler;
import net.locusworks.discord.eighttrack.services.GuildMusicService;
import net.locusworks.discord.eighttrack.services.RepositoryService;
import net.locusworks.logger.ApplicationLogger;
import net.locusworks.logger.ApplicationLoggerFactory;
@Component
public class PlaylistPlayHandler extends AbstractPlaylistEventHandler {
@Autowired
private RepositoryService guildRepoService;
@Autowired
private GuildMusicService guildMusicService;
private ApplicationLogger logger;
public PlaylistPlayHandler() {
super("play");
logger = ApplicationLoggerFactory.getLogger(PlaylistPlayHandler.class);
}
@Override
public void executeEvent(GuildMessageReceivedEvent event, List<String> commands) {
if (commands == null || commands.isEmpty()) {
event.getChannel().sendMessage(event.getAuthor().getAsMention() + " please provide the name of the playlist to play").queue();
return;
}
String playlist = commands.remove(0);
GuildPlaylist currentPlaylist = guildRepoService.getGuildPlaylistRepo().findByGuildAndUserIdAndPlaylist(event.getGuild().getIdLong(), event.getMember().getIdLong(), playlist);
if (currentPlaylist == null) {
sendMessage(event, event.getAuthor().getAsMention() + ", no playlist with the name of " + playlist + " exists");
return;
}
GuildMusicHandler musicHandler = guildMusicService.getMusicHandler(event.getGuild().getIdLong());
musicHandler.setCurrentPlaylist(currentPlaylist);
musicHandler.getTrackManager().clearTracks();
for(GuildPlaylistSong gpls : guildRepoService.getGuildPlaylistSongRepo().findByGuildPlaylist(currentPlaylist)) {
Song s = gpls.getGuildSong().getSong();
musicHandler.getTrackManager().queueLast(s.getFilePath());
}
try {
musicHandler.isPlaying(false);
musicHandler.play(event);
musicHandler.isPlaying(true);
} catch (Exception ex) {
sendMessage(event, "Sorry " + event.getAuthor().getAsMention() + " I was unable to remove songs from the playlist. Reason: " + ex.getMessage(), true);
logger.error("Unable to play playlist : " + ex.getMessage());
logger.error(ex);
guildRepoService.logEntry(event.getGuild().getIdLong(), ex, "Unable to play playlist: %s", ex.getMessage());
}
}
@Override
public String help() {
// TODO Auto-generated method stub
return null;
}
}

View File

@ -1,8 +1,8 @@
/**
/*
*
* Project: Eight Track, File: GuildMusicHandler.java
*
* Copyright 2019-2019 Locusworks LLC.
* Copyright 2019-2021 Locusworks LLC.
* All rights reserved. Federal copyright law prohibits unauthorized reproduction by
* any means and imposes fines up to $25,000 for violation. No part of this material
* may be reproduced, transmitted, transcribed, stored in a retrieval system, copied,
@ -27,111 +27,53 @@
*/
package net.locusworks.discord.eighttrack.handlers;
import java.awt.Color;
import java.io.IOException;
import java.math.BigInteger;
import java.nio.file.Files;
import java.nio.file.Path;
import java.time.OffsetDateTime;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Random;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Consumer;
import java.util.stream.Collectors;
import org.apache.commons.lang3.StringUtils;
import com.sedmelluq.discord.lavaplayer.player.AudioPlayer;
import com.sedmelluq.discord.lavaplayer.player.DefaultAudioPlayerManager;
import com.sedmelluq.discord.lavaplayer.source.AudioSourceManagers;
import com.sedmelluq.discord.lavaplayer.track.AudioTrack;
import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.Permission;
import net.dv8tion.jda.api.entities.ChannelType;
import net.dv8tion.jda.api.entities.GuildChannel;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.Message.Attachment;
import net.dv8tion.jda.api.entities.MessageEmbed;
import net.dv8tion.jda.api.entities.VoiceChannel;
import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent;
import net.dv8tion.jda.api.exceptions.ErrorResponseException;
import net.dv8tion.jda.api.managers.AudioManager;
import net.dv8tion.jda.api.requests.ErrorResponse;
import net.locusworks.crypto.utils.HashUtils;
import net.locusworks.discord.eighttrack.database.entities.DiscordGuild;
import net.locusworks.discord.eighttrack.audio.EightTrackAudioSendHandler;
import net.locusworks.discord.eighttrack.audio.TrackManager;
import net.locusworks.discord.eighttrack.database.entities.GuildPlaylist;
import net.locusworks.discord.eighttrack.database.entities.GuildPlaylistSong;
import net.locusworks.discord.eighttrack.database.entities.GuildSong;
import net.locusworks.discord.eighttrack.database.entities.Song;
import net.locusworks.discord.eighttrack.listeners.ReactionListener;
import net.locusworks.discord.eighttrack.scheduler.TrackScheduler;
import net.locusworks.discord.eighttrack.services.GuildSongRepoService;
import net.locusworks.discord.eighttrack.utils.Reactions;
import net.locusworks.discord.eighttrack.services.RepositoryService;
import net.locusworks.logger.ApplicationLogger;
import net.locusworks.logger.ApplicationLoggerFactory;
public class GuildMusicHandler {
private Path musicDir;
private TrackScheduler ts;
private DefaultAudioPlayerManager apm;
private ApplicationLogger logger;
private AudioPlayer player;
private AtomicBoolean playing;
private Long voiceChannelId;
private OffsetDateTime lastPlayed;
private Consumer<Long> callback;
private Mp3UploadHandler uploadHandler;
private GuildSongRepoService guildSongRepoService;
private ReactionHandler reactionHandler;
private RepositoryService guildSongRepoService;
private long guildId;
private GuildPlaylist currentPlaylist;
public GuildMusicHandler(Path musicDir, long guildId, Mp3UploadHandler uploadHandler, ReactionHandler reactionHandler, GuildSongRepoService guildSongRepoService) throws IOException {
private TrackManager trackManager;
public GuildMusicHandler(long guildId, RepositoryService guildSongRepoService) {
this.logger = ApplicationLoggerFactory.getLogger(GuildMusicHandler.class);
this.playing = new AtomicBoolean(false);
this.musicDir = musicDir;
this.lastPlayed = OffsetDateTime.now();
this.uploadHandler = uploadHandler;
this.guildSongRepoService = guildSongRepoService;
this.guildId = guildId;
this.reactionHandler = reactionHandler;
this.apm = new DefaultAudioPlayerManager();
AudioSourceManagers.registerLocalSource(apm);
this.player = apm.createPlayer();
this.ts = new TrackScheduler();
player.addListener(ts);
}
public void playlist(GuildMessageReceivedEvent event, List<String> commands) throws Exception {
String command = commands.remove(0);
switch(command) {
case "add":
addPlayList(event, commands);
return;
case "delete":
deletePlayList(event, commands);
return;
case "list":
listPlayList(event, commands);
return;
case "play":
playPlayList(event, commands);
return;
}
this.trackManager = new TrackManager();
}
public Long getCurrentVoiceChannelId() {
@ -163,10 +105,10 @@ public class GuildMusicHandler {
return;
}
}
if (ts.peek() == null) {
if (!trackManager.hasTracks()) {
loadRandomSong();
}
AudioTrack track = ts.peek();
AudioTrack track = trackManager.play();
MessageEmbed embed = new EmbedBuilder()
.setAuthor(event.getMember().getEffectiveName(), null, event.getAuthor().getAvatarUrl())
.setTitle("Next Up:")
@ -178,7 +120,7 @@ public class GuildMusicHandler {
public void repeat(GuildMessageReceivedEvent event) throws Exception {
next(event);
ts.setFinishedCallback((ater) -> {
trackManager.setFinishedCallback((ater) -> {
if (!playing.get()) return;
try {
next(event);
@ -198,6 +140,7 @@ public class GuildMusicHandler {
playing.set(true);
return;
}
GuildChannel gc = event.getGuild().getGuildChannelById(ChannelType.VOICE, voiceChannelId);
if (gc != null && gc.getMembers().size() == 1) {
event.getChannel().sendMessage("Going silent since no one is currently listening to the channel").queue();
@ -207,18 +150,20 @@ public class GuildMusicHandler {
}
playing.set(false);
stop(event, true);
stop(event, true, true);
play(event, commands);
playing.set(true);
}
public void stop(GuildMessageReceivedEvent event) {
stop(event, false);
stop(event, false, false);
}
public void stop(GuildMessageReceivedEvent event, boolean stoppedFromRepeat) {
player.stopTrack();
public void stop(GuildMessageReceivedEvent event, boolean stoppedFromRepeat, boolean stoppedFromNext) {
trackManager.stopTrack();
if (!stoppedFromNext) {
voiceChannelId = null;
}
if (!stoppedFromRepeat) {
currentPlaylist = null;
}
@ -256,7 +201,7 @@ public class GuildMusicHandler {
AudioManager manager = event.getGuild().getAudioManager();
manager.openAudioConnection(vc);
manager.setSendingHandler(new EightTrackAudioSendHandler(player));
manager.setSendingHandler(new EightTrackAudioSendHandler(trackManager));
if (commands != null && !commands.isEmpty()) {
String uuid = commands.remove(0);
@ -265,17 +210,21 @@ public class GuildMusicHandler {
event.getChannel().sendMessageFormat("Unable to find song with identifier: %s", uuid).queue();
return;
}
stop(event, true);
stop(event, true, true);
}
if (!ts.hasTracks()) {
if (!trackManager.hasTracks()) {
loadRandomSong();
}
if (ts.hasTracks()) {
if (trackManager.hasTracks()) {
lastPlayed = OffsetDateTime.now();
AudioTrack track = ts.getNextTrack();
AudioTrack track = trackManager.play();
if (track == null) {
logger.warn("Unable to find track: " + trackManager.getCurrentItem()) ;
return;
}
MessageEmbed embed = new EmbedBuilder()
.setAuthor(event.getMember().getEffectiveName(), null, event.getAuthor().getAvatarUrl())
@ -285,190 +234,10 @@ public class GuildMusicHandler {
.build();
event.getChannel().sendMessage(embed).queue();
player.playTrack(track);
trackManager.playTrack(track);
}
}
public void upload(GuildMessageReceivedEvent event) {
if (!event.getMessage().getMember().hasPermission(Permission.ADMINISTRATOR, Permission.MANAGE_SERVER)) {
event.getChannel().sendMessage(String.format("Sorry <@%s> i can't do that. *psst: you have to have manage server, or administrator role*", event.getMember().getIdLong())).queue();
return;
}
for(Attachment attachment : event.getMessage().getAttachments()) {
attachment.retrieveInputStream().thenAccept((in) -> {
Mp3UploadResults res = null;
MessageEmbed embed = null;
try {
res = uploadHandler.parse(in);
if (res.validFile()) {
embed = persistSong(res, event, attachment.getFileName());
} else {
embed = wrongFile(event, attachment.getFileName());
}
} catch (Exception ex) {
logger.error("Unable to get file information: %s", ex.getMessage());
logger.error(ex);
embed = error(event, ex, attachment.getFileName());
} finally {
event.getMessage().delete().queue();
if (res != null) res.clear();
if (embed != null) event.getChannel().sendMessage(embed).queue();
}
}).exceptionally((err) -> {
event.getMessage().delete().queue();
MessageEmbed embed = error(event, err, attachment.getFileName());
if (embed != null) event.getChannel().sendMessage(embed).queue();
return null;
});
}
}
private void playPlayList(GuildMessageReceivedEvent event, List<String> commands) throws Exception {
if (commands == null || commands.isEmpty()) {
event.getChannel().sendMessage(event.getAuthor().getAsMention() + " please provide the name of the playlist to play").queue();
return;
}
String playlist = commands.remove(0);
currentPlaylist = guildSongRepoService.getGuildPlaylistRepo().findByGuildAndUserIdAndPlaylist(guildId, event.getMember().getIdLong(), playlist);
if (currentPlaylist == null) {
event.getChannel().sendMessage(event.getAuthor().getAsMention() + ", no playlist with the name of " + playlist + " exists").queue();
return;
}
ts.clearTracks();
for(GuildPlaylistSong gpls : guildSongRepoService.getGuildPlaylistSongRepo().findByGuildPlaylist(currentPlaylist)) {
Song s = gpls.getGuildSong().getSong();
apm.loadItem(s.getFilePath(), ts).get();
}
playing.set(false);
play(event);
playing.set(true);
}
private MessageEmbed error(GuildMessageReceivedEvent event, Throwable ex, String fileName) {
return new EmbedBuilder()
.setTitle("Unable to upload file: " + fileName)
.setDescription("There was an error uploading your file: " + ex.getMessage() + ". Please contact admin")
.setColor(Color.RED)
.setTimestamp(OffsetDateTime.now())
.setFooter(event.getGuild().getSelfMember().getEffectiveName(), event.getGuild().getSelfMember().getUser().getAvatarUrl())
.build();
}
private MessageEmbed wrongFile(GuildMessageReceivedEvent event, String fileName) {
return new EmbedBuilder()
.setTitle("Invalid File: " + fileName)
.setDescription("Only music type files are allowed to be uploaded")
.setColor(Color.RED)
.setTimestamp(OffsetDateTime.now())
.setFooter(event.getGuild().getSelfMember().getEffectiveName(), event.getGuild().getSelfMember().getUser().getAvatarUrl())
.build();
}
private MessageEmbed persistSong(Mp3UploadResults result, GuildMessageReceivedEvent event, String fileName) throws Exception {
DiscordGuild guild = guildSongRepoService.getGuildRepo().findByGuildId(event.getGuild().getIdLong());
if(guild == null) {
throw new IOException("Unable to find guild in database. Please contact administrator");
}
Path output = musicDir;
if (result.getArtist() != null) {
output = output.resolve(result.getArtist());
if (result.getAlbum() != null) {
output = output.resolve(result.getAlbum());
}
}
output = output.resolve(fileName);
if (!Files.exists(output.toAbsolutePath().getParent())) {
Files.createDirectories(output.toAbsolutePath().getParent());
}
Files.write(output, result.getData());
Song song = new Song();
song.setAlbum(result.getAlbum());
song.setArtist(result.getArtist());
song.setDateAdded(new Date());
song.setDiscNumber(result.getDiscNumber());
if (result.getDuration() != null)
song.setDuration(BigInteger.valueOf(result.getDuration()));
song.setFileHash(HashUtils.hash("SHA-1", result.getData()));
song.setFilePath(output.toAbsolutePath().toString());
song.setGenre(result.getGenre());
song.setReleaseYear(result.getReleaseDate());
song.setTitle(result.getTitle());
song.setTrackNumber(result.getTrackNumber());
guildSongRepoService.getSongRepo().save(song);
GuildSong gs = new GuildSong();
gs.setDateAdded(new Date());
gs.setGuild(guild);
gs.setSong(song);
String[] uuidArray = UUID.randomUUID().toString().split("-");
gs.setUuid(uuidArray[uuidArray.length - 1]);
guildSongRepoService.getGuildSongRepo().save(gs);
MessageEmbed embed = new EmbedBuilder()
.setColor(Color.GREEN)
.setThumbnail(event.getGuild().getIconUrl())
.setTitle("Upload Results for " + fileName)
.addField("Title", result.getTitle(), true)
.addField("Artist", result.getArtist(), true)
.addField("Album", result.getAlbum(), true)
.addField("Track", result.getTrackNumber(), true)
.addField("Disc", result.getDiscNumber(), true)
.addField("Year", result.getReleaseDate(), true)
.addField("Duration", result.getDurationFormat(), true)
.addField("ID", gs.getUuid(), true)
.setTimestamp(OffsetDateTime.now())
.setFooter(event.getGuild().getSelfMember().getEffectiveName(), event.getGuild().getSelfMember().getUser().getAvatarUrl())
.build();
return embed;
}
public void list(GuildMessageReceivedEvent event) {
List<GuildSong> gsList = guildSongRepoService.getGuildSongRepo().findByGuild(guildId);
if (gsList == null || gsList.isEmpty()) {
event.getChannel().sendMessage("There is no music for this guild.").queue();
return;
}
int longestSong = 0;
int longestArtist = 0;
for(GuildSong gs : gsList) {
if (gs.getSong().getTitle().length() > longestSong) longestSong = gs.getSong().getTitle().length();
if (gs.getSong().getArtist().length() > longestArtist) longestArtist = gs.getSong().getArtist().length();
}
String fmt = "%6s | %-" + longestSong +"s | %-" + longestArtist +"s | %s%n";
int count = 0;
StringBuilder sb = new StringBuilder();
sb.append("**" + "Currently available songs for " + event.getGuild().getName() + "**\n\n```");
sb.append(String.format(fmt, "Track", "Title", "Artist", "id"));
sb.append(StringUtils.repeat("-", 27 + longestSong + longestArtist)).append("\n");
for(GuildSong gs : gsList) {
sb.append(String.format(fmt, ++count, gs.getSong().getTitle(), gs.getSong().getArtist(), gs.getUuid()));
}
sb.append("```");
event.getChannel().sendMessage(sb.toString()).queue();
}
private void loadRandomSong() throws Exception {
List<GuildSong> gsList = null;
@ -483,272 +252,23 @@ public class GuildMusicHandler {
int item = random.nextInt(gsList.size());
GuildSong song = gsList.get(item);
apm.loadItem(song.getSong().getFilePath(), ts).get();
trackManager.queueNext(song.getSong().getFilePath());
}
private boolean findSong(String uuid) throws Exception {
GuildSong gs = guildSongRepoService.getGuildSongRepo().findByUuid(uuid);
if (gs == null) return false;
apm.loadItem(gs.getSong().getFilePath(), ts).get();
trackManager.queueNext(gs.getSong().getFilePath());
return true;
}
private void listPlayList(GuildMessageReceivedEvent event, List<String> commands) {
if (commands == null || commands.isEmpty()) {
List<GuildPlaylist> userPlaylist = guildSongRepoService.getGuildPlaylistRepo().findByGuildAndUserIdFetchSongs(event.getGuild().getIdLong(), event.getMember().getIdLong());
if (userPlaylist.isEmpty()) {
event.getChannel().sendMessage(event.getMember().getAsMention() + " you have no defined playlists on this server").queue();
return;
public void setCurrentPlaylist(GuildPlaylist currentPlaylist) {
this.currentPlaylist = currentPlaylist;
}
int longestPlaylist = 0;
for(GuildPlaylist gpl : userPlaylist) {
if (gpl.getPlaylist().length() > longestPlaylist) longestPlaylist = gpl.getPlaylist().length();
}
String fmt = "%6s | %-" + longestPlaylist +"s | %s%n";
StringBuilder sb = new StringBuilder("```");
sb.append(String.format(fmt, "", "Playlist", "Song Count"));
sb.append(StringUtils.repeat("-", 24 + longestPlaylist)).append("\n");
int count = 0;
for(GuildPlaylist gpl : userPlaylist) {
sb.append(String.format(fmt, ++count, gpl.getPlaylist(), gpl.getGuildPlaylistSongList().size()));
}
sb.append("```");
event.getChannel().sendMessage("**" + "Currently available playlists for " + event.getMember().getAsMention() + "**").queue((succcess)->
event.getChannel().sendMessage(sb.toString()).queue()
);
return;
}
String playlist = commands.remove(0);
GuildPlaylist gpl = guildSongRepoService.getGuildPlaylistRepo().findGuildUserPlaylistFetchSongs(event.getGuild().getIdLong(), event.getMember().getIdLong(), playlist);
if (gpl == null) {
event.getChannel().sendMessage(event.getMember().getAsMention() + " you have no defined playlists on this server by the name of " + playlist).queue();
return;
}
if (gpl.getGuildPlaylistSongList().isEmpty()) {
event.getChannel().sendMessage(event.getMember().getAsMention() + " you have no defined songs for playlist " + playlist).queue();
return;
}
int longestSong = 0;
int longestArtist = 0;
for(GuildPlaylistSong gpls : gpl.getGuildPlaylistSongList()) {
GuildSong gs = gpls.getGuildSong();
if (gs.getSong().getTitle().length() > longestSong) longestSong = gs.getSong().getTitle().length();
if (gs.getSong().getArtist().length() > longestArtist) longestArtist = gs.getSong().getArtist().length();
}
String fmt = "%6s | %-" + longestSong +"s | %-" + longestArtist +"s | %s%n";
int count = 0;
StringBuilder sb = new StringBuilder("```");
sb.append(String.format(fmt, "Track", "Title", "Artist", "id"));
sb.append(StringUtils.repeat("-", 27 + longestSong + longestArtist)).append("\n");
for(GuildPlaylistSong gpls : gpl.getGuildPlaylistSongList()) {
GuildSong gs = gpls.getGuildSong();
sb.append(String.format(fmt, ++count, gs.getSong().getTitle(), gs.getSong().getArtist(), gs.getUuid()));
}
sb.append("```");
event.getChannel().sendMessage("**" + "Current songs in playlists " + playlist + " for " + event.getMember().getAsMention() + "**").queue((succcess)->
event.getChannel().sendMessage(sb.toString()).queue()
);
}
private void deletePlayList(GuildMessageReceivedEvent event, List<String> commands) {
if (commands == null || commands.isEmpty()) {
event.getChannel().sendMessage(event.getAuthor().getAsMention() + " you have to provide the playlist to create a new playlist (no spaces in name) and optionally a list of uuids for songs to add").queue();
return;
}
Long guildId = event.getGuild().getIdLong();
DiscordGuild guild = guildSongRepoService.getGuildRepo().findByGuildId(guildId);
if (guild == null) {
event.getChannel().sendMessage("Unable to find guild in local database. Please contact administrator").queue();
return;
}
String playlist = commands.remove(0);
long userId = event.getMember().getIdLong();
GuildPlaylist gpl = guildSongRepoService.getGuildPlaylistRepo().findByGuildAndUserIdAndPlaylist(guild, userId, playlist);
if (commands.isEmpty()) {
MessageEmbed embed = new EmbedBuilder()
.setColor(Color.RED)
.setTitle("Delete Playlist " + playlist)
.setDescription("Are you sure you want to delete the playlist " + playlist)
.setTimestamp(OffsetDateTime.now())
.setFooter(event.getGuild().getSelfMember().getEffectiveName(), event.getGuild().getSelfMember().getUser().getAvatarUrl())
.build();
event.getChannel().sendMessage(embed).queue((msg) -> {
ReactionListener<String> handler = new ReactionListener<>(userId, msg.getId());
handler.setExpiresIn(TimeUnit.MINUTES, 1);
handler.registerReaction(Reactions.CHECK_MARK_BUTTON, (ret) -> deletePlayListConfirm(gpl, event.getMember().getAsMention(), msg));
handler.registerReaction(Reactions.CROSS_MARK_BUTTON, (ret) -> deleteMessage(msg));
reactionHandler.addReactionListener(guildId, msg, handler);
});
return;
}
List<GuildPlaylistSong> songs = guildSongRepoService.getGuildPlaylistSongRepo().findByGuildPlaylistAndSongIds(gpl, commands);
StringBuilder sb = new StringBuilder("Are you sure you want to delete the following songs from playlist " + playlist + "?\n");
for (GuildPlaylistSong gpls : songs) {
GuildSong gs = gpls.getGuildSong();
sb.append(String.format("**%s** by __%s__%n", gs.getSong().getTitle(), gs.getSong().getArtist()));
}
MessageEmbed embed = new EmbedBuilder()
.setColor(Color.RED)
.setTitle("Delete Playlist Songs")
.setDescription(sb.toString())
.setTimestamp(OffsetDateTime.now())
.setFooter(event.getGuild().getSelfMember().getEffectiveName(), event.getGuild().getSelfMember().getUser().getAvatarUrl())
.build();
event.getChannel().sendMessage(embed).queue((msg) -> {
ReactionListener<String> handler = new ReactionListener<>(userId, msg.getId());
handler.setExpiresIn(TimeUnit.MINUTES, 1);
handler.registerReaction(Reactions.CHECK_MARK_BUTTON, (ret) -> deletePlayListSongConfirm(songs, event.getMember().getAsMention(), msg));
handler.registerReaction(Reactions.CROSS_MARK_BUTTON, (ret) -> deleteMessage(msg));
reactionHandler.addReactionListener(guildId, msg, handler);
});
}
private void deletePlayListSongConfirm(List<GuildPlaylistSong> songs, String user, Message msg) {
try {
guildSongRepoService.getGuildPlaylistSongRepo().deleteAll(songs);
msg.getChannel().sendMessage(user + ", songs removed successfully fom playlist").complete();
} catch (Exception ex) {
msg.getChannel().sendMessage("Sorry " + user + " I was unable to remove songs from the playlist. Reason: " + ex.getMessage()).complete();
logger.error("Unable to delete songs from playlist : " + ex.getMessage());
logger.error(ex);
} finally {
deleteMessage(msg);
}
}
private void deletePlayListConfirm(GuildPlaylist gpl, String user, Message msg) {
String playlist = gpl.getPlaylist();
try {
guildSongRepoService.getGuildPlaylistRepo().delete(gpl);
msg.getChannel().sendMessage(user + " " + playlist + " deleted successfully").complete();
} catch (Exception ex) {
msg.getChannel().sendMessage("Sorry " + user + " I was unable to remove playlist " + playlist + ". Reason: " + ex.getMessage()).complete();
logger.error("Unable to delete playlist " + playlist + ": " + ex.getMessage());
logger.error(ex);
} finally {
deleteMessage(msg);
public TrackManager getTrackManager() {
return this.trackManager;
}
}
private void addPlayList(GuildMessageReceivedEvent event, List<String> commands) {
if (commands == null || commands.isEmpty()) {
event.getChannel().sendMessage(event.getAuthor().getAsMention() + " you have to provide the playlist to create a new playlist (no spaces in name) and optionally a list of uuids for songs to add").queue();
return;
}
Long guildId = event.getGuild().getIdLong();
DiscordGuild guild = guildSongRepoService.getGuildRepo().findByGuildId(guildId);
if (guild == null) {
event.getChannel().sendMessage("Unable to find guild in local database. Please contact administrator").queue();
return;
}
String playlist = commands.remove(0);
long userId = event.getMember().getIdLong();
GuildPlaylist gpl = guildSongRepoService.getGuildPlaylistRepo().findByGuildAndUserIdAndPlaylist(guild, userId, playlist);
boolean newList = false;
if (gpl != null && commands.isEmpty()) {
event.getChannel().sendMessage(event.getAuthor().getAsMention() + " a playlist with the name " + playlist + " already exist for you.").queue();
return;
} else if (gpl == null) {
newList = true;
gpl = new GuildPlaylist();
gpl.setDateAdded(new Date());
gpl.setGuild(guild);
gpl.setPlaylist(playlist);
gpl.setUserId(userId);
guildSongRepoService.getGuildPlaylistRepo().save(gpl);
}
if (commands.isEmpty() && newList) {
event.getChannel().sendMessage(event.getAuthor().getAsMention() + " playlist " + playlist + " successfully created.").queue();
return;
}
Set<String> songIds = guildSongRepoService.getGuildPlaylistSongRepo()
.findByGuildPlaylistAndSongIds(gpl, commands).stream()
.map(g -> g.getGuildSong().getUuid())
.collect(Collectors.toSet());
List<GuildPlaylistSong> gplsList = new ArrayList<>();
StringBuilder sb = new StringBuilder();
for(String id : commands.stream().collect(Collectors.toSet())) {
GuildSong gs = guildSongRepoService.getGuildSongRepo().findByUuid(id);
if (songIds.contains(id)) {
sb.append(String.format("**%s** by __%s__ already exists in this playlist.%n", gs.getSong().getTitle(), gs.getSong().getArtist()));
continue;
}
if (gs == null) {
sb.append("Song with id `" + id + "` not found. Please check id\n");
continue;
}
GuildPlaylistSong gpls = new GuildPlaylistSong();
gpls.setDateAdded(new Date());
gpls.setGuildPlaylist(gpl);
gpls.setGuildSong(gs);
gplsList.add(gpls);
sb.append(String.format("**%s** by __%s__ added to playlist.%n", gs.getSong().getTitle(), gs.getSong().getArtist()));
}
if (!gplsList.isEmpty()) {
guildSongRepoService.getGuildPlaylistSongRepo().saveAll(gplsList);
}
MessageEmbed embed = new EmbedBuilder()
.setTitle("Results for adding playlist " + playlist)
.setAuthor(event.getMember().getEffectiveName(), null, event.getAuthor().getAvatarUrl())
.setColor(Color.GREEN)
.setDescription(sb.toString())
.setFooter("", event.getGuild().getSelfMember().getUser().getAvatarUrl())
.setTimestamp(OffsetDateTime.now())
.build();
event.getChannel().sendMessage(embed).queue();
}
private void deleteMessage(Message msg) {
try {
msg.delete().complete();
reactionHandler.removeReactionListener(guildId, msg.getIdLong());
} catch (ErrorResponseException ex) {
if (ex.getErrorResponse() != ErrorResponse.UNKNOWN_MESSAGE) throw ex;
}
}
}

View File

@ -1,15 +1,15 @@
/**
/*
*
* Project: Pseudo-Bot, File: ReactionHandler.java
* Project: Eight Track, File: ReactionHandler.java
*
* Copyright 2019 Locusworks LLC.
* Copyright 2019-2021 Locusworks LLC.
* All rights reserved. Federal copyright law prohibits unauthorized reproduction by
* any means and imposes fines up to $25,000 for violation. No part of this material
* may be reproduced, transmitted, transcribed, stored in a retrieval system, copied,
* modified, duplicated, adapted or translated into another program language in any
* form or by any means, electronic, mechanical, photocopying, recording, or
* otherwise, without the prior written permission from Locusworks. Locusworks
* affirms that PSEUDO-BOT(R) software and data is subject to United States
* affirms that Eight-Track(R) software and data is subject to United States
* Government Purpose Rights. Contact Locusworks, 1313 Lawnview Drive
* Forney TX 75126, (802) 488-0438, for commercial licensing opportunities.
*

View File

@ -0,0 +1,34 @@
/*
*
* Project: Eight Track, File: AbstractDiscordEventListener.java
*
* Copyright 2019-2021 Locusworks LLC.
* All rights reserved. Federal copyright law prohibits unauthorized reproduction by
* any means and imposes fines up to $25,000 for violation. No part of this material
* may be reproduced, transmitted, transcribed, stored in a retrieval system, copied,
* modified, duplicated, adapted or translated into another program language in any
* form or by any means, electronic, mechanical, photocopying, recording, or
* otherwise, without the prior written permission from Locusworks. Locusworks
* affirms that Eight-Track(R) software and data is subject to United States
* Government Purpose Rights. Contact Locusworks, 1313 Lawnview Drive
* Forney TX 75126, (802) 488-0438, for commercial licensing opportunities.
*
* IN NO EVENT SHALL LOCUSWORKS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL,
* INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT
* OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF LOCUSWORKS HAS BEEN
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. NO RESPONSIBILITY IS ASSUMED BY
* LOCUSWORKS FOR ITS USE, OR FOR ANY INFRINGEMENTS OF PATENTS OR OTHER RIGHTS OF
* THIRD PARTIES RESULTING FROM ITS USE. LOCUSWORKS SPECIFICALLY DISCLAIMS ANY
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE AND
* ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED HEREUNDER IS PROVIDED "AS
* IS". LOCUSWORKS HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES,
* ENHANCEMENTS, OR MODIFICATIONS.
*/
package net.locusworks.discord.eighttrack.listeners;
import net.dv8tion.jda.api.hooks.ListenerAdapter;
public abstract class AbstractDiscordEventListener extends ListenerAdapter {
}

View File

@ -1,8 +1,8 @@
/**
/*
*
* Project: Eight Track, File: DiscordEventHandler.java
* Project: Eight Track, File: DiscordEventListener.java
*
* Copyright 2019-2019 Locusworks LLC.
* Copyright 2019-2021 Locusworks LLC.
* All rights reserved. Federal copyright law prohibits unauthorized reproduction by
* any means and imposes fines up to $25,000 for violation. No part of this material
* may be reproduced, transmitted, transcribed, stored in a retrieval system, copied,
@ -25,60 +25,62 @@
* IS". LOCUSWORKS HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES,
* ENHANCEMENTS, OR MODIFICATIONS.
*/
package net.locusworks.discord.eighttrack.handlers;
package net.locusworks.discord.eighttrack.listeners;
import java.awt.Color;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.time.OffsetDateTime;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import javax.annotation.PostConstruct;
import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeMap;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.entities.ChannelType;
import net.dv8tion.jda.api.entities.TextChannel;
import net.dv8tion.jda.api.events.guild.GuildJoinEvent;
import net.dv8tion.jda.api.events.ExceptionEvent;
import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent;
import net.dv8tion.jda.api.events.message.react.MessageReactionAddEvent;
import net.dv8tion.jda.api.hooks.ListenerAdapter;
import net.locusworks.discord.eighttrack.database.entities.DiscordGuild;
import net.locusworks.discord.eighttrack.events.main.AbstractMainEventHandler;
import net.locusworks.discord.eighttrack.handlers.ReactionHandler;
import net.locusworks.discord.eighttrack.services.ConfigurationService;
import net.locusworks.discord.eighttrack.services.GuildMusicService;
import net.locusworks.discord.eighttrack.services.GuildSongRepoService;
import net.locusworks.discord.eighttrack.services.RepositoryService;
import net.locusworks.logger.ApplicationLogger;
import net.locusworks.logger.ApplicationLoggerFactory;
@Service
public class DiscordEventHandler extends ListenerAdapter {
public class DiscordEventListener extends AbstractDiscordEventListener {
private Path musicDir;
private ApplicationLogger logger = ApplicationLoggerFactory.getLogger(DiscordEventHandler.class);
private ApplicationLogger logger = ApplicationLoggerFactory.getLogger(DiscordEventListener.class);
@Autowired
private ConfigurationService confService;
@Autowired
private Mp3UploadHandler uploadHandler;
@Autowired
private GuildSongRepoService guildSongRepoService;
private RepositoryService guildSongRepoService;
@Autowired
private ReactionHandler reactionHandler;
@PostConstruct
private void init() throws IOException {
this.musicDir = confService.getMusicDirectory();
private Map<String, AbstractMainEventHandler> events;
@Autowired
private void setup(ConfigurationService cService, List<AbstractMainEventHandler> eventHandlers) throws IOException {
this.musicDir = cService.getMusicDirectory();
if (!Files.exists(this.musicDir.toAbsolutePath())) {
Files.createDirectories(this.musicDir.toAbsolutePath());
}
events = new TreeMap<>();
for(AbstractMainEventHandler handler : eventHandlers) {
events.put(handler.getCommand(), handler);
}
}
@Scheduled(fixedRate = 300000L, initialDelay=300000L)
@ -101,81 +103,51 @@ 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) 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);
} catch (Exception ex) {
logger.error("Unable to persist server information to database: " + ex.getMessage(), ex);
}
}
@Override
public void onGuildMessageReceived(GuildMessageReceivedEvent event) {
if (event.getAuthor().isBot()) return;
try {
onGuildMessageReceivedHelper(event);
} catch (Throwable t) {
guildSongRepoService.logEntry(event.getGuild().getIdLong(), t, "An error occured: %s", t.getMessage());
logger.error(t);
}
}
private void onGuildMessageReceivedHelper(GuildMessageReceivedEvent event) throws Exception {
if (!GuildMusicService.getMap().containsKey(event.getGuild().getIdLong())) {
GuildMusicService.getMap().put(event.getGuild().getIdLong(),
new GuildMusicHandler(musicDir, event.getGuild().getIdLong(), uploadHandler, reactionHandler, guildSongRepoService));
@Override
public void onException(ExceptionEvent event) {
logger.error("A general exception occured: " + event.getCause().getMessage());
logger.error(event.getCause());
}
GuildMusicHandler gmh = GuildMusicService.getMap().get(event.getGuild().getIdLong());
gmh.accept((id) -> GuildMusicService.getMap().remove(id));
private void onGuildMessageReceivedHelper(GuildMessageReceivedEvent event) throws Exception {
List<String> commands = new ArrayList<String>(Arrays.asList(event.getMessage().getContentRaw().trim().toLowerCase().split(" ")));
String command = commands.remove(0);
switch(command) {
case "-upload":
gmh.upload(event);
return;
case "-play":
gmh.play(event, commands);
gmh.isPlaying(true);
return;
case "-stop":
gmh.isPlaying(false);
gmh.stop(event);
event.getGuild().getAudioManager().closeAudioConnection();
return;
case "-next":
gmh.next(event, commands);
return;
case "-repeat":
gmh.repeat(event);
gmh.isPlaying(true);
return;
case "-upnext":
gmh.upNext(event, commands);
return;
case "-list":
gmh.list(event);
return;
case "-playlist":
gmh.playlist(event, commands);
default:
AbstractMainEventHandler aeh = events.get(command.toLowerCase());
if (aeh != null) {
aeh.executeEvent(event, commands);
return;
}
if (!command.equalsIgnoreCase("-help")) return;
StringBuilder sb = new StringBuilder();
for (Entry<String, AbstractMainEventHandler> entry : events.entrySet()) {
sb.append(String.format("%s | %s%n", entry.getKey(), entry.getValue().help()));
}
EmbedBuilder builder = new EmbedBuilder()
.setColor(Color.GREEN)
.setThumbnail(event.getGuild().getIconUrl())
.setTitle("Eight Track Help Menu")
.setDescription(sb.toString())
.setTimestamp(OffsetDateTime.now())
.setFooter(event.getGuild().getSelfMember().getEffectiveName(), event.getGuild().getSelfMember().getUser().getAvatarUrl());
event.getChannel().sendMessage(builder.build()).queue();
}
}

View File

@ -0,0 +1,74 @@
/*
*
* Project: Eight Track, File: DiscordGuildJoinEventListener.java
*
* Copyright 2019-2021 Locusworks LLC.
* All rights reserved. Federal copyright law prohibits unauthorized reproduction by
* any means and imposes fines up to $25,000 for violation. No part of this material
* may be reproduced, transmitted, transcribed, stored in a retrieval system, copied,
* modified, duplicated, adapted or translated into another program language in any
* form or by any means, electronic, mechanical, photocopying, recording, or
* otherwise, without the prior written permission from Locusworks. Locusworks
* affirms that Eight-Track(R) software and data is subject to United States
* Government Purpose Rights. Contact Locusworks, 1313 Lawnview Drive
* Forney TX 75126, (802) 488-0438, for commercial licensing opportunities.
*
* IN NO EVENT SHALL LOCUSWORKS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL,
* INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT
* OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF LOCUSWORKS HAS BEEN
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. NO RESPONSIBILITY IS ASSUMED BY
* LOCUSWORKS FOR ITS USE, OR FOR ANY INFRINGEMENTS OF PATENTS OR OTHER RIGHTS OF
* THIRD PARTIES RESULTING FROM ITS USE. LOCUSWORKS SPECIFICALLY DISCLAIMS ANY
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE AND
* ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED HEREUNDER IS PROVIDED "AS
* IS". LOCUSWORKS HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES,
* ENHANCEMENTS, OR MODIFICATIONS.
*/
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.locusworks.discord.eighttrack.database.entities.DiscordGuild;
import net.locusworks.discord.eighttrack.services.RepositoryService;
import net.locusworks.logger.ApplicationLogger;
import net.locusworks.logger.ApplicationLoggerFactory;
@Service
public class DiscordGuildJoinEventListener extends AbstractDiscordEventListener {
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());
}
}
}

View File

@ -1,15 +1,15 @@
/**
/*
*
* Project: Pseudo-Bot, File: ReactionListener.java
* Project: Eight Track, File: ReactionListener.java
*
* Copyright 2019 Locusworks LLC.
* Copyright 2019-2021 Locusworks LLC.
* All rights reserved. Federal copyright law prohibits unauthorized reproduction by
* any means and imposes fines up to $25,000 for violation. No part of this material
* may be reproduced, transmitted, transcribed, stored in a retrieval system, copied,
* modified, duplicated, adapted or translated into another program language in any
* form or by any means, electronic, mechanical, photocopying, recording, or
* otherwise, without the prior written permission from Locusworks. Locusworks
* affirms that PSEUDO-BOT(R) software and data is subject to United States
* affirms that Eight-Track(R) software and data is subject to United States
* Government Purpose Rights. Contact Locusworks, 1313 Lawnview Drive
* Forney TX 75126, (802) 488-0438, for commercial licensing opportunities.
*

View File

@ -1,8 +1,8 @@
/**
/*
*
* Project: Eight Track, File: EightTrackLauncher.java
*
* Copyright 2019-2019 Locusworks LLC.
* Copyright 2019-2021 Locusworks LLC.
* All rights reserved. Federal copyright law prohibits unauthorized reproduction by
* any means and imposes fines up to $25,000 for violation. No part of this material
* may be reproduced, transmitted, transcribed, stored in a retrieval system, copied,
@ -74,7 +74,5 @@ public class EightTrackLauncher implements ApplicationRunner {
logger.info("Starting Eight-Track");
service.begin();
}
}

View File

@ -1,8 +1,8 @@
/**
/*
*
* Project: Eight Track, File: AESService.java
*
* Copyright 2019-2019 Locusworks LLC.
* Copyright 2019-2021 Locusworks LLC.
* All rights reserved. Federal copyright law prohibits unauthorized reproduction by
* any means and imposes fines up to $25,000 for violation. No part of this material
* may be reproduced, transmitted, transcribed, stored in a retrieval system, copied,
@ -67,7 +67,7 @@ public class AESService {
AESService service = new AESService();
service.init();
System.out.println(service.encrypt("zeGAPgbH9HFbqmjRjmwzUDKv"));
System.out.println(service.encrypt("yqwAK!H5KAc0d2xWdN6*S0w4"));
}

View File

@ -1,8 +1,8 @@
/**
/*
*
* Project: Eight Track, File: ConfigurationService.java
*
* Copyright 2019-2019 Locusworks LLC.
* Copyright 2019-2021 Locusworks LLC.
* All rights reserved. Federal copyright law prohibits unauthorized reproduction by
* any means and imposes fines up to $25,000 for violation. No part of this material
* may be reproduced, transmitted, transcribed, stored in a retrieval system, copied,
@ -36,6 +36,7 @@ import java.util.Properties;
import javax.annotation.PostConstruct;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@ -116,7 +117,7 @@ public class ConfigurationService {
}
if (changed) {
PropertiesManager.saveConfiguration(configuration, eightTrackConf, "Patch Repository properties file");
PropertiesManager.saveConfiguration(configuration, eightTrackConf, "Eight Track properties file");
}
lastModified = Files.getLastModifiedTime(eightTrackConf).toMillis();
@ -132,7 +133,7 @@ public class ConfigurationService {
* @throws Exception general exception
*/
public void saveToConf(Properties confs) throws Exception {
PropertiesManager.saveConfiguration(confs, eightTrackConf, "Patch Repository properties file");
PropertiesManager.saveConfiguration(confs, eightTrackConf, "Eight Track properties file");
logger.info("Saved config file: " + eightTrackConf + ", " + confs.size() + " entries");
loadConf();
}
@ -214,7 +215,10 @@ public class ConfigurationService {
}
public Path getMusicDirectory() {
String dir = configuration.getProperty(Configuration.MUSIC_DIR.getValue(), "");
String dir = System.getProperty("MUSIC_DIR") == null ? System.getenv("MUSIC_DIR") : System.getProperty("MUSIC_DIR");
if (StringUtils.isBlank(dir)) {
dir = configuration.getProperty(Configuration.MUSIC_DIR.getValue(), "");
}
return Paths.get(dir);
}

View File

@ -1,8 +1,8 @@
/**
/*
*
* Project: Eight Track, File: DatabaseCleanupService.java
*
* Copyright 2019-2019 Locusworks LLC.
* Copyright 2019-2021 Locusworks LLC.
* All rights reserved. Federal copyright law prohibits unauthorized reproduction by
* any means and imposes fines up to $25,000 for violation. No part of this material
* may be reproduced, transmitted, transcribed, stored in a retrieval system, copied,
@ -27,24 +27,17 @@
*/
package net.locusworks.discord.eighttrack.services;
import java.time.Duration;
import java.time.OffsetDateTime;
import java.util.Iterator;
import java.util.Set;
import java.util.Map.Entry;
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.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.entities.VoiceChannel;
import net.locusworks.discord.eighttrack.database.repos.GuildRepository;
import net.locusworks.discord.eighttrack.handlers.GuildMusicHandler;
import net.locusworks.logger.ApplicationLogger;
import net.locusworks.logger.ApplicationLoggerFactory;
@Service
public class DatabaseCleanupService {
@ -54,63 +47,15 @@ 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;
private JDA client;
public void setClient(JDA client) {
this.client = client;
}
/**
* Close out connections that are no long being played. clean up resources
*/
@Scheduled(fixedRate = 5 * MINUTE)
private void checkPlayers() {
if (client == null) {
logger.warn("Discord client is null. Unable to do cleanup");
return;
}
logger.debug("Checking players to see if anyone is listening");
OffsetDateTime now = OffsetDateTime.now();
for(Iterator<Entry<Long, GuildMusicHandler>> iterator = GuildMusicService.getMap().entrySet().iterator(); iterator.hasNext();) {
Entry<Long, GuildMusicHandler> entry = iterator.next();
GuildMusicHandler gmh = entry.getValue();
long guildId = entry.getKey();
Guild guild = client.getGuildById(guildId);
if (guild == null) {
iterator.remove();
continue;
}
OffsetDateTime lastPlayed = gmh.getLastPlayed();
Duration duration = Duration.between(lastPlayed, now);
if (duration.toMillis() > 5 * MINUTE) {
guild.getAudioManager().closeAudioConnection();
iterator.remove();
}
Long voiceChannelId = gmh.getCurrentVoiceChannelId();
if (voiceChannelId == null) {
guild.getAudioManager().closeAudioConnection();
iterator.remove();
} else {
VoiceChannel vc = guild.getVoiceChannelById(voiceChannelId);
if (vc != null && vc.getMembers().size() == 1) {
guild.getAudioManager().closeAudioConnection();
iterator.remove();
}
}
}
}
@Scheduled(fixedRate = DAY)
private void cleanDatabase() {
JDA client = EightTrackService.getClient();
if (client == null) {
logger.warn("Discord client is null. Unable to do cleanup");
return;

View File

@ -1,8 +1,8 @@
/**
/*
*
* Project: Eight Track, File: EightTrackService.java
*
* Copyright 2019-2019 Locusworks LLC.
* Copyright 2019-2021 Locusworks LLC.
* All rights reserved. Federal copyright law prohibits unauthorized reproduction by
* any means and imposes fines up to $25,000 for violation. No part of this material
* may be reproduced, transmitted, transcribed, stored in a retrieval system, copied,
@ -27,15 +27,16 @@
*/
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.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.listeners.AbstractDiscordEventListener;
import net.locusworks.logger.ApplicationLogger;
import net.locusworks.logger.ApplicationLoggerFactory;
@ -44,26 +45,43 @@ public class EightTrackService {
private ApplicationLogger logger = ApplicationLoggerFactory.getLogger(EightTrackService.class);
private JDA client;
private static JDA client;
@Autowired
private ConfigurationService confService;
@Autowired
private DiscordEventHandler eventListener;
private List<AbstractDiscordEventListener> eventListeners;
@Autowired
private DatabaseCleanupService dcs;
private void setup(List<AbstractDiscordEventListener> eventListeners) {
this.eventListeners = eventListeners;
}
public void begin() throws LoginException {
try {
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);
client = new JDABuilder(AccountType.BOT).setToken(token).build();
client.addEventListener(eventListener);
dcs.setClient(client);
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;
}
}

View File

@ -1,8 +1,8 @@
/**
/*
*
* Project: Eight Track, File: GuildMusicService.java
*
* Copyright 2019-2019 Locusworks LLC.
* Copyright 2019-2021 Locusworks LLC.
* All rights reserved. Federal copyright law prohibits unauthorized reproduction by
* any means and imposes fines up to $25,000 for violation. No part of this material
* may be reproduced, transmitted, transcribed, stored in a retrieval system, copied,
@ -27,17 +27,104 @@
*/
package net.locusworks.discord.eighttrack.services;
import java.time.Duration;
import java.time.OffsetDateTime;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;
import javax.annotation.PostConstruct;
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.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.entities.VoiceChannel;
import net.locusworks.discord.eighttrack.database.entities.DiscordGuild;
import net.locusworks.discord.eighttrack.handlers.GuildMusicHandler;
import net.locusworks.logger.ApplicationLogger;
import net.locusworks.logger.ApplicationLoggerFactory;
@Service
public class GuildMusicService {
private ApplicationLogger logger;
@Autowired
private RepositoryService guildRepoService;
private static Map<Long, GuildMusicHandler> handlerMap = new ConcurrentHashMap<>();
public static Map<Long, GuildMusicHandler> getMap() {
return handlerMap;
@PostConstruct
private void init() {
logger = ApplicationLoggerFactory.getLogger(GuildMusicService.class);
for (DiscordGuild dg : guildRepoService.getGuildRepo().findAll()) {
GuildMusicHandler gmh = createMusicHandler(dg.getGuildId());
handlerMap.put(dg.getGuildId(), gmh);
}
}
/**
* Close out connections that are no long being played. clean up resources
*/
@Scheduled(fixedRate = 5 * 60 * 1000)
private void checkPlayers() {
JDA client = EightTrackService.getClient();
if (client == null) {
logger.warn("Discord client is null. Unable to do cleanup");
return;
}
logger.debug("Checking players to see if anyone is listening");
OffsetDateTime now = OffsetDateTime.now();
for(Iterator<Entry<Long, GuildMusicHandler>> iterator = handlerMap.entrySet().iterator(); iterator.hasNext();) {
Entry<Long, GuildMusicHandler> entry = iterator.next();
GuildMusicHandler gmh = entry.getValue();
long guildId = entry.getKey();
Guild guild = client.getGuildById(guildId);
if (guild == null) {
iterator.remove();
continue;
}
OffsetDateTime lastPlayed = gmh.getLastPlayed();
Duration duration = Duration.between(lastPlayed, now);
if (duration.toMillis() > 5 * 60 * 1000) {
guild.getAudioManager().closeAudioConnection();
iterator.remove();
}
Long voiceChannelId = gmh.getCurrentVoiceChannelId();
if (voiceChannelId == null) {
guild.getAudioManager().closeAudioConnection();
iterator.remove();
} else {
VoiceChannel vc = guild.getVoiceChannelById(voiceChannelId);
if (vc != null && vc.getMembers().size() == 1) {
guild.getAudioManager().closeAudioConnection();
iterator.remove();
}
}
}
}
public GuildMusicHandler getMusicHandler(Long guildId) {
if (!handlerMap.containsKey(guildId)) {
GuildMusicHandler gmh = createMusicHandler(guildId);
handlerMap.put(guildId, gmh);
}
return handlerMap.get(guildId);
}
/**
* @param guildId
* @return
*/
private GuildMusicHandler createMusicHandler(Long guildId) {
GuildMusicHandler gmh = new GuildMusicHandler(guildId, guildRepoService);
gmh.accept((id) -> handlerMap.remove(id));
return gmh;
}
}

View File

@ -1,8 +1,8 @@
/**
/*
*
* Project: Eight Track, File: GuildSongRepoService.java
* Project: Eight Track, File: RepositoryService.java
*
* Copyright 2019-2019 Locusworks LLC.
* Copyright 2019-2021 Locusworks LLC.
* All rights reserved. Federal copyright law prohibits unauthorized reproduction by
* any means and imposes fines up to $25,000 for violation. No part of this material
* may be reproduced, transmitted, transcribed, stored in a retrieval system, copied,
@ -27,9 +27,14 @@
*/
package net.locusworks.discord.eighttrack.services;
import java.io.ByteArrayOutputStream;
import java.io.PrintWriter;
import java.util.Date;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import net.locusworks.discord.eighttrack.database.entities.DiscordGuild;
import net.locusworks.discord.eighttrack.database.entities.Log;
import net.locusworks.discord.eighttrack.database.repos.GuildLogRepository;
import net.locusworks.discord.eighttrack.database.repos.GuildPlaylistRepository;
import net.locusworks.discord.eighttrack.database.repos.GuildPlaylistSongRepository;
import net.locusworks.discord.eighttrack.database.repos.GuildRepository;
@ -37,7 +42,7 @@ import net.locusworks.discord.eighttrack.database.repos.GuildSongRepository;
import net.locusworks.discord.eighttrack.database.repos.SongRepository;
@Service
public class GuildSongRepoService {
public class RepositoryService {
@Autowired
private GuildRepository guildRepo;
@ -54,6 +59,43 @@ public class GuildSongRepoService {
@Autowired
private SongRepository songRepo;
@Autowired
private GuildLogRepository guildLogRepo;
public void logEntry(long guildId, String msg) {
logEntry(guildId, null, "%s", new Object[] {msg});
}
public void logEntry(long guildId, String msgFmt, Object... args) {
logEntry(guildId, null, msgFmt, args);
}
public void logEntry(long guildId, Throwable ex, String msgFmt, Object... args) {
DiscordGuild dg = guildRepo.findByGuildId(guildId);
if (dg == null) return;
String msg = String.format(msgFmt, args);
Log log = new Log();
log.setDateAdded(new Date());
log.setGuild(dg);
log.setIsException(ex != null);
log.setLog(msg);
if (ex != null) {
log.setException(printTrace(ex));
}
guildLogRepo.save(log);
}
private byte[] printTrace(Throwable ex) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ex.printStackTrace(new PrintWriter(baos));
return baos.toByteArray();
}
/**
* @return the guildRepo
*/
@ -89,4 +131,8 @@ public class GuildSongRepoService {
return songRepo;
}
public final GuildLogRepository getGuildLogRepo() {
return guildLogRepo;
}
}

View File

@ -0,0 +1,51 @@
/*
*
* Project: Eight Track, File: ApplicationContextHolder.java
*
* Copyright 2019-2021 Locusworks LLC.
* All rights reserved. Federal copyright law prohibits unauthorized reproduction by
* any means and imposes fines up to $25,000 for violation. No part of this material
* may be reproduced, transmitted, transcribed, stored in a retrieval system, copied,
* modified, duplicated, adapted or translated into another program language in any
* form or by any means, electronic, mechanical, photocopying, recording, or
* otherwise, without the prior written permission from Locusworks. Locusworks
* affirms that Eight-Track(R) software and data is subject to United States
* Government Purpose Rights. Contact Locusworks, 1313 Lawnview Drive
* Forney TX 75126, (802) 488-0438, for commercial licensing opportunities.
*
* IN NO EVENT SHALL LOCUSWORKS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL,
* INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT
* OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF LOCUSWORKS HAS BEEN
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. NO RESPONSIBILITY IS ASSUMED BY
* LOCUSWORKS FOR ITS USE, OR FOR ANY INFRINGEMENTS OF PATENTS OR OTHER RIGHTS OF
* THIRD PARTIES RESULTING FROM ITS USE. LOCUSWORKS SPECIFICALLY DISCLAIMS ANY
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE AND
* ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED HEREUNDER IS PROVIDED "AS
* IS". LOCUSWORKS HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES,
* ENHANCEMENTS, OR MODIFICATIONS.
*/
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;
}
}

View File

@ -0,0 +1,81 @@
/*
*
* Project: Eight Track, File: BeanFinder.java
*
* Copyright 2019-2021 Locusworks LLC.
* All rights reserved. Federal copyright law prohibits unauthorized reproduction by
* any means and imposes fines up to $25,000 for violation. No part of this material
* may be reproduced, transmitted, transcribed, stored in a retrieval system, copied,
* modified, duplicated, adapted or translated into another program language in any
* form or by any means, electronic, mechanical, photocopying, recording, or
* otherwise, without the prior written permission from Locusworks. Locusworks
* affirms that Eight-Track(R) software and data is subject to United States
* Government Purpose Rights. Contact Locusworks, 1313 Lawnview Drive
* Forney TX 75126, (802) 488-0438, for commercial licensing opportunities.
*
* IN NO EVENT SHALL LOCUSWORKS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL,
* INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT
* OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF LOCUSWORKS HAS BEEN
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. NO RESPONSIBILITY IS ASSUMED BY
* LOCUSWORKS FOR ITS USE, OR FOR ANY INFRINGEMENTS OF PATENTS OR OTHER RIGHTS OF
* THIRD PARTIES RESULTING FROM ITS USE. LOCUSWORKS SPECIFICALLY DISCLAIMS ANY
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE AND
* ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED HEREUNDER IS PROVIDED "AS
* IS". LOCUSWORKS HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES,
* ENHANCEMENTS, OR MODIFICATIONS.
*/
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<BeanDefinition> 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 <T> List<T> autowireBeans(Class<T> clazz, String basePackage, TypeFilter... filters) throws BeansException {
try {
List<T> 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);
}
}
}

View File

@ -1,15 +1,15 @@
/**
/*
*
* Project: Pseudo-Bot, File: Reactions.java
* Project: Eight Track, File: Reactions.java
*
* Copyright 2019 Locusworks LLC.
* Copyright 2019-2021 Locusworks LLC.
* All rights reserved. Federal copyright law prohibits unauthorized reproduction by
* any means and imposes fines up to $25,000 for violation. No part of this material
* may be reproduced, transmitted, transcribed, stored in a retrieval system, copied,
* modified, duplicated, adapted or translated into another program language in any
* form or by any means, electronic, mechanical, photocopying, recording, or
* otherwise, without the prior written permission from Locusworks. Locusworks
* affirms that PSEUDO-BOT(R) software and data is subject to United States
* affirms that Eight-Track(R) software and data is subject to United States
* Government Purpose Rights. Contact Locusworks, 1313 Lawnview Drive
* Forney TX 75126, (802) 488-0438, for commercial licensing opportunities.
*

View File

@ -7,11 +7,8 @@
<class>net.locusworks.discord.eighttrack.database.entities.DiscordGuild</class>
<class>net.locusworks.discord.eighttrack.database.entities.Song</class>
<class>net.locusworks.discord.eighttrack.database.entities.GuildPlaylistSong</class>
<class>net.locusworks.discord.eighttrack.database.entities.Log</class>
<properties>
<property name="javax.persistence.jdbc.url" value="jdbc:mariadb://devops.locusworks.net:3306/eighttrack"/>
<property name="javax.persistence.jdbc.user" value="root"/>
<property name="javax.persistence.jdbc.driver" value="org.mariadb.jdbc.Driver"/>
<property name="javax.persistence.jdbc.password" value="0a0wNt6aX4e66LNhA5uKLdnnN"/>
</properties>
</persistence-unit>
</persistence>

View File

@ -1,14 +1,14 @@
CREATE TABLE eighttrack.discord_guild (
id bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'Auto increment primary key',
guild_id bigint(20) NOT NULL COMMENT 'id of the discord guild',
id bigint NOT NULL AUTO_INCREMENT COMMENT 'Auto increment primary key',
guild_id bigint NOT NULL COMMENT 'id of the discord guild',
guild_name varchar(100) NOT NULL COMMENT 'name of the discord guild',
date_joined datetime DEFAULT NULL COMMENT 'date the guild joined',
PRIMARY KEY (id),
UNIQUE KEY guild_UN (guild_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Information about discord guild';
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Information about discord guild';
CREATE TABLE eighttrack.song (
id bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'Primary Key',
id bigint NOT NULL AUTO_INCREMENT COMMENT 'Primary Key',
title varchar(500) NOT NULL COMMENT 'title of song',
artist varchar(500) DEFAULT NULL COMMENT 'songs artist',
album varchar(500) DEFAULT NULL COMMENT 'songs album',
@ -16,7 +16,7 @@ CREATE TABLE eighttrack.song (
track_number varchar(100) DEFAULT NULL COMMENT 'track number',
disc_number varchar(100) DEFAULT NULL COMMENT 'disc number',
release_year varchar(100) DEFAULT NULL COMMENT 'release year',
duration bigint(20) DEFAULT NULL COMMENT 'songs duration',
duration bigint DEFAULT NULL COMMENT 'songs duration',
file_path varchar(5000) NOT NULL COMMENT 'file location on local file system',
file_hash varchar(40) NOT NULL COMMENT 'sha1 hash of file',
date_added timestamp NULL DEFAULT NULL,
@ -25,10 +25,10 @@ CREATE TABLE eighttrack.song (
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE eighttrack.guild_song (
id bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'primary key',
id bigint NOT NULL AUTO_INCREMENT COMMENT 'primary key',
uuid varchar(100) NOT NULL COMMENT 'Unique Identifier',
guild bigint(20) NOT NULL COMMENT 'guild the song belongs to',
song bigint(20) NOT NULL COMMENT 'the song',
guild bigint NOT NULL COMMENT 'guild the song belongs to',
song bigint NOT NULL COMMENT 'the song',
date_added timestamp NULL DEFAULT NULL COMMENT 'date added',
PRIMARY KEY (id),
UNIQUE KEY guild_song_UN (guild,song),
@ -39,9 +39,9 @@ CREATE TABLE eighttrack.guild_song (
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE eighttrack.guild_playlist (
id bigint(20) NOT NULL AUTO_INCREMENT,
guild bigint(20) NOT NULL,
userId bigint(20) NOT NULL,
id bigint NOT NULL AUTO_INCREMENT,
guild bigint NOT NULL,
userId bigint NOT NULL,
playlist varchar(500) NOT NULL,
date_added timestamp NULL DEFAULT NULL,
PRIMARY KEY (id),
@ -51,9 +51,9 @@ CREATE TABLE eighttrack.guild_playlist (
CREATE TABLE eighttrack.guild_playlist_song (
id bigint(20) NOT NULL AUTO_INCREMENT,
guild_playlist bigint(20) NOT NULL,
guild_song bigint(20) NOT NULL,
id bigint NOT NULL AUTO_INCREMENT,
guild_playlist bigint NOT NULL,
guild_song bigint NOT NULL,
date_added timestamp NULL DEFAULT NULL,
PRIMARY KEY (id),
UNIQUE KEY guild_playlist_song_UN (guild_playlist,guild_song),
@ -61,3 +61,15 @@ CREATE TABLE eighttrack.guild_playlist_song (
CONSTRAINT guild_playlist_song_FK FOREIGN KEY (guild_playlist) REFERENCES eighttrack.guild_playlist (id) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT guild_playlist_song_FK_1 FOREIGN KEY (guild_song) REFERENCES eighttrack.guild_song (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE eighttrack.log (
id bigint NOT NULL AUTO_INCREMENT,
guild bigint NOT NULL,
log longtext NOT NULL,
exception longblob,
is_exception boolean NOT NULL,
date_added timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
PRIMARY KEY (id),
KEY log_fk (guild),
CONSTRAINT log_fk FOREIGN KEY (guild) REFERENCES eighttrack.discord_guild (id) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

View File

@ -1,4 +1,4 @@
USE pseudobot;
USE eighttrack;
DELIMITER $$
CREATE PROCEDURE set_optimizer_switch_on()
@ -15,10 +15,6 @@ BEGIN
IF foo = 0 THEN
CREATE USER 'eighttrackAdmin'@'localhost' IDENTIFIED BY 'zeGAPgbH9HFbqmjRjmwzUDKv';
END IF;
SELECT COUNT(*) INTO foo FROM mysql.user WHERE User = 'eighttrackAdmin' and Host = '%';
IF foo = 0 THEN
CREATE USER 'eighttrackAdmin'@'%' IDENTIFIED BY 'zeGAPgbH9HFbqmjRjmwzUDKv';
END IF;
END ;$$
DELIMITER ;
@ -30,5 +26,4 @@ CALL create_user();
DROP PROCEDURE create_user;
GRANT SELECT,INSERT,UPDATE,DELETE ON eighttrack.* TO 'eighttrackAdmin'@'localhost';
GRANT SELECT,INSERT,UPDATE,DELETE ON eighttrack.* TO 'eighttrackAdmin'@'%';
FLUSH PRIVILEGES;

View File

@ -0,0 +1 @@
CREATE DATABASE IF NOT EXISTS eighttrack;

View File

@ -1,10 +1,10 @@
dbAdmin=root
dbAdminPassword=gSkjsvZbQTQtogOrPYqorCuuzp4WUpGFVtPYtMVj47U=
dbAdminPassword=bDNuBX0IqflafBFBfr10MQkdGgamC3UeZ0GcsWUWeCI=
dbUser=eighttrackAdmin
dbUserPassword=RaamWDMgA2p09R3kAiKHqauu6mmKU2HLQ4nAfEGMNOs=
dbHost=devops.locusworks.net
dbHost=localhost
dbPort=3306
logLevel=INFO
musicDir=E:/Music
discordToken=NjI5MTQ0OTk1ODA2MzE0NTA5.XZVlRQ.7hiB0u4Zp5pxPrPfvdOdyr4TCh4
musicDir=D:/Music
discordToken=NjMzMDA2ODIzNzk1OTgyMzQ0.XtLtpA.sramb2b8w4itTFPQ92HqZgyeBJU

View File

@ -3,7 +3,7 @@
<Configuration status="WARN" shutdownHook="disable"
packages="net.locusworks.discord.eighttrack">
<Properties>
<Property name="logFormat">%d{dd-MMM-yyyy HH:mm:ss.SSS} [%-5p] [%c{1}] %m%n</Property>
<Property name="logFormat">%d{dd-MMM-yyyy HH:mm:ss.SSS} %m%n</Property>
</Properties>
<Appenders>
<Console name="ConsoleAppender" target="SYSTEM_OUT">
@ -20,9 +20,10 @@
</RollingFile>
</Appenders>
<Loggers>
<Root level="TRACE">
<AppenderRef ref="ConsoleAppender" level="INFO" />
<AppenderRef ref="eighttrack" level="INFO" />
</Root>
<Root level="ALL"/>
<Logger name="net.locusworks.logger" level="ALL">
<AppenderRef ref="eighttrack"/>
<AppenderRef ref="ConsoleAppender"/>
</Logger>
</Loggers>
</Configuration>