Compare commits
No commits in common. "master" and "3.0" have entirely different histories.
85
.gitignore
vendored
85
.gitignore
vendored
@ -1,10 +1,11 @@
|
||||
# Created by https://www.gitignore.io/api/maven,intellij+iml
|
||||
|
||||
# Created by https://www.gitignore.io/api/gradle,intellij,intellij+iml
|
||||
|
||||
### Intellij ###
|
||||
### Intellij+iml ###
|
||||
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm
|
||||
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
|
||||
|
||||
.idea
|
||||
|
||||
# User-specific stuff:
|
||||
.idea/**/workspace.xml
|
||||
.idea/**/tasks.xml
|
||||
@ -37,6 +38,9 @@ cmake-build-debug/
|
||||
# IntelliJ
|
||||
/out/
|
||||
|
||||
#dependencies
|
||||
/jars/
|
||||
|
||||
# mpeltonen/sbt-idea plugin
|
||||
.idea_modules/
|
||||
|
||||
@ -46,51 +50,15 @@ atlassian-ide-plugin.xml
|
||||
# Cursive Clojure plugin
|
||||
.idea/replstate.xml
|
||||
|
||||
# Ruby plugin and RubyMine
|
||||
/.rakeTasks
|
||||
|
||||
# Crashlytics plugin (for Android Studio and IntelliJ)
|
||||
com_crashlytics_export_strings.xml
|
||||
crashlytics.properties
|
||||
crashlytics-build.properties
|
||||
fabric.properties
|
||||
|
||||
### Intellij Patch ###
|
||||
# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721
|
||||
|
||||
# *.iml
|
||||
# modules.xml
|
||||
# .idea/misc.xml
|
||||
# *.ipr
|
||||
|
||||
# Sonarlint plugin
|
||||
.idea/sonarlint
|
||||
|
||||
### Intellij+iml ###
|
||||
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm
|
||||
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
|
||||
|
||||
# User-specific stuff:
|
||||
|
||||
# Sensitive or high-churn files:
|
||||
|
||||
# Gradle:
|
||||
|
||||
# CMake
|
||||
|
||||
# Mongo Explorer plugin:
|
||||
|
||||
## File-based project format:
|
||||
|
||||
## Plugin-specific files:
|
||||
|
||||
# IntelliJ
|
||||
|
||||
# mpeltonen/sbt-idea plugin
|
||||
|
||||
# JIRA plugin
|
||||
|
||||
# Cursive Clojure plugin
|
||||
|
||||
# Crashlytics plugin (for Android Studio and IntelliJ)
|
||||
|
||||
### Intellij+iml Patch ###
|
||||
# Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-249601023
|
||||
|
||||
@ -99,25 +67,18 @@ modules.xml
|
||||
.idea/misc.xml
|
||||
*.ipr
|
||||
|
||||
### Gradle ###
|
||||
.gradle
|
||||
/build/
|
||||
### Maven ###
|
||||
target/
|
||||
pom.xml.tag
|
||||
pom.xml.releaseBackup
|
||||
pom.xml.versionsBackup
|
||||
pom.xml.next
|
||||
release.properties
|
||||
dependency-reduced-pom.xml
|
||||
buildNumber.properties
|
||||
.mvn/timing.properties
|
||||
|
||||
# Ignore Gradle GUI config
|
||||
gradle-app.setting
|
||||
# Avoid ignoring Maven wrapper jar file (.jar files are usually ignored)
|
||||
!/.mvn/wrapper/maven-wrapper.jar
|
||||
|
||||
# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored)
|
||||
!gradle-wrapper.jar
|
||||
|
||||
# Cache of project
|
||||
.gradletasknamecache
|
||||
|
||||
# # Work around https://youtrack.jetbrains.com/issue/IDEA-116898
|
||||
# gradle/wrapper/gradle-wrapper.properties
|
||||
|
||||
# End of https://www.gitignore.io/api/gradle,intellij,intellij+iml
|
||||
.idea/compiler.xml
|
||||
.idea/inspectionProfiles/Project_Default.xml
|
||||
.idea/vcs.xml
|
||||
build.gradle
|
||||
build.gradle
|
||||
# End of https://www.gitignore.io/api/maven,intellij+iml
|
18
.idea/compiler.xml
Normal file
18
.idea/compiler.xml
Normal file
@ -0,0 +1,18 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="CompilerConfiguration">
|
||||
<annotationProcessing>
|
||||
<profile name="Maven default annotation processors profile" enabled="true">
|
||||
<sourceOutputDir name="target/generated-sources/annotations" />
|
||||
<sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
|
||||
<outputRelativeToContentRoot value="true" />
|
||||
<module name="Bot" />
|
||||
<module name="Rixa" />
|
||||
</profile>
|
||||
</annotationProcessing>
|
||||
<bytecodeTargetLevel>
|
||||
<module name="Bot" target="1.8" />
|
||||
<module name="Rixa" target="1.8" />
|
||||
</bytecodeTargetLevel>
|
||||
</component>
|
||||
</project>
|
6
.idea/vcs.xml
Normal file
6
.idea/vcs.xml
Normal file
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
||||
</component>
|
||||
</project>
|
@ -1,6 +1,2 @@
|
||||
# Rixa
|
||||
Rixa Discord Bot created by [@Savvy](https://github.com/Savvy) and others!
|
||||
|
||||
To invite Rixa to your Discord use the following [link](http://rixa.io/add)
|
||||
|
||||
Want to join our discord for more information? [invite](https://rixa.io/invite)
|
||||
Rixa Discord Bot
|
||||
|
@ -1 +0,0 @@
|
||||
theme: jekyll-theme-cayman
|
41
build.gradle
41
build.gradle
@ -1,41 +0,0 @@
|
||||
plugins {
|
||||
id 'java'
|
||||
id 'application'
|
||||
id 'com.github.johnrengelman.shadow' version '1.2.4'
|
||||
}
|
||||
|
||||
mainClassName = 'me.savvy.rixa.Rixa'
|
||||
version '2.4'
|
||||
|
||||
jar {
|
||||
baseName = project.name
|
||||
manifest {
|
||||
attributes 'Implementation-Version': version
|
||||
attributes 'Main-Class': mainClassName
|
||||
}
|
||||
}
|
||||
|
||||
sourceCompatibility = 1.8
|
||||
|
||||
repositories {
|
||||
mavenLocal()
|
||||
maven { url "https://oss.sonatype.org/content/repositories/snapshots" }
|
||||
jcenter()
|
||||
}
|
||||
|
||||
dependencies {
|
||||
compile 'net.dv8tion:JDA:3.3.1_284'
|
||||
compile 'mysql:mysql-connector-java:5.1.38'
|
||||
compile 'com.sedmelluq:lavaplayer:1.2.43'
|
||||
compile 'org.twitter4j:twitter4j-core:4.0.3'
|
||||
compile 'org.twitter4j:twitter4j-stream:4.0.6'
|
||||
compile 'org.projectlombok:lombok:1.16.18'
|
||||
compile 'ca.pjer:chatter-bot-api:1.4.7'
|
||||
compile group: 'com.zaxxer', name: 'HikariCP-java6', version: '2.0.1'
|
||||
}
|
||||
|
||||
compileJava.options.encoding = 'UTF-8'
|
||||
compileJava.options.fork = true
|
||||
|
||||
// Change this if you are getting errors building
|
||||
compileJava.options.forkOptions.executable = 'C:\\Program Files\\Java\\jdk1.8.0_144\\bin\\javac.exe'
|
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
Binary file not shown.
6
gradle/wrapper/gradle-wrapper.properties
vendored
6
gradle/wrapper/gradle-wrapper.properties
vendored
@ -1,6 +0,0 @@
|
||||
#Mon May 22 15:06:51 EDT 2017
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-2.13-all.zip
|
164
gradlew
vendored
164
gradlew
vendored
@ -1,164 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
##############################################################################
|
||||
##
|
||||
## Gradle start up script for UN*X
|
||||
##
|
||||
##############################################################################
|
||||
|
||||
# Attempt to set APP_HOME
|
||||
# Resolve links: $0 may be a link
|
||||
PRG="$0"
|
||||
# Need this for relative symlinks.
|
||||
while [ -h "$PRG" ] ; do
|
||||
ls=`ls -ld "$PRG"`
|
||||
link=`expr "$ls" : '.*-> \(.*\)$'`
|
||||
if expr "$link" : '/.*' > /dev/null; then
|
||||
PRG="$link"
|
||||
else
|
||||
PRG=`dirname "$PRG"`"/$link"
|
||||
fi
|
||||
done
|
||||
SAVED="`pwd`"
|
||||
cd "`dirname \"$PRG\"`/" >/dev/null
|
||||
APP_HOME="`pwd -P`"
|
||||
cd "$SAVED" >/dev/null
|
||||
|
||||
APP_NAME="Gradle"
|
||||
APP_BASE_NAME=`basename "$0"`
|
||||
|
||||
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||
DEFAULT_JVM_OPTS=""
|
||||
|
||||
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
||||
MAX_FD="maximum"
|
||||
|
||||
warn ( ) {
|
||||
echo "$*"
|
||||
}
|
||||
|
||||
die ( ) {
|
||||
echo
|
||||
echo "$*"
|
||||
echo
|
||||
exit 1
|
||||
}
|
||||
|
||||
# OS specific support (must be 'true' or 'false').
|
||||
cygwin=false
|
||||
msys=false
|
||||
darwin=false
|
||||
nonstop=false
|
||||
case "`uname`" in
|
||||
CYGWIN* )
|
||||
cygwin=true
|
||||
;;
|
||||
Darwin* )
|
||||
darwin=true
|
||||
;;
|
||||
MINGW* )
|
||||
msys=true
|
||||
;;
|
||||
NONSTOP* )
|
||||
nonstop=true
|
||||
;;
|
||||
esac
|
||||
|
||||
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
|
||||
|
||||
# Determine the Java command to use to start the JVM.
|
||||
if [ -n "$JAVA_HOME" ] ; then
|
||||
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
|
||||
# IBM's JDK on AIX uses strange locations for the executables
|
||||
JAVACMD="$JAVA_HOME/jre/sh/java"
|
||||
else
|
||||
JAVACMD="$JAVA_HOME/bin/java"
|
||||
fi
|
||||
if [ ! -x "$JAVACMD" ] ; then
|
||||
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
|
||||
|
||||
Please set the JAVA_HOME variable in your environment to match the
|
||||
location of your Java installation."
|
||||
fi
|
||||
else
|
||||
JAVACMD="java"
|
||||
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||
|
||||
Please set the JAVA_HOME variable in your environment to match the
|
||||
location of your Java installation."
|
||||
fi
|
||||
|
||||
# Increase the maximum file descriptors if we can.
|
||||
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
|
||||
MAX_FD_LIMIT=`ulimit -H -n`
|
||||
if [ $? -eq 0 ] ; then
|
||||
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
|
||||
MAX_FD="$MAX_FD_LIMIT"
|
||||
fi
|
||||
ulimit -n $MAX_FD
|
||||
if [ $? -ne 0 ] ; then
|
||||
warn "Could not set maximum file descriptor limit: $MAX_FD"
|
||||
fi
|
||||
else
|
||||
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
|
||||
fi
|
||||
fi
|
||||
|
||||
# For Darwin, add options to specify how the application appears in the dock
|
||||
if $darwin; then
|
||||
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
|
||||
fi
|
||||
|
||||
# For Cygwin, switch paths to Windows format before running java
|
||||
if $cygwin ; then
|
||||
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
|
||||
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
|
||||
JAVACMD=`cygpath --unix "$JAVACMD"`
|
||||
|
||||
# We build the pattern for arguments to be converted via cygpath
|
||||
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
|
||||
SEP=""
|
||||
for dir in $ROOTDIRSRAW ; do
|
||||
ROOTDIRS="$ROOTDIRS$SEP$dir"
|
||||
SEP="|"
|
||||
done
|
||||
OURCYGPATTERN="(^($ROOTDIRS))"
|
||||
# Add a user-defined pattern to the cygpath arguments
|
||||
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
|
||||
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
|
||||
fi
|
||||
# Now convert the arguments - kludge to limit ourselves to /bin/sh
|
||||
i=0
|
||||
for arg in "$@" ; do
|
||||
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
|
||||
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
|
||||
|
||||
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
|
||||
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
|
||||
else
|
||||
eval `echo args$i`="\"$arg\""
|
||||
fi
|
||||
i=$((i+1))
|
||||
done
|
||||
case $i in
|
||||
(0) set -- ;;
|
||||
(1) set -- "$args0" ;;
|
||||
(2) set -- "$args0" "$args1" ;;
|
||||
(3) set -- "$args0" "$args1" "$args2" ;;
|
||||
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
|
||||
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
|
||||
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
|
||||
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
|
||||
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
|
||||
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
|
||||
esac
|
||||
fi
|
||||
|
||||
# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
|
||||
function splitJvmOpts() {
|
||||
JVM_OPTS=("$@")
|
||||
}
|
||||
eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
|
||||
JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
|
||||
|
||||
exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
|
90
gradlew.bat
vendored
90
gradlew.bat
vendored
@ -1,90 +0,0 @@
|
||||
@if "%DEBUG%" == "" @echo off
|
||||
@rem ##########################################################################
|
||||
@rem
|
||||
@rem Gradle startup script for Windows
|
||||
@rem
|
||||
@rem ##########################################################################
|
||||
|
||||
@rem Set local scope for the variables with windows NT shell
|
||||
if "%OS%"=="Windows_NT" setlocal
|
||||
|
||||
set DIRNAME=%~dp0
|
||||
if "%DIRNAME%" == "" set DIRNAME=.
|
||||
set APP_BASE_NAME=%~n0
|
||||
set APP_HOME=%DIRNAME%
|
||||
|
||||
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||
set DEFAULT_JVM_OPTS=
|
||||
|
||||
@rem Find java.exe
|
||||
if defined JAVA_HOME goto findJavaFromJavaHome
|
||||
|
||||
set JAVA_EXE=java.exe
|
||||
%JAVA_EXE% -version >NUL 2>&1
|
||||
if "%ERRORLEVEL%" == "0" goto init
|
||||
|
||||
echo.
|
||||
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||
echo.
|
||||
echo Please set the JAVA_HOME variable in your environment to match the
|
||||
echo location of your Java installation.
|
||||
|
||||
goto fail
|
||||
|
||||
:findJavaFromJavaHome
|
||||
set JAVA_HOME=%JAVA_HOME:"=%
|
||||
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
|
||||
|
||||
if exist "%JAVA_EXE%" goto init
|
||||
|
||||
echo.
|
||||
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
|
||||
echo.
|
||||
echo Please set the JAVA_HOME variable in your environment to match the
|
||||
echo location of your Java installation.
|
||||
|
||||
goto fail
|
||||
|
||||
:init
|
||||
@rem Get command-line arguments, handling Windows variants
|
||||
|
||||
if not "%OS%" == "Windows_NT" goto win9xME_args
|
||||
if "%@eval[2+2]" == "4" goto 4NT_args
|
||||
|
||||
:win9xME_args
|
||||
@rem Slurp the command line arguments.
|
||||
set CMD_LINE_ARGS=
|
||||
set _SKIP=2
|
||||
|
||||
:win9xME_args_slurp
|
||||
if "x%~1" == "x" goto execute
|
||||
|
||||
set CMD_LINE_ARGS=%*
|
||||
goto execute
|
||||
|
||||
:4NT_args
|
||||
@rem Get arguments from the 4NT Shell from JP Software
|
||||
set CMD_LINE_ARGS=%$
|
||||
|
||||
:execute
|
||||
@rem Setup the command line
|
||||
|
||||
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
|
||||
|
||||
@rem Execute Gradle
|
||||
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
|
||||
|
||||
:end
|
||||
@rem End local scope for the variables with windows NT shell
|
||||
if "%ERRORLEVEL%"=="0" goto mainEnd
|
||||
|
||||
:fail
|
||||
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
|
||||
rem the _cmd.exe /c_ return code!
|
||||
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
|
||||
exit /b 1
|
||||
|
||||
:mainEnd
|
||||
if "%OS%"=="Windows_NT" endlocal
|
||||
|
||||
:omega
|
131
pom.xml
Normal file
131
pom.xml
Normal file
@ -0,0 +1,131 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<groupId>io.rixa</groupId>
|
||||
<artifactId>Rixa</artifactId>
|
||||
<version>3.0-SNAPSHOT</version>
|
||||
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>jcenter</id>
|
||||
<name>jcenter-bintray</name>
|
||||
<url>http://jcenter.bintray.com</url>
|
||||
</repository>
|
||||
<repository>
|
||||
<id>onarandombox</id>
|
||||
<url>http://repo.onarandombox.com/content/groups/public/</url>
|
||||
</repository>
|
||||
</repositories>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>net.dv8tion</groupId>
|
||||
<artifactId>JDA</artifactId>
|
||||
<version>LATEST</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.fasterxml.jackson.dataformat</groupId>
|
||||
<artifactId>jackson-dataformat-yaml</artifactId>
|
||||
<version>LATEST</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.fasterxml.jackson.core</groupId>
|
||||
<artifactId>jackson-databind</artifactId>
|
||||
<version>LATEST</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.sedmelluq</groupId>
|
||||
<artifactId>lavaplayer</artifactId>
|
||||
<version>LATEST</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>mysql</groupId>
|
||||
<artifactId>mysql-connector-java</artifactId>
|
||||
<version>5.1.38</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.commons</groupId>
|
||||
<artifactId>commons-lang3</artifactId>
|
||||
<version>3.4</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
<version>1.16.18</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework</groupId>
|
||||
<artifactId>spring-jdbc</artifactId>
|
||||
<version>4.3.9.RELEASE</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>ca.pjer</groupId>
|
||||
<artifactId>chatter-bot-api</artifactId>
|
||||
<version>1.4.7</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.dumptruckman</groupId>
|
||||
<artifactId>taskmin</artifactId>
|
||||
<version>0.1.0</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<finalName>${project.name}-Build-${project.version}-SNAPSHOT</finalName>
|
||||
<resources>
|
||||
<resource>
|
||||
<directory>src/main/resources</directory>
|
||||
<filtering>true</filtering>
|
||||
</resource>
|
||||
</resources>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<version>3.5.1</version>
|
||||
<configuration>
|
||||
<source>1.8</source>
|
||||
<target>1.8</target>
|
||||
<encoding>UTF-8</encoding>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-shade-plugin</artifactId>
|
||||
<version>3.0.0</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<phase>package</phase>
|
||||
<goals>
|
||||
<goal>shade</goal>
|
||||
</goals>
|
||||
|
||||
</execution>
|
||||
</executions>
|
||||
<configuration>
|
||||
<createDependencyReducedPom>false</createDependencyReducedPom>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-jar-plugin</artifactId>
|
||||
<version>3.0.2</version>
|
||||
<configuration>
|
||||
<archive>
|
||||
<manifest>
|
||||
<mainClass>io.rixa.Main</mainClass>
|
||||
</manifest>
|
||||
</archive>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</project>
|
10
src/main/java/io/rixa/Main.java
Normal file
10
src/main/java/io/rixa/Main.java
Normal file
@ -0,0 +1,10 @@
|
||||
package io.rixa;
|
||||
|
||||
import io.rixa.bot.Rixa;
|
||||
|
||||
public class Main {
|
||||
|
||||
public static void main(String[] args) {
|
||||
Rixa.getInstance();
|
||||
}
|
||||
}
|
225
src/main/java/io/rixa/bot/Rixa.java
Normal file
225
src/main/java/io/rixa/bot/Rixa.java
Normal file
@ -0,0 +1,225 @@
|
||||
package io.rixa.bot;
|
||||
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
|
||||
import io.rixa.bot.commands.cmds.admin.ConfigCommand;
|
||||
import io.rixa.bot.commands.cmds.admin.PMCommand;
|
||||
import io.rixa.bot.commands.cmds.general.AdviceCommand;
|
||||
import io.rixa.bot.commands.cmds.general.FeaturesCommand;
|
||||
import io.rixa.bot.commands.cmds.general.HelpCommand;
|
||||
import io.rixa.bot.commands.cmds.general.InfoCommand;
|
||||
import io.rixa.bot.commands.cmds.general.LeaderboardsCommand;
|
||||
import io.rixa.bot.commands.cmds.general.MinecraftCommand;
|
||||
import io.rixa.bot.commands.cmds.general.ModulesCommand;
|
||||
import io.rixa.bot.commands.cmds.general.MusicCommand;
|
||||
import io.rixa.bot.commands.cmds.general.PingCommand;
|
||||
import io.rixa.bot.commands.cmds.general.QuoteCommand;
|
||||
import io.rixa.bot.commands.cmds.general.RankCommand;
|
||||
import io.rixa.bot.commands.cmds.general.RoleMemberList;
|
||||
import io.rixa.bot.commands.cmds.general.ServerInfoCommand;
|
||||
import io.rixa.bot.commands.cmds.general.UrbanDictionaryCommand;
|
||||
import io.rixa.bot.commands.cmds.general.YoutubeCommand;
|
||||
import io.rixa.bot.commands.cmds.moderator.BanCommand;
|
||||
import io.rixa.bot.commands.cmds.moderator.ClearCommand;
|
||||
import io.rixa.bot.commands.cmds.moderator.MuteCommand;
|
||||
import io.rixa.bot.commands.cmds.other.ShutdownCommand;
|
||||
import io.rixa.bot.commands.handler.CommandHandler;
|
||||
import io.rixa.bot.commands.handler.CommandType;
|
||||
import io.rixa.bot.commands.perms.RixaPermission;
|
||||
import io.rixa.bot.data.config.Configuration;
|
||||
import io.rixa.bot.data.storage.DatabaseAdapter;
|
||||
import io.rixa.bot.data.storage.enums.DatabaseTables;
|
||||
import io.rixa.bot.events.BotJoinListener;
|
||||
import io.rixa.bot.events.MessageListener;
|
||||
import io.rixa.bot.events.ReadyListener;
|
||||
import io.rixa.bot.events.UserListener;
|
||||
import io.rixa.bot.guild.RixaGuild;
|
||||
import io.rixa.bot.guild.manager.GuildManager;
|
||||
import io.rixa.bot.reactions.ReactManager;
|
||||
import io.rixa.bot.reactions.react.HelpReaction;
|
||||
import io.rixa.bot.user.RixaUser;
|
||||
import io.rixa.bot.user.manager.UserManager;
|
||||
import io.rixa.bot.utils.FileUtils;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.logging.Logger;
|
||||
import javax.security.auth.login.LoginException;
|
||||
import lombok.Getter;
|
||||
import net.dv8tion.jda.core.AccountType;
|
||||
import net.dv8tion.jda.core.JDA;
|
||||
import net.dv8tion.jda.core.JDABuilder;
|
||||
import net.dv8tion.jda.core.OnlineStatus;
|
||||
import net.dv8tion.jda.core.entities.Game;
|
||||
import net.dv8tion.jda.core.entities.Game.GameType;
|
||||
import net.dv8tion.jda.core.entities.Guild;
|
||||
import net.dv8tion.jda.core.hooks.AnnotatedEventManager;
|
||||
|
||||
public class Rixa {
|
||||
|
||||
private static Rixa instance;
|
||||
private static long timeUp;
|
||||
@Getter
|
||||
private CommandHandler commandHandler;
|
||||
@Getter
|
||||
private ReactManager reactManager;
|
||||
@Getter
|
||||
private Configuration configuration;
|
||||
@Getter
|
||||
private ObjectMapper objectMapper;
|
||||
@Getter
|
||||
private List<JDA> shardList;
|
||||
@Getter
|
||||
private File defaultPath;
|
||||
@Getter
|
||||
private Logger logger;
|
||||
|
||||
private Rixa() {
|
||||
instance = this;
|
||||
this.logger = Logger.getLogger(Rixa.class.getCanonicalName());
|
||||
this.objectMapper = new ObjectMapper(new YAMLFactory());
|
||||
this.defaultPath = new File("Rixa/");
|
||||
this.commandHandler = new CommandHandler();
|
||||
this.reactManager = new ReactManager();
|
||||
this.shardList = new ArrayList<>();
|
||||
this.defaultPath.mkdirs();
|
||||
this.loadConfiguration();
|
||||
this.registerCommands();
|
||||
this.registerReactions();
|
||||
this.loadJDA();
|
||||
}
|
||||
|
||||
public static Rixa getInstance() {
|
||||
return (instance == null) ? new Rixa() : instance;
|
||||
}
|
||||
|
||||
public long getTimeUp() {
|
||||
return timeUp;
|
||||
}
|
||||
|
||||
private void loadJDA() {
|
||||
JDABuilder jda = new JDABuilder(AccountType.BOT)
|
||||
.setToken(configuration.getToken())
|
||||
.setGame(Game.of(GameType.WATCHING, configuration.getBotGame()))
|
||||
.setEventManager(new AnnotatedEventManager())
|
||||
.addEventListener(new ReadyListener(), new BotJoinListener(), new MessageListener(),
|
||||
new UserListener())
|
||||
.setAutoReconnect(true)
|
||||
.setAudioEnabled(true)
|
||||
.setEnableShutdownHook(false)
|
||||
.setStatus(OnlineStatus.ONLINE);
|
||||
for (int i = 0; i < configuration.getShards(); i++) {
|
||||
try {
|
||||
getLogger().info("Loading Shard #" + (i + 1) + "!");
|
||||
getShardList().add(jda.useSharding(i, configuration.getShards()).buildBlocking());
|
||||
getLogger().info("Shard #" + (i + 1) + " has been loaded");
|
||||
Thread.sleep(5000);
|
||||
} catch (InterruptedException | LoginException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
Runtime.getRuntime().addShutdownHook(new Thread(() ->
|
||||
getShardList().forEach(jdaInstance -> {
|
||||
UserManager.getInstance().getUserMap().values().forEach(RixaUser::save);
|
||||
jdaInstance.getGuilds().forEach((Guild guild) -> {
|
||||
System.out.println("Saving " + guild.getName() + ": " + guild.getId());
|
||||
RixaGuild rixaGuild = GuildManager.getInstance().getGuild(guild);
|
||||
rixaGuild.save();
|
||||
});
|
||||
jdaInstance.shutdown();
|
||||
})));
|
||||
timeUp = System.currentTimeMillis();
|
||||
}
|
||||
|
||||
private void registerReactions() {
|
||||
this.reactManager.registerReact(new HelpReaction("Help"));
|
||||
}
|
||||
|
||||
private void registerCommands() {
|
||||
this.commandHandler.registerCommands(
|
||||
new AdviceCommand("advice", RixaPermission.NONE, "Receive advice from the great beyond...",
|
||||
CommandType.USER),
|
||||
new FeaturesCommand("features", RixaPermission.NONE, "List Rixa's official features!",
|
||||
CommandType.USER),
|
||||
new HelpCommand("help", RixaPermission.NONE, "Review commands and its usages!",
|
||||
CommandType.USER),
|
||||
new InfoCommand("info", RixaPermission.NONE, "Review information about a user or Rixa!",
|
||||
CommandType.USER),
|
||||
new MinecraftCommand("minecraft", RixaPermission.NONE, "See minecraft server info",
|
||||
CommandType.USER, Collections.singletonList("mc")),
|
||||
new ModulesCommand("modules", RixaPermission.NONE,
|
||||
"List both enabled & disabled features of Rixa for this server!", CommandType.USER),
|
||||
new MusicCommand("music", RixaPermission.NONE, "Listen to music right from discord!",
|
||||
CommandType.USER),
|
||||
new PingCommand("ping", RixaPermission.NONE, "Check Rixa's ping!", CommandType.USER),
|
||||
new ServerInfoCommand("serverinfo", RixaPermission.NONE,
|
||||
"Review information about the server!", CommandType.USER),
|
||||
new QuoteCommand("quote", RixaPermission.NONE,
|
||||
"Receive a quote from some of the greatest authors!", CommandType.USER),
|
||||
new RankCommand("rank", RixaPermission.NONE, "Check your rank!", CommandType.USER),
|
||||
new LeaderboardsCommand("leaderboards", RixaPermission.NONE,
|
||||
"Look at the levels leaderboards!", CommandType.USER),
|
||||
new YoutubeCommand("youtube", RixaPermission.NONE, "Search for music on youtube!",
|
||||
CommandType.USER),
|
||||
new UrbanDictionaryCommand("ud", RixaPermission.NONE, "Look up urban definitions!",
|
||||
CommandType.USER),
|
||||
|
||||
new BanCommand("ban", RixaPermission.BAN_MEMBER, "Ban a player from your server.",
|
||||
CommandType.STAFF),
|
||||
new ClearCommand("clear", RixaPermission.CLEAR_CHAT, "Clear Chat!", CommandType.STAFF,
|
||||
Arrays.asList("deleemessages", "cmessages")),
|
||||
new ConfigCommand("config", RixaPermission.ACCESS_CONFIG, "Access the config menu",
|
||||
CommandType.STAFF),
|
||||
new MuteCommand("mute", RixaPermission.MUTE, "Mute those pesky children!",
|
||||
CommandType.STAFF),
|
||||
new PMCommand("pm", RixaPermission.PM_MESSAGE,
|
||||
"Private Message all users with a specific role!", CommandType.STAFF),
|
||||
new RoleMemberList("listmembers", RixaPermission.NONE,
|
||||
"List all users with a specific role!", CommandType.STAFF),
|
||||
new ShutdownCommand("shutdown", RixaPermission.NONE, "Shutdown Rixa!", CommandType.OWNER));
|
||||
}
|
||||
|
||||
private void loadConfiguration() {
|
||||
try {
|
||||
if (FileUtils.saveResource("config.yml", false)) {
|
||||
logger.info("Shutting down Rixa. Please edit configuration");
|
||||
System.exit(0);
|
||||
}
|
||||
File file = new File(defaultPath.getPath() + "/config.yml");
|
||||
configuration = objectMapper.readValue(file, Configuration.class);
|
||||
logger.info("Configuration successfully loaded.");
|
||||
DatabaseAdapter.getInstance().check();
|
||||
Arrays.stream(DatabaseTables.values()).forEach(databaseTables -> {
|
||||
System.out
|
||||
.println("Checking database table (creating if needed): " + databaseTables.toString());
|
||||
DatabaseAdapter.getInstance().get().update(databaseTables.getQuery());
|
||||
System.out.println("Done checking " + databaseTables.toString());
|
||||
});
|
||||
} catch (IOException e) {
|
||||
logger.severe("Could not properly load configuration file!.");
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public Guild getGuildById(String id) {
|
||||
Guild guild = null;
|
||||
for (JDA jda : Rixa.getInstance().getShardList()) {
|
||||
if (jda.getGuilds().size() == 0 || jda.getGuildById(id) == null) {
|
||||
continue;
|
||||
}
|
||||
guild = jda.getGuildById(id);
|
||||
break;
|
||||
}
|
||||
if (guild != null) {
|
||||
return guild;
|
||||
}
|
||||
throw new NullPointerException("Guild not found.");
|
||||
}
|
||||
|
||||
public void close() {
|
||||
shardList.forEach(JDA::shutdown);
|
||||
}
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
package me.savvy.rixa.utils;
|
||||
package io.rixa.bot.apis;
|
||||
|
||||
import lombok.Getter;
|
||||
import org.json.JSONArray;
|
||||
@ -10,9 +10,6 @@ import java.io.InputStream;
|
||||
import java.net.URL;
|
||||
import java.util.Scanner;
|
||||
|
||||
/**
|
||||
* Created by savit on 6/24/2017.
|
||||
*/
|
||||
public class UrbanDictionary {
|
||||
|
||||
@Getter
|
||||
@ -34,6 +31,7 @@ public class UrbanDictionary {
|
||||
jsonString += scan.next() + " ";
|
||||
}
|
||||
scan.close();
|
||||
in.close();
|
||||
try {
|
||||
JSONObject obj = new JSONObject(jsonString.trim());
|
||||
JSONArray array = obj.getJSONArray("list");
|
@ -1,5 +1,6 @@
|
||||
package me.savvy.rixa.utils;
|
||||
package io.rixa.bot.apis;
|
||||
|
||||
import io.rixa.bot.utils.WebUtil;
|
||||
import org.json.JSONArray;
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
@ -8,9 +9,6 @@ import java.io.IOException;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.net.URLEncoder;
|
||||
|
||||
/**
|
||||
* Created by savit on 7/11/2017.
|
||||
*/
|
||||
public class YoutubeSearch {
|
||||
|
||||
private static final String API_KEY;
|
||||
@ -24,12 +22,10 @@ public class YoutubeSearch {
|
||||
try {
|
||||
String url = "https://www.googleapis.com/youtube/v3/search?"
|
||||
+ "q=" + URLEncoder.encode(query, "UTF-8")
|
||||
+ "&part=id%2Csnippet"
|
||||
+ "&safeSearch=none"
|
||||
+ "&key=" + API_KEY;
|
||||
+ "&part=id%2Csnippet&safeSearch=none&key=" + API_KEY;
|
||||
search(url);
|
||||
} catch (UnsupportedEncodingException ignored) {
|
||||
}
|
||||
catch (UnsupportedEncodingException ignored) {}
|
||||
}
|
||||
|
||||
|
||||
@ -41,10 +37,17 @@ public class YoutubeSearch {
|
||||
return items.getJSONObject(index).getJSONObject("id").getString("kind");
|
||||
}
|
||||
|
||||
public String getVideoId(int index) {
|
||||
public String getVideoId(int index) throws JSONException {
|
||||
if (!hasVideoId(index)) {
|
||||
index++;
|
||||
}
|
||||
return items.getJSONObject(index).getJSONObject("id").getString("videoId");
|
||||
}
|
||||
|
||||
public boolean hasVideoId(int index) {
|
||||
return items.getJSONObject(index).getJSONObject("id").has("videoId");
|
||||
}
|
||||
|
||||
public String getPublishedTime(int index) {
|
||||
return items.getJSONObject(index).getJSONObject("snippet").getString("publishedAt");
|
||||
}
|
||||
@ -92,8 +95,7 @@ public class YoutubeSearch {
|
||||
JSONObject obj = new JSONObject(json);
|
||||
try {
|
||||
items = obj.getJSONArray("items");
|
||||
}
|
||||
catch (JSONException e) {
|
||||
} catch (JSONException e) {
|
||||
System.out.println("No search results found.");// throw new NotFoundException("No results found.");
|
||||
}
|
||||
}
|
51
src/main/java/io/rixa/bot/commands/Command.java
Normal file
51
src/main/java/io/rixa/bot/commands/Command.java
Normal file
@ -0,0 +1,51 @@
|
||||
package io.rixa.bot.commands;
|
||||
|
||||
import io.rixa.bot.commands.handler.CommandType;
|
||||
import io.rixa.bot.commands.perms.RixaPermission;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import net.dv8tion.jda.core.entities.Guild;
|
||||
import net.dv8tion.jda.core.entities.Member;
|
||||
import net.dv8tion.jda.core.entities.TextChannel;
|
||||
|
||||
public abstract class Command {
|
||||
|
||||
@Getter @Setter private String command, description;
|
||||
@Getter @Setter private RixaPermission permission;
|
||||
@Getter @Setter private List<String> aliases;
|
||||
@Getter @Setter private CommandType commandType;
|
||||
|
||||
public Command(String command) {
|
||||
this(command, RixaPermission.NONE, "Undefined", CommandType.USER, Collections.emptyList());
|
||||
}
|
||||
|
||||
public Command(String command, RixaPermission rixaPermission) {
|
||||
this(command, rixaPermission, "Undefined", CommandType.USER, Collections.emptyList());
|
||||
}
|
||||
|
||||
public Command(String command, RixaPermission rixaPermission, String description) {
|
||||
this(command, rixaPermission, description, CommandType.USER, Collections.emptyList());
|
||||
}
|
||||
|
||||
public Command(String command, RixaPermission rixaPermission, String description, CommandType commandType) {
|
||||
this(command, rixaPermission, description, commandType, Collections.emptyList());
|
||||
}
|
||||
|
||||
public Command(String command, RixaPermission rixaPermission, String description,
|
||||
CommandType commandType, List<String> aliases) {
|
||||
this.setCommand(command);
|
||||
this.setPermission(rixaPermission);
|
||||
this.setDescription(description);
|
||||
this.setAliases(aliases);
|
||||
this.setCommandType(commandType);
|
||||
}
|
||||
|
||||
// public abstract void execute(GuildMessageReceivedEvent event);
|
||||
|
||||
public abstract void execute(String commandLabel, Guild guild, Member member, TextChannel channel,
|
||||
String[] args) throws IOException;
|
||||
}
|
292
src/main/java/io/rixa/bot/commands/cmds/admin/ConfigCommand.java
Normal file
292
src/main/java/io/rixa/bot/commands/cmds/admin/ConfigCommand.java
Normal file
@ -0,0 +1,292 @@
|
||||
package io.rixa.bot.commands.cmds.admin;
|
||||
|
||||
import io.rixa.bot.commands.Command;
|
||||
import io.rixa.bot.commands.handler.CommandType;
|
||||
import io.rixa.bot.commands.perms.RixaPermission;
|
||||
import io.rixa.bot.guild.RixaGuild;
|
||||
import io.rixa.bot.guild.manager.GuildManager;
|
||||
import io.rixa.bot.guild.modules.module.MusicModule;
|
||||
import io.rixa.bot.pagination.Pagination;
|
||||
import io.rixa.bot.user.RixaUser;
|
||||
import io.rixa.bot.user.manager.UserManager;
|
||||
import io.rixa.bot.utils.DiscordUtils;
|
||||
import io.rixa.bot.utils.MessageFactory;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import net.dv8tion.jda.core.entities.Guild;
|
||||
import net.dv8tion.jda.core.entities.Member;
|
||||
import net.dv8tion.jda.core.entities.Role;
|
||||
import net.dv8tion.jda.core.entities.TextChannel;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
public class ConfigCommand extends Command {
|
||||
|
||||
private Pagination pagination;
|
||||
|
||||
public ConfigCommand(String command, RixaPermission rixaPermission, String description, CommandType commandType) {
|
||||
super(command, rixaPermission, description, commandType);
|
||||
|
||||
pagination = new Pagination(Arrays.asList(
|
||||
"%pconfig set greetings ; Set channel where greeting messages are announced!",
|
||||
"%pconfig set farewell ; Set channel where farewell messages are announced!",
|
||||
"%pconfig set prefix <prefix> ; Set Rixa's command prefix!",
|
||||
"%pconfig set defaultRole <role> ; Set role to be assigned when a user joins the server!",
|
||||
"%pconfig set muteRole <role> ; Set role to be assigned when a user is muted!",
|
||||
"%pconfig set musicRole <musicRole> ; Set role required to use the music functions! (Not required)",
|
||||
|
||||
/* "%pconfig set twitterCKey <key> ; Set Twitter Consumer Key!",
|
||||
"%pconfig set twitterCSecret <key> ; Set Twitter Consumer Secret!",
|
||||
"%pconfig set twitterAToken <key> ; Set Twitter Access Key!",
|
||||
"%pconfig set twitterASecret <key> ; Set Twitter Access Secret!",
|
||||
"%config set twitterChannel ; Set the channel for Twitter feed updates!",*/
|
||||
|
||||
"%pconfig set joinMessage <joinMessage> ; Set the greetings message for when a user joins the server!",
|
||||
"%pconfig set quitMessage <quitMessage> ; Set the quit message for when a user leaves the server!",
|
||||
"%pconfig set joinPm <joinPm> ; Set the message to be private messaged when a user joins!",
|
||||
"%pconfig set description <description> ; Set your server description!",
|
||||
"%pconfig addPerm <role> <permission> ; Give a role permission to access a command!",
|
||||
"%pconfig removePerm <role> <permission> ; Remove a role's permission to access a command!",
|
||||
"%pconfig enable <module> ; Enabled a Rixa Module!",
|
||||
"%pconfig disable <module> ; Disable a Rixa Module!"
|
||||
), 6);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(String commandLabel, Guild guild, Member member, TextChannel channel,
|
||||
String[] args) {
|
||||
RixaGuild rixaGuild = GuildManager.getInstance().getGuild(guild);
|
||||
if (args.length == 2) {
|
||||
switch (args[0].toLowerCase()) {
|
||||
case "set":
|
||||
if (args[1].equalsIgnoreCase("greetings")) {
|
||||
rixaGuild.getSettings().setGreetings(channel);
|
||||
MessageFactory.create(channel.getAsMention()).setAuthor("Updated Greetings Channel",
|
||||
guild.getIconUrl()).setColor(member.getColor()).queue(channel);
|
||||
return;
|
||||
} else if (args[1].equalsIgnoreCase("farewell")) {
|
||||
rixaGuild.getSettings().setFarewell(channel);
|
||||
MessageFactory.create(channel.getAsMention()).setAuthor("Updated Farewell Channel",
|
||||
guild.getIconUrl()).setColor(member.getColor()).queue(channel);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (args.length < 2) {
|
||||
sendHelp(member, 1, rixaGuild.getSettings().getPrefix());
|
||||
return;
|
||||
}
|
||||
String string = join(args, 2, args.length);
|
||||
Role role;
|
||||
switch (args[0].toLowerCase()) {
|
||||
case "set":
|
||||
if (args[1].equalsIgnoreCase("muteRole") ||
|
||||
args[1].equalsIgnoreCase("musicRole") ||
|
||||
args[1].equalsIgnoreCase("defaultRole")) {
|
||||
role = DiscordUtils.searchFirstRole(guild, string);
|
||||
if (role == null) {
|
||||
MessageFactory.create("Sorry I could not find that role!")
|
||||
.setColor(member.getColor()).setTimestamp().queue(channel);
|
||||
// Role not found
|
||||
return;
|
||||
}
|
||||
switch (args[1].toLowerCase()) {
|
||||
case "muterole":
|
||||
rixaGuild.getSettings().setMuteRole(role);
|
||||
break;
|
||||
case "musicrole":
|
||||
((MusicModule) rixaGuild.getModule("Music")).setMusicRole(role);
|
||||
break;
|
||||
case "defaultrole":
|
||||
rixaGuild.getSettings().setDefaultRole(role);
|
||||
break;
|
||||
}
|
||||
// Role set
|
||||
MessageFactory.create(role.getAsMention()).setAuthor("Updated Role",
|
||||
guild.getIconUrl()).setColor(member.getColor()).queue(channel);
|
||||
} else if (args[1].equalsIgnoreCase("joinMessage")) {
|
||||
rixaGuild.getSettings().setJoinMessage(string);
|
||||
MessageFactory.create(string).setAuthor("Updated Join Message",
|
||||
guild.getIconUrl()).setColor(member.getColor()).queue(channel);
|
||||
} else if (args[1].equalsIgnoreCase("quitMessage")) {
|
||||
rixaGuild.getSettings().setQuitMessage(string);
|
||||
MessageFactory.create(string).setAuthor("Updated Quit Message",
|
||||
guild.getIconUrl()).setColor(member.getColor()).queue(channel);
|
||||
} else if (args[1].equalsIgnoreCase("joinPm")) {
|
||||
rixaGuild.getSettings().setJoinPrivateMessage(string);
|
||||
MessageFactory.create(string).setAuthor("Updated Join Private Message",
|
||||
guild.getIconUrl()).setColor(member.getColor()).queue(channel);
|
||||
} else if (args[1].equalsIgnoreCase("description")) {
|
||||
rixaGuild.setDescription(string);
|
||||
MessageFactory.create(string).setAuthor("Updated Guild Server Description",
|
||||
guild.getIconUrl()).setColor(member.getColor()).queue(channel);
|
||||
} else if (args[1].equalsIgnoreCase("prefix")) {
|
||||
rixaGuild.getSettings().setPrefix(string);
|
||||
MessageFactory.create(string).setAuthor("Updated Command Prefix",
|
||||
guild.getIconUrl()).setColor(member.getColor()).queue(channel);
|
||||
} else {
|
||||
sendHelp(member, 1, rixaGuild.getSettings().getPrefix());
|
||||
return;
|
||||
}
|
||||
break;
|
||||
case "enable":
|
||||
if (rixaGuild.isRegistered(args[1].toLowerCase())) {
|
||||
rixaGuild.getModule(args[1].toLowerCase()).setEnabled(true);
|
||||
MessageFactory.create(args[1].toLowerCase()).setAuthor("Module Enabled",
|
||||
guild.getIconUrl()).setColor(member.getColor()).queue(channel);
|
||||
} else if (args[1].equalsIgnoreCase("joinVerification")) {
|
||||
rixaGuild.getSettings().setJoinVerification(true);
|
||||
MessageFactory.create(args[1].toLowerCase()).setAuthor("Module Enabled",
|
||||
guild.getIconUrl()).setColor(member.getColor()).queue(channel);
|
||||
} else {
|
||||
MessageFactory.create(args[1].toLowerCase()).setAuthor("Module Not Found",
|
||||
guild.getIconUrl()).setColor(member.getColor()).queue(channel);
|
||||
}
|
||||
break;
|
||||
case "disable":
|
||||
if (rixaGuild.isRegistered(args[1])) {
|
||||
rixaGuild.getModule(args[1]).setEnabled(false);
|
||||
MessageFactory.create(args[1]).setAuthor("Module Disabled",
|
||||
guild.getIconUrl()).setColor(member.getColor()).queue(channel);
|
||||
} else if (args[1].equalsIgnoreCase("joinMessage")) {
|
||||
rixaGuild.getSettings().setJoinMessage("default_value");
|
||||
MessageFactory.create(args[1]).setAuthor("Module Disabled",
|
||||
guild.getIconUrl()).setColor(member.getColor()).queue(channel);
|
||||
} else if (args[1].equalsIgnoreCase("quitMessage")) {
|
||||
rixaGuild.getSettings().setQuitMessage("default_value");
|
||||
MessageFactory.create(args[1]).setAuthor("Module Disabled",
|
||||
guild.getIconUrl()).setColor(member.getColor()).queue(channel);
|
||||
} else if (args[1].equalsIgnoreCase("joinPrivateMessage")) {
|
||||
rixaGuild.getSettings().setJoinPrivateMessage("default");
|
||||
MessageFactory.create(args[1]).setAuthor("Module Disabled",
|
||||
guild.getIconUrl()).setColor(member.getColor()).queue(channel);
|
||||
} else if (args[1].equalsIgnoreCase("joinVerification")) {
|
||||
rixaGuild.getSettings().setJoinVerification(false);
|
||||
MessageFactory.create(args[1].toLowerCase()).setAuthor("Module Disabled",
|
||||
guild.getIconUrl()).setColor(member.getColor()).queue(channel);
|
||||
} else {
|
||||
MessageFactory.create(args[1].toLowerCase()).setAuthor("Module Not Found",
|
||||
guild.getIconUrl()).setColor(member.getColor()).queue(channel);
|
||||
}
|
||||
break;
|
||||
case "addperm":
|
||||
case "aperm":
|
||||
case "addpermission":
|
||||
case "addperms":
|
||||
case "addpermissions":
|
||||
RixaPermission permission = searchPerms(args);
|
||||
if (permission == null) {
|
||||
MessageFactory.create("That permission does not exist!").setColor(member.getColor())
|
||||
.queue(channel);
|
||||
return;
|
||||
}
|
||||
if (args[1].equalsIgnoreCase("role")) {
|
||||
role = DiscordUtils.searchFirstRole(guild, string);
|
||||
if (role == null) {
|
||||
MessageFactory.create("That role does not exist!").setColor(member.getColor())
|
||||
.queue(channel);
|
||||
return;
|
||||
}
|
||||
rixaGuild.addPermission(role.getId(), permission);
|
||||
MessageFactory.create("Role: " + role.getAsMention() + " | Permission: " +
|
||||
permission.toString()).setAuthor("Permission Given",
|
||||
guild.getIconUrl()).setColor(member.getColor()).queue(channel);
|
||||
return;
|
||||
}
|
||||
if (args[1].equalsIgnoreCase("user")) {
|
||||
List<Member> targets = DiscordUtils.memberSearch(guild, string, false);
|
||||
if (targets.isEmpty()) {
|
||||
MessageFactory.create("Could not find that user!").setColor(member.getColor())
|
||||
.queue(channel);
|
||||
return;
|
||||
}
|
||||
RixaUser targetUser = UserManager.getInstance().getUser(targets.get(0).getUser());
|
||||
targetUser.addPermission(guild.getId(), permission);
|
||||
MessageFactory.create("User: " + targetUser.getUser().getAsMention() + " | Permission: " +
|
||||
permission.toString()).setAuthor("Permission Given",
|
||||
guild.getIconUrl()).setColor(member.getColor()).queue(channel);
|
||||
return;
|
||||
}
|
||||
MessageFactory
|
||||
.create("Incorrect Usage! Try " + commandLabel + " addPerm <user/role> <permission>!")
|
||||
.setColor(member.getColor())
|
||||
.queue(channel);
|
||||
break;
|
||||
case "removeperm":
|
||||
case "rperm":
|
||||
case "removepermissions":
|
||||
case "removeperms":
|
||||
permission = searchPerms(args);
|
||||
if (permission == null) {
|
||||
MessageFactory.create("That permission does not exist!").setColor(member.getColor())
|
||||
.queue(channel);
|
||||
return;
|
||||
}
|
||||
if (args[1].equalsIgnoreCase("role")) {
|
||||
role = DiscordUtils.searchFirstRole(guild, string);
|
||||
if (role == null) {
|
||||
MessageFactory.create("That role does not exist!").setColor(member.getColor())
|
||||
.queue(channel);
|
||||
return;
|
||||
}
|
||||
rixaGuild.removePermission(role.getId(), permission);
|
||||
MessageFactory.create("Role: " + role.getAsMention() + " | Permission: " +
|
||||
permission.toString()).setAuthor("Permission Revoked",
|
||||
guild.getIconUrl()).setColor(member.getColor()).queue(channel);
|
||||
return;
|
||||
}
|
||||
if (args[1].equalsIgnoreCase("user")) {
|
||||
List<Member> targets = DiscordUtils.memberSearch(guild, string, false);
|
||||
if (targets.isEmpty()) {
|
||||
MessageFactory.create("Could not find that user!").setColor(member.getColor())
|
||||
.queue(channel);
|
||||
return;
|
||||
}
|
||||
RixaUser targetUser = UserManager.getInstance().getUser(targets.get(0).getUser());
|
||||
targetUser.removePermission(guild.getId(), permission);
|
||||
MessageFactory.create("Role: " + targetUser.getUser().getAsMention() + " | Permission: " +
|
||||
permission.toString()).setAuthor("Permission Revoked",
|
||||
guild.getIconUrl()).setColor(member.getColor()).queue(channel);
|
||||
return;
|
||||
}
|
||||
MessageFactory
|
||||
.create("Incorrect Usage! Try " + commandLabel + " addPerm <user/role> <permission>!")
|
||||
.setColor(member.getColor())
|
||||
.queue(channel);
|
||||
break;
|
||||
default:
|
||||
sendHelp(member, 1, rixaGuild.getSettings().getPrefix());
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private void sendHelp(Member member, int page, String prefix) {
|
||||
List<Object> objects = pagination.getPage(page);
|
||||
MessageFactory messageFactory = MessageFactory.create("\u2699" + " **Config**" +
|
||||
"\nClick the back or forward reactions to switch between pages.")
|
||||
.setTitle(String.format("Config: %s", member.getGuild().getId()));
|
||||
objects.forEach(obj -> {
|
||||
String object = obj.toString();
|
||||
messageFactory.addField(object.split(" ; ")[0].replace("%p", prefix),
|
||||
object.split(" ; ")[1], false);
|
||||
});
|
||||
messageFactory.footer("Page: (" + page + " / " + (pagination.getMaxPage()) + ")",
|
||||
member.getGuild().getIconUrl())
|
||||
.setColor(member.getColor()).selfDestruct(0).send(member.getUser(), success ->
|
||||
success.addReaction("\u2B05").queue(v -> success.addReaction("\u27A1").queue()));
|
||||
}
|
||||
|
||||
private RixaPermission searchPerms(String[] args) {
|
||||
for (String stringInArgs : args) {
|
||||
for (RixaPermission rixaPermission : RixaPermission.values()) {
|
||||
if (stringInArgs.equalsIgnoreCase(rixaPermission.toString())) {
|
||||
return rixaPermission;
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private String join(Object[] obj, int startIndex, int endIndex) {
|
||||
return StringUtils.join(obj, " ", startIndex, endIndex);
|
||||
}
|
||||
}
|
50
src/main/java/io/rixa/bot/commands/cmds/admin/PMCommand.java
Normal file
50
src/main/java/io/rixa/bot/commands/cmds/admin/PMCommand.java
Normal file
@ -0,0 +1,50 @@
|
||||
package io.rixa.bot.commands.cmds.admin;
|
||||
|
||||
import io.rixa.bot.commands.Command;
|
||||
import io.rixa.bot.commands.handler.CommandType;
|
||||
import io.rixa.bot.commands.perms.RixaPermission;
|
||||
import io.rixa.bot.utils.DiscordUtils;
|
||||
import io.rixa.bot.utils.MessageFactory;
|
||||
import lombok.Getter;
|
||||
import net.dv8tion.jda.core.entities.Guild;
|
||||
import net.dv8tion.jda.core.entities.Member;
|
||||
import net.dv8tion.jda.core.entities.Role;
|
||||
import net.dv8tion.jda.core.entities.TextChannel;
|
||||
import net.dv8tion.jda.core.exceptions.ErrorResponseException;
|
||||
import net.dv8tion.jda.core.requests.ErrorResponse;
|
||||
|
||||
public class PMCommand extends Command {
|
||||
|
||||
public PMCommand(String command, RixaPermission rixaPermission, String description, CommandType commandType) {
|
||||
super(command, rixaPermission, description, commandType);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(String commandLabel, Guild guild, Member member, TextChannel channel, String[] args) {
|
||||
String msg = String.join(" ", args);
|
||||
Role role = DiscordUtils.getMentionedRole(guild, msg);
|
||||
if (role == null) {
|
||||
MessageFactory.create(String.format
|
||||
("You must mention a role to private message! Example: `%s @role this is a test private message!`",
|
||||
commandLabel)).queue(channel);
|
||||
return;
|
||||
}
|
||||
msg = msg.replaceFirst(role.getAsMention(), "").replaceFirst("@" + role.getName(),"");
|
||||
int sendingSuccess = 0;
|
||||
int sendingFailed = 0;
|
||||
String finalMsg = msg;
|
||||
for (Member memberWithRole : guild.getMembersWithRoles(role)) {
|
||||
try {
|
||||
memberWithRole.getUser().openPrivateChannel().queue(privateChannel -> privateChannel.sendMessage(finalMsg).queue());
|
||||
sendingSuccess++;
|
||||
} catch (ErrorResponseException ex) {
|
||||
if (ex.getErrorResponse() == ErrorResponse.CANNOT_SEND_TO_USER)
|
||||
sendingFailed++;
|
||||
}
|
||||
}
|
||||
MessageFactory.create(msg)
|
||||
.setAuthor("Private Message: " + role.getName(), guild.getIconUrl())
|
||||
.setTimestamp()
|
||||
.footer("Successful Deliveries: " + sendingSuccess + " | Failed Deliveries: " + sendingFailed, guild.getIconUrl()).queue(channel);
|
||||
}
|
||||
}
|
@ -0,0 +1,40 @@
|
||||
package io.rixa.bot.commands.cmds.general;
|
||||
|
||||
import io.rixa.bot.commands.Command;
|
||||
import io.rixa.bot.commands.handler.CommandType;
|
||||
import io.rixa.bot.commands.perms.RixaPermission;
|
||||
import io.rixa.bot.utils.MessageFactory;
|
||||
import io.rixa.bot.utils.WebUtil;
|
||||
import net.dv8tion.jda.core.entities.Guild;
|
||||
import net.dv8tion.jda.core.entities.Member;
|
||||
import net.dv8tion.jda.core.entities.TextChannel;
|
||||
import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent;
|
||||
import org.json.JSONObject;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
public class AdviceCommand extends Command {
|
||||
|
||||
public AdviceCommand(String command, RixaPermission rixaPermission, String description, CommandType commandType) {
|
||||
super(command, rixaPermission, description, commandType);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(String commandLabel, Guild guild, Member member, TextChannel channel, String[] args) {
|
||||
MessageFactory.create(getAdvice()).setTitle("Advice Request").footer("Requested by: " + member.getEffectiveName(), member.getUser().getEffectiveAvatarUrl())
|
||||
.setColor(member.getColor()).setTimestamp().queue(channel);
|
||||
}
|
||||
|
||||
private String getAdvice() {
|
||||
String json;
|
||||
try {
|
||||
json = WebUtil.getWebPage("http://api.adviceslip.com/advice");
|
||||
} catch (IOException e) {
|
||||
return "Could not find any advice for you.";
|
||||
}
|
||||
|
||||
JSONObject obj = new JSONObject(json);
|
||||
JSONObject slip = obj.getJSONObject("slip");
|
||||
return slip.getString("advice");
|
||||
}
|
||||
}
|
@ -0,0 +1,30 @@
|
||||
package io.rixa.bot.commands.cmds.general;
|
||||
|
||||
import io.rixa.bot.commands.Command;
|
||||
import io.rixa.bot.commands.handler.CommandType;
|
||||
import io.rixa.bot.commands.perms.RixaPermission;
|
||||
import io.rixa.bot.guild.RixaGuild;
|
||||
import io.rixa.bot.guild.manager.GuildManager;
|
||||
import io.rixa.bot.utils.MessageFactory;
|
||||
import net.dv8tion.jda.core.entities.Guild;
|
||||
import net.dv8tion.jda.core.entities.Member;
|
||||
import net.dv8tion.jda.core.entities.TextChannel;
|
||||
|
||||
public class FeaturesCommand extends Command {
|
||||
|
||||
private String[] features = {
|
||||
"Music", "Economy", "Moderation", "Server List", "User Profiles",
|
||||
"Role Management", "Fun Commands", "Custom Commands", "Games", "& more."
|
||||
};
|
||||
|
||||
public FeaturesCommand(String command, RixaPermission rixaPermission, String description, CommandType commandType) {
|
||||
super(command, rixaPermission, description, commandType);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(String commandLabel, Guild guild, Member member, TextChannel channel, String[] args) {
|
||||
MessageFactory.create((features == null || features.length == 0) ? "There are currently no features listed." :
|
||||
String.join("\n", features)).setAuthor("Rixa Features", guild.getIconUrl())
|
||||
.setColor(member.getColor()).queue(channel);
|
||||
}
|
||||
}
|
@ -1,41 +1,40 @@
|
||||
package me.savvy.rixa.commands.general;
|
||||
package io.rixa.bot.commands.cmds.general;
|
||||
|
||||
import me.savvy.rixa.commands.handlers.Command;
|
||||
import me.savvy.rixa.commands.handlers.CommandExec;
|
||||
import me.savvy.rixa.utils.MessageBuilder;
|
||||
import io.rixa.bot.commands.Command;
|
||||
import io.rixa.bot.commands.handler.CommandType;
|
||||
import io.rixa.bot.commands.perms.RixaPermission;
|
||||
import io.rixa.bot.utils.MessageFactory;
|
||||
import net.dv8tion.jda.core.EmbedBuilder;
|
||||
import net.dv8tion.jda.core.entities.ChannelType;
|
||||
import net.dv8tion.jda.core.entities.Guild;
|
||||
import net.dv8tion.jda.core.entities.Member;
|
||||
import net.dv8tion.jda.core.entities.Message;
|
||||
import net.dv8tion.jda.core.entities.TextChannel;
|
||||
import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent;
|
||||
import net.dv8tion.jda.core.exceptions.ErrorResponseException;
|
||||
import net.dv8tion.jda.core.exceptions.PermissionException;
|
||||
|
||||
/**
|
||||
* Created by Timber on 5/7/2017.
|
||||
*/
|
||||
public class HelpCommand implements CommandExec {
|
||||
public class HelpCommand extends Command {
|
||||
|
||||
@Command(usage = "%phelp",
|
||||
channelType = ChannelType.TEXT,
|
||||
description = "Receive information about the server!", mainCommand = "help", aliases = "h")
|
||||
public void execute(GuildMessageReceivedEvent event) {
|
||||
try {
|
||||
event.getMessage().delete().complete();
|
||||
} catch (PermissionException ignored) {}
|
||||
public HelpCommand(String command, RixaPermission rixaPermission, String description, CommandType commandType) {
|
||||
super(command, rixaPermission, description, commandType);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(String commandLabel, Guild guild, Member member, TextChannel channel, String[] args) {
|
||||
EmbedBuilder embedBuilder = new EmbedBuilder();
|
||||
String stringBuilder = "\u2753" +
|
||||
" **Help**" +
|
||||
"\n" +
|
||||
"Click the corresponding number for more information about the command menu.";
|
||||
embedBuilder.setTitle(String.format("Help: %s", event.getGuild().getId()))
|
||||
embedBuilder.setTitle(String.format("Help: %s", guild.getId()))
|
||||
.setDescription(stringBuilder)
|
||||
.addField("1 - General Commands", "Reveals usable commands intended for `everyone`", false)
|
||||
.addField("2 - Staff Commands", "Reveals usable commands intended for `staff` use only", false)
|
||||
.addField("3 - Music Commands", "Reveals usable commands to configure Rixa for your discord!", false)
|
||||
.setColor(event.getMember().getColor());
|
||||
Message message = event.getAuthor().openPrivateChannel().complete().sendMessage(embedBuilder.build()).complete();
|
||||
new MessageBuilder(event.getMember().getAsMention()
|
||||
+ ", the help menu has been private messaged to you!").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
.setColor(member.getColor());
|
||||
Message message = member.getUser().openPrivateChannel().complete().sendMessage(embedBuilder.build()).complete();
|
||||
MessageFactory.create(member.getAsMention()
|
||||
+ ", the help menu has been private messaged to you!").setColor(member.getColor()).queue(channel);
|
||||
try {
|
||||
message.addReaction("\u0031\u20E3").queue();
|
||||
message.addReaction("\u0032\u20E3").queue();
|
@ -0,0 +1,83 @@
|
||||
package io.rixa.bot.commands.cmds.general;
|
||||
|
||||
import io.rixa.bot.Rixa;
|
||||
import io.rixa.bot.commands.Command;
|
||||
import io.rixa.bot.commands.handler.CommandType;
|
||||
import io.rixa.bot.commands.perms.RixaPermission;
|
||||
import io.rixa.bot.utils.DiscordUtils;
|
||||
import io.rixa.bot.utils.MessageFactory;
|
||||
import net.dv8tion.jda.core.EmbedBuilder;
|
||||
import net.dv8tion.jda.core.JDA;
|
||||
import net.dv8tion.jda.core.JDAInfo;
|
||||
import net.dv8tion.jda.core.entities.*;
|
||||
import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent;
|
||||
|
||||
import java.time.OffsetDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
public class InfoCommand extends Command {
|
||||
|
||||
public InfoCommand(String command, RixaPermission rixaPermission, String description, CommandType commandType) {
|
||||
super(command, rixaPermission, description, commandType);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(String commandLabel, Guild guild, Member author, TextChannel channel, String[] args) {
|
||||
if(args.length >= 1) {
|
||||
Member member = DiscordUtils.memberSearch(guild, String.join(" ", args), false).get(0);
|
||||
User user = member.getUser();
|
||||
OffsetDateTime time = user.getCreationTime();
|
||||
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMM/dd/yyyy HH:mm:ss");
|
||||
List<String> roles = new ArrayList<>();
|
||||
member.getRoles().forEach(role -> roles.add(role.getName()));
|
||||
MessageFactory.create("Playing **" + (member.getGame() == null ? "Unknown" : member.getGame().getName()) + "**")
|
||||
.setColor(member.getColor())
|
||||
.setThumbnail(user.getAvatarUrl())
|
||||
.setAuthor("User Information: " + user.getName(), null, user.getAvatarUrl())
|
||||
.addField("User", user.getAsMention(), true)
|
||||
.addField("ID", user.getId(), true)
|
||||
.addField("Roles: "+ member.getRoles().size(), String.join(" **,** " + roles), true)
|
||||
.addField("Status", member.getOnlineStatus().name(), true)
|
||||
.addField("Mutual Guilds", String.valueOf(user.getMutualGuilds().size()), true)
|
||||
.addField("Nickname", member.getNickname() == null ? "None" : member.getNickname(), true)
|
||||
.addField("Created", time.format(formatter), true)
|
||||
.addField("Joined", member.getJoinDate().format(formatter), true)
|
||||
.queue(channel);
|
||||
return;
|
||||
}
|
||||
User botOwner = guild.getJDA().getUserById("202944101333729280");
|
||||
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM/dd/yyyy HH:mm:ss");
|
||||
Date date1 = new Date(Rixa.getInstance().getTimeUp());
|
||||
long difference = new Date().getTime() - date1.getTime();
|
||||
long seconds = difference / 1000;
|
||||
int day = (int) TimeUnit.SECONDS.toDays(seconds);
|
||||
long hours = TimeUnit.SECONDS.toHours(seconds) - (day * 24);
|
||||
long minute = TimeUnit.SECONDS.toMinutes(seconds) - (TimeUnit.SECONDS.toHours(seconds) * 60);
|
||||
long second = TimeUnit.SECONDS.toSeconds(seconds) - (TimeUnit.SECONDS.toMinutes(seconds) * 60);
|
||||
int guildCount = 0;
|
||||
int userCount = 0;
|
||||
for (JDA jda : Rixa.getInstance().getShardList()) {
|
||||
guildCount += jda.getGuilds().size();
|
||||
userCount += jda.getUsers().size();
|
||||
}
|
||||
String uptime = String.format("Uptime: %d days %d hours %d minutes %d seconds", day, hours, minute, second);
|
||||
MessageFactory.create("Rixa is a user-friendly, multi-purpose bot currently in development which is capable of being customized to your Discord server needs. " +
|
||||
"Rixa is complete with a dashboard, user profile, server statistics system, and many more features such as assigning roles on user join, music module, " +
|
||||
"levels, and more. Rixa was created to bring ease and simplicity to managing Discord servers, and has since grown into much more than just a bot used for " +
|
||||
"moderation.")
|
||||
.setTitle("Rixa Discord Bot", "http://rixa.io/")
|
||||
.addField("Created", guild.getJDA().getSelfUser().getCreationTime().format(formatter), true)
|
||||
.addField("Bot Uptime ", uptime, true)
|
||||
.addField("Total Guilds", String.valueOf(guildCount), true)
|
||||
.addField("Total Users", String.valueOf(userCount), true)
|
||||
.addField("JDA Version", JDAInfo.VERSION, true)
|
||||
.addField("Rixa Developer", botOwner.getName() + "#" + botOwner.getDiscriminator(), true)
|
||||
.footer("Requested by " + author.getUser().getName() + "#" + author.getUser().getDiscriminator(), author.getUser().getAvatarUrl())
|
||||
.queue(channel);
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,58 @@
|
||||
package io.rixa.bot.commands.cmds.general;
|
||||
|
||||
import io.rixa.bot.commands.Command;
|
||||
import io.rixa.bot.commands.handler.CommandType;
|
||||
import io.rixa.bot.commands.perms.RixaPermission;
|
||||
import io.rixa.bot.guild.RixaGuild;
|
||||
import io.rixa.bot.guild.manager.GuildManager;
|
||||
import io.rixa.bot.guild.modules.module.LevelsModule;
|
||||
import io.rixa.bot.utils.DiscordUtils;
|
||||
import io.rixa.bot.utils.MessageFactory;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import net.dv8tion.jda.core.entities.Guild;
|
||||
import net.dv8tion.jda.core.entities.Member;
|
||||
import net.dv8tion.jda.core.entities.TextChannel;
|
||||
import net.dv8tion.jda.core.entities.User;
|
||||
|
||||
public class LeaderboardsCommand extends Command {
|
||||
|
||||
public LeaderboardsCommand(String command, RixaPermission rixaPermission, String description,
|
||||
CommandType commandType) {
|
||||
super(command, rixaPermission, description, commandType);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(String commandLabel, Guild guild, Member member, TextChannel channel,
|
||||
String[] args) {
|
||||
RixaGuild rixaGuild = GuildManager.getInstance().getGuild(guild);
|
||||
LevelsModule levelsModule = (LevelsModule) rixaGuild.getModule("Levels");
|
||||
int page = 1;
|
||||
List<String> leaderboard = getLeaderboard(rixaGuild, page);
|
||||
MessageFactory
|
||||
.create(leaderboard.isEmpty() ? "No users found!" : (String.join("\n", leaderboard)))
|
||||
.setAuthor("Leaderboard: " + guild.getName(), guild.getIconUrl())
|
||||
.setColor(member.getColor())
|
||||
.queue(channel, message -> {
|
||||
message.addReaction("\u2B05").complete();
|
||||
message.addReaction("\u27A1").complete();
|
||||
}).footer("Page: (" + page + " / " + levelsModule.getObjectPagination().getMaxPage() + ")",
|
||||
member.getGuild().getIconUrl());
|
||||
|
||||
}
|
||||
|
||||
private List<String> getLeaderboard(RixaGuild rixaGuild, int page) {
|
||||
LevelsModule levelsModule = (LevelsModule) rixaGuild.getModule("Levels");
|
||||
List<Object> objects = levelsModule.getObjectPagination().getPage(page);
|
||||
List<String> leaderboard = new ArrayList<>();
|
||||
objects.forEach(s -> {
|
||||
String[] string = String.valueOf(s).split(":");
|
||||
User user = rixaGuild.getGuild().getJDA().getUserById(string[0]);
|
||||
int exp = Integer.parseInt(string[1]);
|
||||
leaderboard.add
|
||||
(user.getName() + "#" + user.getDiscriminator() + " (Lvl. " +
|
||||
DiscordUtils.getLevelFromExperience(exp) + ")");
|
||||
});
|
||||
return leaderboard;
|
||||
}
|
||||
}
|
@ -0,0 +1,61 @@
|
||||
package io.rixa.bot.commands.cmds.general;
|
||||
|
||||
import io.rixa.bot.commands.Command;
|
||||
import io.rixa.bot.commands.handler.CommandType;
|
||||
import io.rixa.bot.commands.perms.RixaPermission;
|
||||
import io.rixa.bot.utils.MessageFactory;
|
||||
import io.rixa.bot.utils.WebUtil;
|
||||
import net.dv8tion.jda.core.entities.Channel;
|
||||
import net.dv8tion.jda.core.entities.Guild;
|
||||
import net.dv8tion.jda.core.entities.Member;
|
||||
import net.dv8tion.jda.core.entities.TextChannel;
|
||||
import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent;
|
||||
import org.json.JSONObject;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
|
||||
public class MinecraftCommand extends Command {
|
||||
|
||||
public MinecraftCommand(String command, RixaPermission rixaPermission, String description, CommandType commandType, List<String>aliases) {
|
||||
super(command, rixaPermission, description, commandType, aliases);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(String commandLabel, Guild guild, Member member, TextChannel channel, String[] args) {
|
||||
if (args.length == 0) {
|
||||
MessageFactory.create("Incorrect Usage! Try " + commandLabel + " {IP}:{PORT}").setColor(member.getColor()).queue(channel);
|
||||
return;
|
||||
}
|
||||
|
||||
String ipAddress = args[0];
|
||||
|
||||
JSONObject object = get(ipAddress);
|
||||
if (object == null || !object.getBoolean("status")) {
|
||||
// Not correct
|
||||
MessageFactory.create("Server Information not found!").setColor(member.getColor()).queue(channel);
|
||||
return;
|
||||
}
|
||||
JSONObject onlineObject = object.getJSONObject("players");
|
||||
MessageFactory.create(
|
||||
object.getJSONObject("motds").getString("clean"))
|
||||
.setTitle(ipAddress)
|
||||
.addField("Version", object.getString("version"), true)
|
||||
.addField("Online Players", (onlineObject == null) ? "0/0" : onlineObject.getInt("online") + "/" + onlineObject.getInt("max"), true)
|
||||
.addField("Ping", String.valueOf(object.getInt("ping")), true)
|
||||
.setImage(String.format("https://use.gameapis.net/mc/query/banner/%s/night,caps", ipAddress))
|
||||
.addThumbnail("https://use.gameapis.net/mc/query/icon/" + ipAddress)
|
||||
.queue(channel);
|
||||
}
|
||||
|
||||
private JSONObject get(String ip) {
|
||||
String json;
|
||||
try {
|
||||
json = WebUtil.getWebPage("https://use.gameapis.net/mc/query/info/" + ip);
|
||||
} catch (IOException e) {
|
||||
return null;
|
||||
}
|
||||
return new JSONObject(json);
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,33 @@
|
||||
package io.rixa.bot.commands.cmds.general;
|
||||
|
||||
import io.rixa.bot.commands.Command;
|
||||
import io.rixa.bot.commands.handler.CommandType;
|
||||
import io.rixa.bot.commands.perms.RixaPermission;
|
||||
import io.rixa.bot.guild.RixaGuild;
|
||||
import io.rixa.bot.guild.manager.GuildManager;
|
||||
import io.rixa.bot.utils.MessageFactory;
|
||||
import net.dv8tion.jda.core.entities.Guild;
|
||||
import net.dv8tion.jda.core.entities.Member;
|
||||
import net.dv8tion.jda.core.entities.Message;
|
||||
import net.dv8tion.jda.core.entities.TextChannel;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class ModulesCommand extends Command {
|
||||
|
||||
public ModulesCommand(String command, RixaPermission rixaPermission, String description, CommandType commandType) {
|
||||
super(command, rixaPermission, description, commandType);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(String commandLabel, Guild guild, Member member, TextChannel channel, String[] args) {
|
||||
RixaGuild rixaGuild = GuildManager.getInstance().getGuild(guild);
|
||||
List<String> modules = new ArrayList<>();
|
||||
rixaGuild.getModules().values().forEach
|
||||
(module -> modules.add(String.format("%s [%s]", module.getName(),
|
||||
(module.isEnabled()) ? "Enabled" : "Disabled")));
|
||||
MessageFactory.create(String.join(",\n", modules)).setAuthor("Module List", guild.getIconUrl())
|
||||
.setTimestamp().setColor(member.getColor()).queue(channel);
|
||||
}
|
||||
}
|
@ -0,0 +1,357 @@
|
||||
package io.rixa.bot.commands.cmds.general;
|
||||
|
||||
import com.sedmelluq.discord.lavaplayer.player.AudioLoadResultHandler;
|
||||
import com.sedmelluq.discord.lavaplayer.player.AudioPlayer;
|
||||
import com.sedmelluq.discord.lavaplayer.player.AudioPlayerManager;
|
||||
import com.sedmelluq.discord.lavaplayer.player.DefaultAudioPlayerManager;
|
||||
import com.sedmelluq.discord.lavaplayer.source.bandcamp.BandcampAudioSourceManager;
|
||||
import com.sedmelluq.discord.lavaplayer.source.beam.BeamAudioSourceManager;
|
||||
import com.sedmelluq.discord.lavaplayer.source.http.HttpAudioSourceManager;
|
||||
import com.sedmelluq.discord.lavaplayer.source.local.LocalAudioSourceManager;
|
||||
import com.sedmelluq.discord.lavaplayer.source.soundcloud.SoundCloudAudioSourceManager;
|
||||
import com.sedmelluq.discord.lavaplayer.source.twitch.TwitchStreamAudioSourceManager;
|
||||
import com.sedmelluq.discord.lavaplayer.source.vimeo.VimeoAudioSourceManager;
|
||||
import com.sedmelluq.discord.lavaplayer.source.youtube.YoutubeAudioSourceManager;
|
||||
import com.sedmelluq.discord.lavaplayer.tools.FriendlyException;
|
||||
import com.sedmelluq.discord.lavaplayer.track.AudioPlaylist;
|
||||
import com.sedmelluq.discord.lavaplayer.track.AudioTrack;
|
||||
import io.rixa.bot.apis.YoutubeSearch;
|
||||
import io.rixa.bot.commands.Command;
|
||||
import io.rixa.bot.commands.handler.CommandType;
|
||||
import io.rixa.bot.commands.perms.RixaPermission;
|
||||
import io.rixa.bot.guild.RixaGuild;
|
||||
import io.rixa.bot.guild.manager.GuildManager;
|
||||
import io.rixa.bot.guild.modules.module.MusicModule;
|
||||
import io.rixa.bot.guild.modules.module.music.MusicManager;
|
||||
import io.rixa.bot.pagination.Pagination;
|
||||
import io.rixa.bot.utils.DiscordUtils;
|
||||
import io.rixa.bot.utils.MessageFactory;
|
||||
import net.dv8tion.jda.core.Permission;
|
||||
import net.dv8tion.jda.core.entities.Guild;
|
||||
import net.dv8tion.jda.core.entities.Member;
|
||||
import net.dv8tion.jda.core.entities.TextChannel;
|
||||
import net.dv8tion.jda.core.entities.VoiceChannel;
|
||||
import net.dv8tion.jda.core.exceptions.PermissionException;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import java.awt.*;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class MusicCommand extends Command {
|
||||
|
||||
private final int DEFAULT_VOLUME = 35;
|
||||
private final AudioPlayerManager playerManager;
|
||||
|
||||
public MusicCommand(String command, RixaPermission rixaPermission, String description, CommandType commandType) {
|
||||
super(command, rixaPermission, description, commandType);
|
||||
this.playerManager = new DefaultAudioPlayerManager();
|
||||
this.playerManager.registerSourceManager(new YoutubeAudioSourceManager());
|
||||
this.playerManager.registerSourceManager(new SoundCloudAudioSourceManager());
|
||||
this.playerManager.registerSourceManager(new BandcampAudioSourceManager());
|
||||
this.playerManager.registerSourceManager(new VimeoAudioSourceManager());
|
||||
this.playerManager.registerSourceManager(new TwitchStreamAudioSourceManager());
|
||||
this.playerManager.registerSourceManager(new HttpAudioSourceManager());
|
||||
this.playerManager.registerSourceManager(new LocalAudioSourceManager());
|
||||
this.playerManager.registerSourceManager(new BeamAudioSourceManager());
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(String commandLabel, Guild guild, Member member, TextChannel channel, String[] args) {
|
||||
RixaGuild rixaGuild = GuildManager.getInstance().getGuild(guild);
|
||||
MusicModule musicModule = (MusicModule) rixaGuild.getModule("Music");
|
||||
if (musicModule.getMusicRole() != null && !member.getRoles().contains(musicModule.getMusicRole())) {
|
||||
MessageFactory.create("You do not have the required music role (" + musicModule.getMusicRole().getName() +
|
||||
") to use this command").setTimestamp().setColor(member.getColor()).queue(channel);
|
||||
return;
|
||||
}
|
||||
MusicManager musicManager = getMusicManager(rixaGuild);
|
||||
AudioPlayer player = musicManager.getPlayer();
|
||||
Pagination queuePagination = musicManager.getScheduler().getQueuePagination();
|
||||
if (args.length == 1) {
|
||||
switch (args[0].toLowerCase()) {
|
||||
case "leave":
|
||||
MessageFactory.create("Leaving voice channel...").setColor(member.getColor()).queue(channel);
|
||||
reset(guild, musicManager);
|
||||
channel.getGuild().getAudioManager().closeAudioConnection();
|
||||
break;
|
||||
case "join":
|
||||
case "summon":
|
||||
if (member.getVoiceState().getChannel() == null) {
|
||||
MessageFactory.create("You must be in a voice channel to summon me!").setColor(member.getColor()).queue(channel);
|
||||
return;
|
||||
}
|
||||
VoiceChannel voiceChannel = member.getVoiceState().getChannel();
|
||||
joinVoice(voiceChannel, member, channel);
|
||||
break;
|
||||
case "pause":
|
||||
case "resume":
|
||||
case "play":
|
||||
if (player.isPaused()) {
|
||||
player.setPaused(false);
|
||||
MessageFactory.create("MusicPlayer resumed track: " + player.getPlayingTrack().getInfo().title).setColor(member.getColor()).queue(channel);
|
||||
} else if (!(player.isPaused())) {
|
||||
player.setPaused(false);
|
||||
MessageFactory.create("MusicPlayer paused track: " + player.getPlayingTrack().getInfo().title).setColor(member.getColor()).queue(channel);
|
||||
} else if (player.getPlayingTrack() != null) {
|
||||
MessageFactory.create("MusicPlayer already playing track: " + player.getPlayingTrack().getInfo().title).setColor(member.getColor()).queue(channel);
|
||||
} else if (musicManager.getScheduler().getQueue().isEmpty()) {
|
||||
MessageFactory.create("The audio queue is empty! Add a track to the queue first!").setColor(member.getColor()).queue(channel);
|
||||
}
|
||||
break;
|
||||
case "stop":
|
||||
musicManager.getScheduler().getQueue().clear();
|
||||
player.stopTrack();
|
||||
player.setPaused(false);
|
||||
MessageFactory.create("The music player has been stopped and queue has been cleared.").setColor(member.getColor()).queue(channel);
|
||||
break;
|
||||
case "skip":
|
||||
AudioTrack audioTrack = musicManager.getScheduler().nextTrack();
|
||||
if (audioTrack == null) {
|
||||
MessageFactory.create("The queue is now empty, add more to continue to listen to music!").setColor(member.getColor()).queue(channel);
|
||||
return;
|
||||
}
|
||||
MessageFactory.create("Successfully skipped current track. Now playing: " + audioTrack.getInfo().title).setColor(member.getColor()).queue(channel);
|
||||
break;
|
||||
case "nowplaying":
|
||||
case "np":
|
||||
audioTrack = musicManager.getScheduler().getPlayer().getPlayingTrack();
|
||||
if (audioTrack == null) {
|
||||
MessageFactory.create("The audio queue is empty! Add a track to the queue first!").setColor(member.getColor()).queue(channel);
|
||||
return;
|
||||
}
|
||||
MessageFactory.create().setAuthor(audioTrack.getInfo().title, "https://i.imgur.com/AnaMjsH.png")
|
||||
.addField("Author", audioTrack.getInfo().author, true)
|
||||
.addField("Duration", getTimestamp(audioTrack.getInfo().length), true)
|
||||
.addField("Position", getTimestamp(audioTrack.getPosition()), true).queue(channel);
|
||||
break;
|
||||
case "playlist":
|
||||
case "queue":
|
||||
case "list":
|
||||
if (musicManager.getScheduler().getQueue().size() == 0) {
|
||||
MessageFactory.create("The audio queue is empty! Add a track to the queue first!").setColor(member.getColor()).queue(channel);
|
||||
return;
|
||||
}
|
||||
List<Object> firstPage = queuePagination.getPage(1);
|
||||
if (firstPage == null || firstPage.isEmpty()) {
|
||||
MessageFactory.create("The audio queue is empty! Add a track to the queue first!").setColor(member.getColor()).queue(channel);
|
||||
return;
|
||||
}
|
||||
List<String> titles = new ArrayList<>();
|
||||
for (int i = 0; i < firstPage.size(); i++) {
|
||||
if (firstPage.get(i) == null) continue;
|
||||
titles.add("`" + (i + 1) + ")` " + ((AudioTrack) firstPage.get(i)).getInfo().title);
|
||||
}
|
||||
MessageFactory.create(String.join("\n", titles)).setAuthor("Music Queue", "https://i.imgur.com/AnaMjsH.png")
|
||||
.queue(channel, message -> {
|
||||
message.addReaction("\u2B05").queue();
|
||||
message.addReaction("\u27A1").queue();
|
||||
});
|
||||
break;
|
||||
case "restart":
|
||||
audioTrack = player.getPlayingTrack();
|
||||
if (audioTrack == null) {
|
||||
audioTrack = musicManager.getScheduler().getLastTrack();
|
||||
}
|
||||
if (audioTrack == null) {
|
||||
MessageFactory.create("No track has been previously played.").setColor(member.getColor()).queue(channel);
|
||||
return;
|
||||
}
|
||||
MessageFactory.create("Restarting Track: " + audioTrack.getInfo().title).setColor(member.getColor()).queue(channel);
|
||||
player.playTrack(audioTrack.makeClone());
|
||||
break;
|
||||
case "repeat":
|
||||
musicManager.getScheduler().setRepeating(!musicManager.getScheduler().isRepeating());
|
||||
MessageFactory.create("Music repeat has been " + (musicManager.getScheduler().isRepeating() ? "enabled" : "disabled"))
|
||||
.setColor(member.getColor()).queue(channel);
|
||||
break;
|
||||
case "playlistrepeat":
|
||||
case "pr":
|
||||
musicManager.getScheduler().setPlaylistRepeat(!musicManager.getScheduler().isPlaylistRepeat());
|
||||
MessageFactory.create("Playlist repeat has been " + (musicManager.getScheduler().isPlaylistRepeat() ? "enabled" : "disabled"))
|
||||
.setColor(member.getColor()).queue(channel);
|
||||
break;
|
||||
case "reset":
|
||||
reset(guild, musicManager);
|
||||
guild.getAudioManager().setSendingHandler(musicManager.getSendHandler());
|
||||
MessageFactory.create("The player has been completely reset!").setColor(member.getColor()).queue(channel);
|
||||
break;
|
||||
case "shuffle":
|
||||
if (musicManager.getScheduler().getQueue().isEmpty()) {
|
||||
MessageFactory.create("The queue is currently empty!").setColor(member.getColor()).queue(channel);
|
||||
return;
|
||||
}
|
||||
musicManager.getScheduler().shuffle();
|
||||
MessageFactory.create("The queue has been shuffled!").setColor(member.getColor()).queue(channel);
|
||||
break;
|
||||
}
|
||||
} else if (args.length == 2) {
|
||||
String string = StringUtils.join(args, " ", 1, args.length);
|
||||
switch (args[0].toLowerCase()) {
|
||||
case "join":
|
||||
VoiceChannel voiceChannel = DiscordUtils.voiceChannelSearch(guild, string);
|
||||
if (voiceChannel == null) {
|
||||
return;
|
||||
}
|
||||
joinVoice(voiceChannel, member, channel);
|
||||
break;
|
||||
case "play":
|
||||
case "playlist":
|
||||
case "pplay":
|
||||
if (member.getVoiceState().getChannel() == null) {
|
||||
MessageFactory.create("You must be in a voice channel to summon me!").setColor(member.getColor()).queue(channel);
|
||||
return;
|
||||
}
|
||||
if (guild.getSelfMember().getVoiceState().getChannel() == null) {
|
||||
joinVoice(member.getVoiceState().getChannel(), member, channel);
|
||||
}
|
||||
loadAndPlay(musicManager, channel, args[1], (args[1].toLowerCase().contains("playlist")
|
||||
|| args[0].equalsIgnoreCase("playlist")
|
||||
|| args[0].equalsIgnoreCase("pplay")));
|
||||
break;
|
||||
case "volume":
|
||||
case "vol":
|
||||
try {
|
||||
int newVolume = Math.max(10, Math.min(100, Integer.parseInt(args[1])));
|
||||
int oldVolume = player.getVolume();
|
||||
player.setVolume(newVolume);
|
||||
MessageFactory.create("Music player volume updated from `" + oldVolume + "` to `" + newVolume + "`").setColor(member.getColor()).queue(channel);
|
||||
} catch (NumberFormatException e) {
|
||||
MessageFactory.create(args[1] + " is not a valid integer. Try a number between 10 and 100.").setColor(member.getColor()).queue(channel);
|
||||
}
|
||||
break;
|
||||
case "forward":
|
||||
if (player.getPlayingTrack() == null) {
|
||||
MessageFactory.create("The audio queue is empty! Add a track to the queue first!").setColor(member.getColor()).queue(channel);
|
||||
return;
|
||||
}
|
||||
try {
|
||||
player.getPlayingTrack().setPosition(Math.max(0, player.getPlayingTrack().getPosition() + (Integer.parseInt(args[1]) * 1000)));
|
||||
} catch (NumberFormatException e) {
|
||||
MessageFactory.create(args[1] + " is not a valid integer. Try `10`!").setColor(member.getColor()).queue(channel);
|
||||
}
|
||||
break;
|
||||
case "back":
|
||||
if (player.getPlayingTrack() == null) {
|
||||
MessageFactory.create("The audio queue is empty! Add a track to the queue first!").setColor(member.getColor()).queue(channel);
|
||||
return;
|
||||
}
|
||||
try {
|
||||
player.getPlayingTrack().setPosition(Math.max(0, player.getPlayingTrack().getPosition() - (Integer.parseInt(args[1]) * 1000)));
|
||||
} catch (NumberFormatException e) {
|
||||
MessageFactory.create(args[1] + " is not a valid integer. Try `10`!").setColor(member.getColor()).queue(channel);
|
||||
}
|
||||
break;
|
||||
}
|
||||
} else if (args.length >= 3) {
|
||||
String string = StringUtils.join(args, " ", 1, args.length);
|
||||
switch (args[0].toLowerCase()) {
|
||||
case "join":
|
||||
VoiceChannel voiceChannel = DiscordUtils.voiceChannelSearch(guild, string);
|
||||
if (voiceChannel == null) {
|
||||
MessageFactory.create("Sorry I was unable to find the VoiceChannel: `" + string + "`.").setColor(member.getColor()).queue(channel);
|
||||
}
|
||||
joinVoice(voiceChannel, member, channel);
|
||||
break;
|
||||
case "youtube":
|
||||
case "ytsearch":
|
||||
case "yt":
|
||||
case "search":
|
||||
try {
|
||||
YoutubeSearch ytSearch = new YoutubeSearch(string);
|
||||
loadAndPlay(musicManager, channel, ytSearch.getUrl(0), false);
|
||||
} catch (IOException e) {
|
||||
MessageFactory.create("Error Occurred: Could not play youtube video.").setColor(member.getColor()).queue(channel);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void joinVoice(VoiceChannel voiceChannel, Member member, TextChannel channel) {
|
||||
try {
|
||||
channel.getGuild().getAudioManager().openAudioConnection(voiceChannel);
|
||||
MessageFactory.create("Entering Voice Channel: " + voiceChannel.getName()).setColor(member.getColor()).queue(channel);
|
||||
if (voiceChannel.getGuild().getAudioManager().getSendingHandler() == null) {
|
||||
voiceChannel.getGuild().getAudioManager().setSendingHandler
|
||||
(getMusicManager(GuildManager.getInstance().getGuild(voiceChannel.getGuild())).getSendHandler());
|
||||
}
|
||||
} catch (PermissionException e) {
|
||||
if (e.getPermission() == Permission.VOICE_CONNECT) {
|
||||
MessageFactory.create("I do not have permission to join the requested voice channel.").setColor(member.getColor()).queue(channel);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void reset(Guild guild, MusicManager musicManager) {
|
||||
synchronized (musicManager) {
|
||||
musicManager.getScheduler().getQueue().clear();
|
||||
musicManager.getScheduler().getPlayer().destroy();
|
||||
guild.getAudioManager().setSendingHandler(null);
|
||||
}
|
||||
}
|
||||
|
||||
private void loadAndPlay(MusicManager mng, final TextChannel channel, final String trackUrl, final boolean addPlaylist) {
|
||||
playerManager.loadItemOrdered(mng, trackUrl, new AudioLoadResultHandler() {
|
||||
@Override
|
||||
public void trackLoaded(AudioTrack track) {
|
||||
String msg = "Adding to queue: " + track.getInfo().title;
|
||||
mng.getScheduler().queue(track);
|
||||
MessageFactory.create(msg).setColor(Color.decode("#4CC276")).queue(channel);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void playlistLoaded(AudioPlaylist playlist) {
|
||||
AudioTrack firstTrack = playlist.getSelectedTrack();
|
||||
List<AudioTrack> tracks = playlist.getTracks();
|
||||
|
||||
if (firstTrack == null) {
|
||||
firstTrack = playlist.getTracks().get(0);
|
||||
}
|
||||
|
||||
if (addPlaylist) {
|
||||
MessageFactory.create("Adding (" + playlist.getTracks().size() + ") tracks to queue from playlist: " + playlist.getName()).setColor(Color.decode("#4CC276")).queue(channel);
|
||||
tracks.forEach(mng.getScheduler()::queue);
|
||||
} else {
|
||||
MessageFactory.create("Adding to queue " + firstTrack.getInfo().title + " (first track of playlist " + playlist.getName() + ")").setColor(Color.decode("#4CC276")).queue(channel);
|
||||
mng.getScheduler().queue(firstTrack);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void noMatches() {
|
||||
MessageFactory.create("Nothing found by " + trackUrl).setColor(Color.decode("#4CC276")).queue(channel);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void loadFailed(FriendlyException exception) {
|
||||
MessageFactory.create("Could not play: " + exception.getMessage()).setColor(Color.decode("#4CC276")).queue(channel);
|
||||
exception.printStackTrace();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public MusicManager getMusicManager(RixaGuild guild) {
|
||||
MusicModule musicModule = (MusicModule) guild.getModule("Music");
|
||||
if (musicModule.getMusicManager() != null) {
|
||||
return musicModule.getMusicManager();
|
||||
}
|
||||
MusicManager musicManager = new MusicManager(this.playerManager);
|
||||
musicManager.getPlayer().setVolume(DEFAULT_VOLUME);
|
||||
musicModule.setMusicManager(musicManager);
|
||||
return musicManager;
|
||||
}
|
||||
|
||||
private String getTimestamp(long milliseconds) {
|
||||
int seconds = (int) (milliseconds / 1000) % 60;
|
||||
int minutes = (int) ((milliseconds / (1000 * 60)) % 60);
|
||||
int hours = (int) ((milliseconds / (1000 * 60 * 60)) % 24);
|
||||
|
||||
if (hours > 0)
|
||||
return String.format("%02d:%02d:%02d", hours, minutes, seconds);
|
||||
else
|
||||
return String.format("%02d:%02d", minutes, seconds);
|
||||
}
|
||||
}
|
@ -0,0 +1,22 @@
|
||||
package io.rixa.bot.commands.cmds.general;
|
||||
|
||||
import io.rixa.bot.commands.Command;
|
||||
import io.rixa.bot.commands.handler.CommandType;
|
||||
import io.rixa.bot.commands.perms.RixaPermission;
|
||||
import io.rixa.bot.utils.MessageFactory;
|
||||
import net.dv8tion.jda.core.entities.Guild;
|
||||
import net.dv8tion.jda.core.entities.Member;
|
||||
import net.dv8tion.jda.core.entities.TextChannel;
|
||||
import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent;
|
||||
|
||||
public class PingCommand extends Command {
|
||||
|
||||
public PingCommand(String command, RixaPermission rixaPermission, String description, CommandType commandType) {
|
||||
super(command, rixaPermission, description, commandType);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(String commandLabel, Guild guild, Member member, TextChannel channel, String[] args) {
|
||||
MessageFactory.create("Pong! [" + guild.getJDA().getPing() + "ms]").setColor(member.getColor()).queue(channel);
|
||||
}
|
||||
}
|
@ -0,0 +1,48 @@
|
||||
package io.rixa.bot.commands.cmds.general;
|
||||
|
||||
import io.rixa.bot.commands.Command;
|
||||
import io.rixa.bot.commands.handler.CommandType;
|
||||
import io.rixa.bot.commands.perms.RixaPermission;
|
||||
import io.rixa.bot.utils.MessageFactory;
|
||||
import io.rixa.bot.utils.WebUtil;
|
||||
import net.dv8tion.jda.core.entities.Guild;
|
||||
import net.dv8tion.jda.core.entities.Member;
|
||||
import net.dv8tion.jda.core.entities.TextChannel;
|
||||
import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent;
|
||||
import org.json.JSONObject;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
public class QuoteCommand extends Command {
|
||||
|
||||
public QuoteCommand(String command, RixaPermission rixaPermission, String description, CommandType commandType) {
|
||||
super(command, rixaPermission, description, commandType);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(String commandLabel, Guild guild, Member member, TextChannel channel, String[] args) {
|
||||
String[] quote = getAdvice();
|
||||
MessageFactory.create(quote[0]).setTitle("Author: " + quote[1]).footer("Requested by: " + member.getEffectiveName(),
|
||||
member.getUser().getEffectiveAvatarUrl()).setTimestamp()
|
||||
.setColor(member.getColor()).queue(channel);
|
||||
}
|
||||
|
||||
private String[] getAdvice() {
|
||||
String[] strings = new String[2];
|
||||
String json;
|
||||
try {
|
||||
json = WebUtil.getWebPage("https://api.forismatic.com/api/1.0/?method=getQuote&lang=en&format=json");
|
||||
} catch (IOException e) {
|
||||
strings[0] = "Could not find any quotes for you.";
|
||||
strings[1] = "Author not found";
|
||||
return strings;
|
||||
}
|
||||
|
||||
JSONObject obj = new JSONObject(json);
|
||||
String quote = obj.getString("quoteText");
|
||||
String author = obj.getString("quoteAuthor");
|
||||
strings[0] = quote;
|
||||
strings[1] = author;
|
||||
return strings;
|
||||
}
|
||||
}
|
@ -0,0 +1,78 @@
|
||||
package io.rixa.bot.commands.cmds.general;
|
||||
|
||||
import io.rixa.bot.commands.Command;
|
||||
import io.rixa.bot.commands.handler.CommandType;
|
||||
import io.rixa.bot.commands.perms.RixaPermission;
|
||||
import io.rixa.bot.data.storage.DatabaseAdapter;
|
||||
import io.rixa.bot.guild.RixaGuild;
|
||||
import io.rixa.bot.guild.manager.GuildManager;
|
||||
import io.rixa.bot.user.RixaUser;
|
||||
import io.rixa.bot.user.manager.UserManager;
|
||||
import io.rixa.bot.utils.DiscordUtils;
|
||||
import io.rixa.bot.utils.MessageFactory;
|
||||
import java.util.List;
|
||||
import net.dv8tion.jda.core.entities.Guild;
|
||||
import net.dv8tion.jda.core.entities.Member;
|
||||
import net.dv8tion.jda.core.entities.TextChannel;
|
||||
import net.dv8tion.jda.core.entities.User;
|
||||
|
||||
public class RankCommand extends Command {
|
||||
|
||||
public RankCommand(String command, RixaPermission rixaPermission, String description, CommandType commandType) {
|
||||
super(command, rixaPermission, description, commandType);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(String commandLabel, Guild guild, Member member, TextChannel channel, String[] args) {
|
||||
RixaGuild rixaGuild = GuildManager.getInstance().getGuild(guild);
|
||||
if (!rixaGuild.getModule("Levels").isEnabled()) {
|
||||
MessageFactory.create("Levels are not enabled on this server!")
|
||||
.setColor(member.getColor()).queue(channel);
|
||||
return;
|
||||
}
|
||||
if (args.length == 0) {
|
||||
getInfo(rixaGuild, member).queue(channel);
|
||||
return;
|
||||
}
|
||||
List<Member> members = DiscordUtils.memberSearch(guild, String.join(" ", args), false);
|
||||
if (members.isEmpty()) {
|
||||
MessageFactory.create("Could not find valid member! Please try again!").setColor(member.getColor()).queue(channel);
|
||||
return;
|
||||
}
|
||||
getInfo(rixaGuild, members.get(0)).queue(channel);
|
||||
}
|
||||
|
||||
private MessageFactory getInfo(RixaGuild rixaGuild, Member member) {
|
||||
User author = member.getUser();
|
||||
int rank = 1;
|
||||
int count = DatabaseAdapter.getInstance().get().queryForObject
|
||||
("SELECT COUNT(*) FROM `levels`", Integer.class);
|
||||
if (count > 0) {
|
||||
rank = DatabaseAdapter.getInstance().get().queryForObject("SELECT * FROM `levels` WHERE `guild_id` = ? ORDER BY `experience` DESC",
|
||||
new Object[]{member.getGuild().getId()}, (resultSet, i) -> {
|
||||
int main = 1;
|
||||
|
||||
while (resultSet.next()) {
|
||||
if (resultSet.getString("user_id").equalsIgnoreCase(member.getUser().getId())) {
|
||||
return main;
|
||||
}
|
||||
main++;
|
||||
}
|
||||
return main;
|
||||
});
|
||||
}
|
||||
RixaUser rixaUser = UserManager.getInstance().getUser(member.getUser());
|
||||
int levels = rixaUser.getLevels(rixaGuild.getGuild().getId());
|
||||
return MessageFactory.create()
|
||||
.setAuthor(author.getName(), author.getEffectiveAvatarUrl(), author.getEffectiveAvatarUrl())
|
||||
.setTitle(author.getName() + "'s level")
|
||||
.setColor(member.getColor())
|
||||
.addField("Rank", String.valueOf(rank), true)
|
||||
.addField("Level", String.valueOf(DiscordUtils.getLevelFromExperience(rixaUser.getLevels
|
||||
(rixaGuild.getId()))), true)
|
||||
.addField("Exp Needed",
|
||||
DiscordUtils.getRemainingExperience(levels) + "/" + DiscordUtils.getNeededXP
|
||||
(DiscordUtils.getLevelFromExperience(levels)).intValue(), false)
|
||||
.addField("Total Exp", String.valueOf(levels), true);
|
||||
}
|
||||
}
|
@ -0,0 +1,49 @@
|
||||
package io.rixa.bot.commands.cmds.general;
|
||||
|
||||
import io.rixa.bot.commands.Command;
|
||||
import io.rixa.bot.commands.handler.CommandType;
|
||||
import io.rixa.bot.commands.perms.RixaPermission;
|
||||
import io.rixa.bot.utils.DiscordUtils;
|
||||
import io.rixa.bot.utils.MessageFactory;
|
||||
import net.dv8tion.jda.core.entities.Guild;
|
||||
import net.dv8tion.jda.core.entities.Member;
|
||||
import net.dv8tion.jda.core.entities.Role;
|
||||
import net.dv8tion.jda.core.entities.TextChannel;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class RoleMemberList extends Command {
|
||||
|
||||
public RoleMemberList(String command, RixaPermission rixaPermission, String description, CommandType commandType) {
|
||||
super(command, rixaPermission, description, commandType);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(String commandLabel, Guild guild, Member member, TextChannel channel, String[] args) {
|
||||
String string = String.join(" ", args);
|
||||
Role role = DiscordUtils.searchFirstRole(guild, string);
|
||||
if (role == null) {
|
||||
MessageFactory.create("Incorrect Usage! Example: " + commandLabel + " Member!").setColor(member.getColor()).queue(channel);
|
||||
return;
|
||||
}
|
||||
List<Member> roleMembers = guild.getMembersWithRoles(role);
|
||||
if (roleMembers.isEmpty()) {
|
||||
MessageFactory.create("Could not find any users with the role " + role.getName()).setColor(member.getColor()).queue(channel);
|
||||
return;
|
||||
}
|
||||
List<String> membersWithRole = new ArrayList<>();
|
||||
roleMembers.forEach(roleMember -> membersWithRole.add(format(roleMember)));
|
||||
MessageFactory.create(String.join(", ", membersWithRole))
|
||||
.setAuthor("Users with role: " + role.getName(), guild.getIconUrl()).setTimestamp()
|
||||
.setColor(member.getColor()).queue(channel);
|
||||
}
|
||||
|
||||
private String format(Member member) {
|
||||
String name = member.getUser().getName() + "#" + member.getUser().getDiscriminator();
|
||||
if (member.getNickname() != null && !member.getNickname().isEmpty()) {
|
||||
name = name + String.format(" [%s]", member.getNickname());
|
||||
}
|
||||
return name;
|
||||
}
|
||||
}
|
@ -0,0 +1,45 @@
|
||||
package io.rixa.bot.commands.cmds.general;
|
||||
|
||||
import io.rixa.bot.commands.Command;
|
||||
import io.rixa.bot.commands.handler.CommandType;
|
||||
import io.rixa.bot.commands.perms.RixaPermission;
|
||||
import io.rixa.bot.guild.RixaGuild;
|
||||
import io.rixa.bot.guild.manager.GuildManager;
|
||||
import io.rixa.bot.utils.MessageFactory;
|
||||
import net.dv8tion.jda.core.entities.Guild;
|
||||
import net.dv8tion.jda.core.entities.Member;
|
||||
import net.dv8tion.jda.core.entities.TextChannel;
|
||||
import net.dv8tion.jda.core.entities.User;
|
||||
import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent;
|
||||
|
||||
import java.time.format.DateTimeFormatter;
|
||||
|
||||
public class ServerInfoCommand extends Command {
|
||||
|
||||
public ServerInfoCommand(String command, RixaPermission rixaPermission, String description, CommandType commandType) {
|
||||
super(command, rixaPermission, description, commandType);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(String commandLabel, Guild guild, Member member, TextChannel channel, String[] args) {
|
||||
RixaGuild rixaGuild = GuildManager.getInstance().getGuild(guild);
|
||||
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM/dd/yyyy HH:mm:ss");
|
||||
User owner = guild.getOwner().getUser();
|
||||
MessageFactory
|
||||
.create(rixaGuild.getDescription())
|
||||
.setTitle(guild.getName(), String.format("http://rixa.io/servers/%s", guild.getId()))
|
||||
.addField("Created", guild.getCreationTime().format(formatter), true)
|
||||
.addField("Region", guild.getRegion().toString(), true)
|
||||
.addField("Users", String.valueOf(guild.getMembers().size()), true)
|
||||
.addField("Channel Categories", String.valueOf(guild.getCategories().size()), true)
|
||||
.addField("Text Channels", String.valueOf(guild.getTextChannels().size()), true)
|
||||
.addField("Voice Channels", String.valueOf(guild.getVoiceChannels().size()), true)
|
||||
.addField("Verification Level", guild.getVerificationLevel().toString(), true)
|
||||
.addField("Roles", String.valueOf(guild.getRoles().size()), true)
|
||||
.addField("Owner", owner.getName() + "#" + owner.getDiscriminator(), true)
|
||||
.addField("Enlisted", String.valueOf(true), true)
|
||||
.setThumbnail(guild.getIconUrl())
|
||||
.footer("Server Id: " + guild.getId(), guild.getIconUrl())
|
||||
.queue(channel);
|
||||
}
|
||||
}
|
@ -0,0 +1,40 @@
|
||||
package io.rixa.bot.commands.cmds.general;
|
||||
|
||||
import io.rixa.bot.apis.UrbanDictionary;
|
||||
import io.rixa.bot.commands.Command;
|
||||
import io.rixa.bot.commands.handler.CommandType;
|
||||
import io.rixa.bot.commands.perms.RixaPermission;
|
||||
import io.rixa.bot.utils.MessageFactory;
|
||||
import net.dv8tion.jda.core.MessageBuilder;
|
||||
import net.dv8tion.jda.core.entities.Guild;
|
||||
import net.dv8tion.jda.core.entities.Member;
|
||||
import net.dv8tion.jda.core.entities.TextChannel;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.net.URLEncoder;
|
||||
|
||||
public class UrbanDictionaryCommand extends Command {
|
||||
|
||||
public UrbanDictionaryCommand(String command, RixaPermission rixaPermission, String description, CommandType commandType) {
|
||||
super(command, rixaPermission, description, commandType);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(String commandLabel, Guild guild, Member member, TextChannel channel, String[] args) throws IOException {
|
||||
String searchQuery = String.join(" ", args);
|
||||
UrbanDictionary urbanDictionary = null;
|
||||
try {
|
||||
urbanDictionary = new UrbanDictionary(URLEncoder.encode(searchQuery, "UTF-8"));
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
if(urbanDictionary == null || !urbanDictionary.search()) {
|
||||
MessageFactory.create("Search term not found.").setColor(member.getColor()).queue(channel);
|
||||
return;
|
||||
}
|
||||
MessageFactory.create(urbanDictionary.getDefinition()).setAuthor(
|
||||
String.format("Definition: %s", urbanDictionary.getWordToSearch()),
|
||||
"https://s-media-cache-ak0.pinimg.com/originals/f2/aa/37/f2aa3712516cfd0cf6f215301d87a7c2.jpg").setColor(member.getColor()).queue(channel);
|
||||
}
|
||||
}
|
@ -0,0 +1,30 @@
|
||||
package io.rixa.bot.commands.cmds.general;
|
||||
|
||||
import io.rixa.bot.apis.YoutubeSearch;
|
||||
import io.rixa.bot.commands.Command;
|
||||
import io.rixa.bot.commands.handler.CommandType;
|
||||
import io.rixa.bot.commands.perms.RixaPermission;
|
||||
import io.rixa.bot.utils.MessageFactory;
|
||||
import net.dv8tion.jda.core.entities.Guild;
|
||||
import net.dv8tion.jda.core.entities.Member;
|
||||
import net.dv8tion.jda.core.entities.TextChannel;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
public class YoutubeCommand extends Command {
|
||||
|
||||
public YoutubeCommand(String command, RixaPermission rixaPermission, String description, CommandType commandType) {
|
||||
super(command, rixaPermission, description, commandType);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(String commandLabel, Guild guild, Member member, TextChannel channel, String[] args) {
|
||||
String searchQuery = String.join(" ", args);
|
||||
try {
|
||||
YoutubeSearch ytSearch = new YoutubeSearch(searchQuery);
|
||||
channel.sendMessage(ytSearch.getUrl(0)).queue();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,33 @@
|
||||
package io.rixa.bot.commands.cmds.moderator;
|
||||
|
||||
import io.rixa.bot.commands.Command;
|
||||
import io.rixa.bot.commands.handler.CommandType;
|
||||
import io.rixa.bot.commands.perms.RixaPermission;
|
||||
import io.rixa.bot.guild.RixaGuild;
|
||||
import io.rixa.bot.guild.manager.GuildManager;
|
||||
import io.rixa.bot.utils.MessageFactory;
|
||||
import net.dv8tion.jda.core.entities.Guild;
|
||||
import net.dv8tion.jda.core.entities.Member;
|
||||
import net.dv8tion.jda.core.entities.TextChannel;
|
||||
|
||||
public class BanCommand extends Command {
|
||||
|
||||
RixaPermission permission;
|
||||
|
||||
public BanCommand(String command, RixaPermission permission, String description, CommandType commandType) {
|
||||
super(command, permission, description, commandType);
|
||||
this.permission = permission;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(String command, Guild guild, Member member, TextChannel channel, String[] args) {
|
||||
RixaGuild rixaGuild = GuildManager.getInstance().getGuild(guild);
|
||||
if (args.length < 1) {
|
||||
MessageFactory.create(
|
||||
String.format("Incorrect Usage! Example: `%s%s @User`", rixaGuild.getSettings().getPrefix(),
|
||||
command)).setColor(member.getColor()).queue(channel);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,89 @@
|
||||
package io.rixa.bot.commands.cmds.moderator;
|
||||
|
||||
import io.rixa.bot.Rixa;
|
||||
import io.rixa.bot.commands.Command;
|
||||
import io.rixa.bot.commands.handler.CommandType;
|
||||
import io.rixa.bot.commands.perms.RixaPermission;
|
||||
import io.rixa.bot.guild.RixaGuild;
|
||||
import io.rixa.bot.guild.manager.GuildManager;
|
||||
import io.rixa.bot.utils.MessageFactory;
|
||||
import io.rixa.bot.utils.Utils;
|
||||
import java.time.OffsetDateTime;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
import lombok.Getter;
|
||||
import net.dv8tion.jda.core.Permission;
|
||||
import net.dv8tion.jda.core.entities.Guild;
|
||||
import net.dv8tion.jda.core.entities.Member;
|
||||
import net.dv8tion.jda.core.entities.Message;
|
||||
import net.dv8tion.jda.core.entities.TextChannel;
|
||||
import net.dv8tion.jda.core.exceptions.ErrorResponseException;
|
||||
import net.dv8tion.jda.core.exceptions.PermissionException;
|
||||
import net.dv8tion.jda.core.requests.ErrorResponse;
|
||||
|
||||
public class ClearCommand extends Command {
|
||||
|
||||
@Getter
|
||||
private RixaPermission rixaPermission;
|
||||
|
||||
public ClearCommand(String command, RixaPermission rixaPermission, String description, CommandType commandType,
|
||||
List<String> aliases) {
|
||||
super(command, rixaPermission, description, commandType, aliases);
|
||||
this.rixaPermission = rixaPermission;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(String commandLabel, Guild guild, Member member, TextChannel channel,
|
||||
String[] args) {
|
||||
RixaGuild rixaGuild = GuildManager.getInstance().getGuild(guild);
|
||||
if (args == null || args.length == 0 || !Utils.isInteger(args[0])) {
|
||||
MessageFactory.create(
|
||||
String.format("Incorrect Usage! Example: `%s%s 10`", rixaGuild.getSettings().getPrefix(),
|
||||
commandLabel)).setColor(member.getColor()).queue(channel);
|
||||
return;
|
||||
}
|
||||
int amount = Integer.parseInt(args[0]);
|
||||
if (amount < 1 || amount > 100) {
|
||||
MessageFactory.create("Please try a number less than 100 and greater than 1 and :grimacing:")
|
||||
.setColor(member.getColor()).queue(channel);
|
||||
return;
|
||||
}
|
||||
deleteMessages(channel, amount, member);
|
||||
}
|
||||
|
||||
private void deleteMessages(TextChannel channel, int amount, Member member) {
|
||||
channel.getHistory().retrievePast(amount).queue(success -> {
|
||||
List<Message> pinnedMessages = channel.getPinnedMessages().complete();
|
||||
List<Message> newMessages = success.stream()
|
||||
.filter(message -> !pinnedMessages.contains(message) && canDelete(message))
|
||||
.collect(Collectors.toList());
|
||||
try {
|
||||
channel.deleteMessages(newMessages).queue(onSuccess -> {
|
||||
MessageFactory.create(
|
||||
((newMessages.isEmpty()) ? "Could not find any messages to delete"
|
||||
: "Successfully deleted *" + newMessages.size() + "* messages in " + channel.getAsMention()))
|
||||
.footer("Requested by: " + member.getEffectiveName(),
|
||||
member.getUser().getEffectiveAvatarUrl())
|
||||
.setColor(member.getColor())
|
||||
.queue(channel);
|
||||
});
|
||||
} catch (PermissionException ex) {
|
||||
if (ex.getPermission() == Permission.MESSAGE_MANAGE) {
|
||||
MessageFactory.create("I do not have permission to clear messages within this channel!")
|
||||
.queue(channel);
|
||||
}
|
||||
} catch (ErrorResponseException ex) {
|
||||
if (ex.getErrorResponse() == ErrorResponse.UNKNOWN_MESSAGE) {
|
||||
Rixa.getInstance().getLogger().info("Ignored message during clear.");
|
||||
}
|
||||
}
|
||||
}, failure -> MessageFactory
|
||||
.create("I could not retrieve message history! Please forgive me for this. :(")
|
||||
.setColor(member.getColor()).queue(channel));
|
||||
}
|
||||
|
||||
private boolean canDelete(Message message) {
|
||||
return message.getCreationTime().isAfter(OffsetDateTime.now().minusWeeks(2)
|
||||
.plusMinutes(2)); // Pulled from Fredboat
|
||||
}
|
||||
}
|
@ -0,0 +1,113 @@
|
||||
package io.rixa.bot.commands.cmds.moderator;
|
||||
|
||||
import com.dumptruckman.taskmin.Task;
|
||||
import com.dumptruckman.taskmin.TaskManager;
|
||||
import io.rixa.bot.commands.Command;
|
||||
import io.rixa.bot.commands.handler.CommandType;
|
||||
import io.rixa.bot.commands.perms.RixaPermission;
|
||||
import io.rixa.bot.guild.RixaGuild;
|
||||
import io.rixa.bot.guild.manager.GuildManager;
|
||||
import io.rixa.bot.utils.DiscordUtils;
|
||||
import io.rixa.bot.utils.MessageFactory;
|
||||
import io.rixa.bot.utils.Utils;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.temporal.ChronoUnit;
|
||||
import net.dv8tion.jda.core.entities.Guild;
|
||||
import net.dv8tion.jda.core.entities.Member;
|
||||
import net.dv8tion.jda.core.entities.Role;
|
||||
import net.dv8tion.jda.core.entities.TextChannel;
|
||||
import net.dv8tion.jda.core.entities.User;
|
||||
|
||||
public class MuteCommand extends Command {
|
||||
private TaskManager taskManager;
|
||||
|
||||
public MuteCommand(String command, RixaPermission rixaPermission, String description, CommandType commandType) {
|
||||
super(command, rixaPermission, description, commandType);
|
||||
this.taskManager = TaskManager.createBasicTaskManager();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(String commandLabel, Guild guild, Member member, TextChannel channel,
|
||||
String[] args) {
|
||||
RixaGuild rixaGuild = GuildManager.getInstance().getGuild(guild);
|
||||
if (args.length < 2) {
|
||||
MessageFactory.create(String.format
|
||||
("Incorrect Usage! Example: `%s%s <user> <timeFrame> [reason]`",
|
||||
rixaGuild.getSettings().getPrefix(), commandLabel))
|
||||
.setColor(member.getColor())
|
||||
.queue(channel);
|
||||
return;
|
||||
}
|
||||
String argumentString = String.join(" ", args);
|
||||
Object[] objArray = DiscordUtils.memberSearchArray(guild, argumentString, false);
|
||||
if (objArray.length == 0) {
|
||||
MessageFactory.create("Could not find member!").setColor(member.getColor()).queue(channel);
|
||||
return;
|
||||
}
|
||||
String targetMemberName = String.valueOf(objArray[0]);
|
||||
Member targetMember = (Member) objArray[1];
|
||||
if (targetMember == null) {
|
||||
MessageFactory.create("Could not find member!").setColor(member.getColor()).queue(channel);
|
||||
return;
|
||||
}
|
||||
argumentString = argumentString.replaceFirst(targetMemberName, "").trim();
|
||||
args = argumentString.split(" ");
|
||||
if (args.length == 0) {
|
||||
MessageFactory.create(String.format
|
||||
("Incorrect Usage! Example: `%s%s <user> <timeFrame> [reason]`",
|
||||
rixaGuild.getSettings().getPrefix(), commandLabel))
|
||||
.setColor(member.getColor())
|
||||
.queue(channel);
|
||||
return;
|
||||
}
|
||||
String time = args[0].trim();
|
||||
argumentString = String.join(" ", args).replaceFirst(time, "");
|
||||
|
||||
if (argumentString.length() > 255) {
|
||||
MessageFactory.create(
|
||||
"Sorry your `reason` exceeds the maximum character length of 255!")
|
||||
.setColor(member.getColor()).queue(channel);
|
||||
return;
|
||||
}
|
||||
|
||||
long milliseconds = Utils.toMilliSec(time);
|
||||
String reason = argumentString;
|
||||
|
||||
Role muteRole = rixaGuild.getSettings().getMuteRole() == null
|
||||
? DiscordUtils.createMuteRole(guild) : rixaGuild.getSettings().getMuteRole();
|
||||
guild.getController().addRolesToMember(targetMember, muteRole)
|
||||
.queue(onSuccess -> MessageFactory.create(String.format(
|
||||
"Temporarily muted %s for %s\n Reason: %s",
|
||||
this.getUser(targetMember.getUser()),
|
||||
this.getTime(milliseconds),
|
||||
reason))
|
||||
.setColor(member.getColor()).setTimestamp().queue(channel),
|
||||
onFailure -> MessageFactory.create(
|
||||
"Could not successfully mute user `" + targetMember.getUser().getName() + "#"
|
||||
+ targetMember.getUser()
|
||||
.getDiscriminator() + "`. Reason: " + onFailure.getMessage())
|
||||
.setColor(member.getColor()).setTimestamp().queue(channel));
|
||||
this.taskManager
|
||||
.addTask(Task.builder(() ->
|
||||
guild.getController()
|
||||
.removeRolesFromMember(targetMember, rixaGuild.getSettings().getMuteRole()).queue())
|
||||
.executeAt(LocalDateTime.now().plus(milliseconds, ChronoUnit.MILLIS)));
|
||||
}
|
||||
|
||||
private String getTime(long milliseconds) {
|
||||
long seconds, minutes, hours, days;
|
||||
seconds = milliseconds / 1000;
|
||||
minutes = seconds / 60;
|
||||
seconds = seconds % 60;
|
||||
hours = minutes / 60;
|
||||
days = hours / 24;
|
||||
minutes = minutes % 60;
|
||||
|
||||
return (String
|
||||
.format("%s days, %s hours, %s minutes, %s seconds", days, hours, minutes, seconds));
|
||||
}
|
||||
|
||||
private String getUser(User member) {
|
||||
return member.getName() + "#" + member.getDiscriminator();
|
||||
}
|
||||
}
|
@ -0,0 +1,43 @@
|
||||
package io.rixa.bot.commands.cmds.other;
|
||||
|
||||
import io.rixa.bot.Rixa;
|
||||
import io.rixa.bot.commands.Command;
|
||||
import io.rixa.bot.commands.handler.CommandType;
|
||||
import io.rixa.bot.commands.perms.RixaPermission;
|
||||
import io.rixa.bot.guild.RixaGuild;
|
||||
import io.rixa.bot.guild.manager.GuildManager;
|
||||
import io.rixa.bot.utils.MessageFactory;
|
||||
import net.dv8tion.jda.core.entities.Guild;
|
||||
import net.dv8tion.jda.core.entities.Member;
|
||||
import net.dv8tion.jda.core.entities.TextChannel;
|
||||
import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent;
|
||||
|
||||
public class ShutdownCommand extends Command {
|
||||
|
||||
public ShutdownCommand(String command, RixaPermission rixaPermission, String description, CommandType commandType) {
|
||||
super(command, rixaPermission, description, commandType);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(String commandLabel, Guild guild, Member member, TextChannel channel, String[] args) {
|
||||
if (!(Rixa.getInstance().getConfiguration().isBotAdmin(member.getUser().getId()))) {
|
||||
new MessageFactory(member.getAsMention()
|
||||
+ ", you do not have permission for this command.").setColor(member.getColor()).queue(channel);
|
||||
return;
|
||||
}
|
||||
try {
|
||||
MessageFactory.create("Shutting down...").selfDestruct(0).queue(channel);
|
||||
for (RixaGuild rixaGuild : GuildManager.getInstance().getGuilds().values()) {
|
||||
Thread.sleep(50);
|
||||
rixaGuild.save();
|
||||
}
|
||||
Thread.sleep(500);
|
||||
Rixa.getInstance().close();
|
||||
System.exit(0);
|
||||
} catch (InterruptedException ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
|
||||
Rixa.getInstance().close();
|
||||
}
|
||||
}
|
@ -0,0 +1,8 @@
|
||||
package io.rixa.bot.commands.exceptions;
|
||||
|
||||
public class CommandNotFoundException extends Exception {
|
||||
|
||||
public CommandNotFoundException(String message) {
|
||||
super(message);
|
||||
}
|
||||
}
|
@ -0,0 +1,8 @@
|
||||
package io.rixa.bot.commands.exceptions;
|
||||
|
||||
public class ReactNotFoundException extends Exception {
|
||||
|
||||
public ReactNotFoundException(String message) {
|
||||
super(message);
|
||||
}
|
||||
}
|
@ -0,0 +1,38 @@
|
||||
package io.rixa.bot.commands.handler;
|
||||
|
||||
import io.rixa.bot.commands.Command;
|
||||
import io.rixa.bot.commands.exceptions.CommandNotFoundException;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public class CommandHandler {
|
||||
|
||||
private Map<String, Command> commandMap = new HashMap<>();
|
||||
|
||||
|
||||
private void registerCommand(Command command) {
|
||||
if (commandMap.containsKey(command.getCommand())) return;
|
||||
commandMap.put(command.getCommand(), command);
|
||||
}
|
||||
|
||||
public void registerCommands(Command...commands) {
|
||||
for (Command command : commands) {
|
||||
registerCommand(command);
|
||||
}
|
||||
}
|
||||
|
||||
public Command getCommand(String commandName) throws CommandNotFoundException {
|
||||
if (commandMap.containsKey(commandName.toLowerCase())) return commandMap.get(commandName.toLowerCase());
|
||||
for(Command command: commandMap.values()) {
|
||||
if (command.getAliases().contains(commandName)) {
|
||||
return command;
|
||||
}
|
||||
}
|
||||
throw new CommandNotFoundException("Could not find command");
|
||||
}
|
||||
|
||||
public Map<String, Command> getAllCommands() {
|
||||
return this.commandMap;
|
||||
}
|
||||
}
|
@ -0,0 +1,8 @@
|
||||
package io.rixa.bot.commands.handler;
|
||||
|
||||
public enum CommandType {
|
||||
|
||||
STAFF,
|
||||
USER,
|
||||
OWNER;
|
||||
}
|
24
src/main/java/io/rixa/bot/commands/perms/RixaPermission.java
Normal file
24
src/main/java/io/rixa/bot/commands/perms/RixaPermission.java
Normal file
@ -0,0 +1,24 @@
|
||||
package io.rixa.bot.commands.perms;
|
||||
|
||||
public enum RixaPermission {
|
||||
NONE,
|
||||
MUTE,
|
||||
ADD_ROLE,
|
||||
REMOVE_ROLE,
|
||||
CLEAR_CHAT,
|
||||
ACCESS_CONFIG,
|
||||
PM_MESSAGE,
|
||||
KICK_MEMBER,
|
||||
BAN_MEMBER,
|
||||
BATCH_MOVE,
|
||||
TOGGLE_RAIDMODE;
|
||||
|
||||
public static RixaPermission fromString(String string) {
|
||||
for (RixaPermission value : values()) {
|
||||
if (value.toString().equalsIgnoreCase(string)) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
21
src/main/java/io/rixa/bot/data/config/Configuration.java
Normal file
21
src/main/java/io/rixa/bot/data/config/Configuration.java
Normal file
@ -0,0 +1,21 @@
|
||||
package io.rixa.bot.data.config;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public class Configuration {
|
||||
|
||||
@Getter @Setter private Map<String, String> sqlCredentials;
|
||||
@Getter @Setter private List<String> botAdmins;
|
||||
@Getter @Setter private String token, botGame;
|
||||
@Getter @Setter private int shards = 1;
|
||||
|
||||
public Configuration() {}
|
||||
|
||||
public boolean isBotAdmin(String s) {
|
||||
return botAdmins.contains(s);
|
||||
}
|
||||
}
|
72
src/main/java/io/rixa/bot/data/storage/DatabaseAdapter.java
Normal file
72
src/main/java/io/rixa/bot/data/storage/DatabaseAdapter.java
Normal file
@ -0,0 +1,72 @@
|
||||
package io.rixa.bot.data.storage;
|
||||
|
||||
import io.rixa.bot.Rixa;
|
||||
import io.rixa.bot.data.config.Configuration;
|
||||
import io.rixa.bot.data.storage.enums.DatabaseTables;
|
||||
import io.rixa.bot.data.storage.enums.Statements;
|
||||
import org.springframework.dao.DataAccessException;
|
||||
import org.springframework.dao.EmptyResultDataAccessException;
|
||||
import org.springframework.jdbc.core.JdbcTemplate;
|
||||
import org.springframework.jdbc.core.ResultSetExtractor;
|
||||
import org.springframework.jdbc.core.RowCountCallbackHandler;
|
||||
import org.springframework.jdbc.core.RowMapper;
|
||||
import org.springframework.jdbc.datasource.DriverManagerDataSource;
|
||||
|
||||
import java.sql.Array;
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
public class DatabaseAdapter {
|
||||
|
||||
private static DatabaseAdapter instance;
|
||||
private Rixa rixaInstance;
|
||||
private JdbcTemplate jdbcTemplate;
|
||||
private DatabaseAdapter() {
|
||||
instance = this;
|
||||
rixaInstance = Rixa.getInstance();
|
||||
}
|
||||
|
||||
public void check() {
|
||||
if (jdbcTemplate != null) {
|
||||
return;
|
||||
}
|
||||
Configuration config = rixaInstance.getConfiguration();
|
||||
DriverManagerDataSource dataSource = new DriverManagerDataSource();
|
||||
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
|
||||
String url = String.format("jdbc:mysql://%s:%s/%s", config.getSqlCredentials().get("hostName"),
|
||||
config.getSqlCredentials().get("port"), config.getSqlCredentials().get("databaseName"));
|
||||
dataSource.setUrl(url);
|
||||
dataSource.setUsername(config.getSqlCredentials().get("userName"));
|
||||
dataSource.setPassword(config.getSqlCredentials().get("password"));
|
||||
jdbcTemplate = new JdbcTemplate(dataSource);
|
||||
}
|
||||
|
||||
public JdbcTemplate get() {
|
||||
check();
|
||||
return jdbcTemplate;
|
||||
}
|
||||
|
||||
public boolean exists(String table, String key, String value) {
|
||||
try {
|
||||
int amount = get().queryForObject
|
||||
(String.format(Statements.COUNT_CORE.getStatement(), table, key), new Object[]{value}, Integer.class);
|
||||
return amount > 0;
|
||||
} catch (EmptyResultDataAccessException ex) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public Array createArrayOf(String typeName, Object[] elements) {
|
||||
try {
|
||||
return get().getDataSource().getConnection().createArrayOf(typeName, elements);
|
||||
} catch (SQLException ignored) {
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static DatabaseAdapter getInstance() {
|
||||
return ( (instance == null) ? instance = new DatabaseAdapter() : instance );
|
||||
}
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
package me.savvy.rixa.data.database.sql.other;
|
||||
package io.rixa.bot.data.storage.enums;
|
||||
|
||||
public enum DatabaseTables {
|
||||
|
||||
@ -12,7 +12,7 @@ public enum DatabaseTables {
|
||||
" `experience` int(90) NOT NULL\n" +
|
||||
");"),
|
||||
|
||||
MODULES("CREATE TABLE IF NOT EXISTS `modules` (`guild_id` varchar(255) DEFAULT NULL, `levels` tinyint(1) NOT NULL DEFAULT '1', `conversations` tinyint(1) NOT NULL DEFAULT '1');"),
|
||||
MODULES("CREATE TABLE IF NOT EXISTS `modules` (`guild_id` varchar(255) DEFAULT NULL, `levels` tinyint(1) NOT NULL DEFAULT '1', `conversation` tinyint(1) NOT NULL DEFAULT '1');"),
|
||||
|
||||
MUSIC("CREATE TABLE IF NOT EXISTS `music` ( `guild_id` varchar(255) NOT NULL UNIQUE PRIMARY KEY, `music_role` varchar(255) NOT NULL DEFAULT 'default_value'," +
|
||||
" `skip_amount` int(5) NOT NULL DEFAULT '0', `max_playlist_amount` int(5) NOT NULL DEFAULT '100', `enabled` tinyint(1) NOT NULL DEFAULT '0'\n" +
|
40
src/main/java/io/rixa/bot/data/storage/enums/Statements.java
Normal file
40
src/main/java/io/rixa/bot/data/storage/enums/Statements.java
Normal file
@ -0,0 +1,40 @@
|
||||
package io.rixa.bot.data.storage.enums;
|
||||
|
||||
import lombok.Getter;
|
||||
|
||||
public enum Statements {
|
||||
|
||||
/*
|
||||
Select statements
|
||||
*/
|
||||
SELECT_MODULE_STATUS("SELECT `{module_name}` FROM `modules` WHERE `guild_id` = ?"),
|
||||
SELECT_ALL_FROM_TABLE("SELECT * FROM `{table_name}` WHERE `guild_id` = ?"),
|
||||
|
||||
|
||||
/*
|
||||
Insert Statements
|
||||
*/
|
||||
INSERT_CORE("INSERT INTO `core` (`guild_id`, `guild_name`, `description`, `keywords`) VALUES (?, ?, ?, ?)"),
|
||||
|
||||
/*
|
||||
Count Statements
|
||||
*/
|
||||
COUNT_CORE("SELECT COUNT(*) FROM `%s` WHERE `%s` = ?");
|
||||
|
||||
/*
|
||||
Delete Statements
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
Create Table Statements
|
||||
*/
|
||||
|
||||
@Getter private String statement;
|
||||
public String getStatement(String key, String value) {
|
||||
return getStatement().replace(key, value);
|
||||
}
|
||||
Statements(String s) {
|
||||
this.statement = s;
|
||||
}
|
||||
}
|
13
src/main/java/io/rixa/bot/events/BotJoinListener.java
Normal file
13
src/main/java/io/rixa/bot/events/BotJoinListener.java
Normal file
@ -0,0 +1,13 @@
|
||||
package io.rixa.bot.events;
|
||||
|
||||
import io.rixa.bot.guild.manager.GuildManager;
|
||||
import net.dv8tion.jda.core.events.guild.GuildJoinEvent;
|
||||
import net.dv8tion.jda.core.hooks.SubscribeEvent;
|
||||
|
||||
public class BotJoinListener {
|
||||
|
||||
@SubscribeEvent
|
||||
public void onJoin(GuildJoinEvent event) {
|
||||
event.getJDA().getGuilds().forEach(guild -> GuildManager.getInstance().addGuild(guild));
|
||||
}
|
||||
}
|
133
src/main/java/io/rixa/bot/events/MessageListener.java
Normal file
133
src/main/java/io/rixa/bot/events/MessageListener.java
Normal file
@ -0,0 +1,133 @@
|
||||
package io.rixa.bot.events;
|
||||
|
||||
import com.mysql.jdbc.StringUtils;
|
||||
import io.rixa.bot.Rixa;
|
||||
import io.rixa.bot.commands.Command;
|
||||
import io.rixa.bot.commands.exceptions.CommandNotFoundException;
|
||||
import io.rixa.bot.commands.exceptions.ReactNotFoundException;
|
||||
import io.rixa.bot.commands.perms.RixaPermission;
|
||||
import io.rixa.bot.guild.RixaGuild;
|
||||
import io.rixa.bot.guild.manager.GuildManager;
|
||||
import io.rixa.bot.guild.modules.module.ConversationModule;
|
||||
import io.rixa.bot.reactions.React;
|
||||
import io.rixa.bot.user.RixaUser;
|
||||
import io.rixa.bot.user.manager.UserManager;
|
||||
import io.rixa.bot.utils.DiscordUtils;
|
||||
import io.rixa.bot.utils.MessageFactory;
|
||||
import java.io.IOException;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import net.dv8tion.jda.core.entities.Message;
|
||||
import net.dv8tion.jda.core.entities.MessageEmbed;
|
||||
import net.dv8tion.jda.core.entities.TextChannel;
|
||||
import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent;
|
||||
import net.dv8tion.jda.core.events.message.react.MessageReactionAddEvent;
|
||||
import net.dv8tion.jda.core.hooks.SubscribeEvent;
|
||||
|
||||
public class MessageListener {
|
||||
|
||||
@SubscribeEvent
|
||||
public void onReactionAdded(MessageReactionAddEvent event) {
|
||||
System.out.println("Reaction Event Triggered - 1");
|
||||
if (event.getUser().isBot()) {
|
||||
return;
|
||||
}
|
||||
event.getChannel().getMessageById(event.getMessageId()).queue(message -> {
|
||||
React react = this.check(message);
|
||||
if (react != null) {
|
||||
react.onReact(event);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private React check(Message message) {
|
||||
if (message == null || message.getEmbeds().isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
MessageEmbed messageEmbed = message.getEmbeds().get(0);
|
||||
if (StringUtils.isNullOrEmpty(messageEmbed.getTitle())) {
|
||||
return null;
|
||||
}
|
||||
String[] titleSplit = messageEmbed.getTitle().split(": ");
|
||||
if (titleSplit[0].equalsIgnoreCase("Leaderboard")) {
|
||||
return null; // Not sure if this is required anymore.
|
||||
}
|
||||
try {
|
||||
React react = Rixa.getInstance().getReactManager().getReaction(titleSplit[0]);
|
||||
if (react != null) {
|
||||
return react;
|
||||
}
|
||||
} catch (ReactNotFoundException ignored) {
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public void onMessage(GuildMessageReceivedEvent event) {
|
||||
if (event.getAuthor().isBot()) {
|
||||
return;
|
||||
}
|
||||
String message = event.getMessage().getContentRaw().trim();
|
||||
RixaGuild rixaGuild = GuildManager.getInstance().getGuild(event.getGuild());
|
||||
if (event.getMessage().getContentDisplay()
|
||||
.startsWith("@" + event.getGuild().getSelfMember().getEffectiveName())) {
|
||||
String chat = event.getMessage().getContentDisplay();
|
||||
chatter(rixaGuild, event.getChannel(),
|
||||
chat.replace("@" + event.getGuild().getSelfMember().getEffectiveName(), ""));
|
||||
return;
|
||||
}
|
||||
String prefix = rixaGuild.getSettings().getPrefix();
|
||||
if (message.startsWith(prefix)) {
|
||||
String[] msgArgs = message.split(" ");
|
||||
String commandName = (message.contains(" ") ? msgArgs[0] : message);
|
||||
String[] args = new String[msgArgs.length - 1];
|
||||
System.arraycopy(msgArgs, 1, args, 0, msgArgs.length - 1);
|
||||
command(commandName, prefix, event, args);
|
||||
return;
|
||||
}
|
||||
RixaUser rixaUser = UserManager.getInstance().getUser(event.getAuthor());
|
||||
if (rixaUser.awardIfCan(event.getGuild())) {
|
||||
int level = DiscordUtils.getLevelFromExperience(rixaUser.getLevels(rixaGuild.getId()));
|
||||
MessageFactory
|
||||
.create(event.getAuthor().getAsMention() + " has leveled up to **level " + level + "**!")
|
||||
.setTimestamp()
|
||||
.setColor(event.getMember().getColor())
|
||||
.setAuthor("Leveled Up!", null, event.getAuthor().getAvatarUrl())
|
||||
.footer("Rixa Levels", event.getJDA().getSelfUser().getAvatarUrl())
|
||||
.queue(event.getChannel());
|
||||
}
|
||||
}
|
||||
|
||||
private void command(String commandName, String prefix, GuildMessageReceivedEvent event,
|
||||
String[] args) {
|
||||
commandName = commandName.replaceFirst(prefix, "");
|
||||
try {
|
||||
Command command = Rixa.getInstance().getCommandHandler().getCommand(commandName);
|
||||
//command.execute(event);
|
||||
event.getMessage().delete().queueAfter(3, TimeUnit.SECONDS);
|
||||
RixaGuild rixaGuild = GuildManager.getInstance().getGuild(event.getGuild());
|
||||
if (!event.getGuild().getOwner().getUser().getId().equalsIgnoreCase(event.getAuthor().getId())
|
||||
&& command.getPermission() != null && command.getPermission() != RixaPermission.NONE &&
|
||||
(!rixaGuild.hasPermission(event.getMember().getUser(), command.getPermission()))
|
||||
&& (!Rixa.getInstance().getConfiguration().isBotAdmin(event.getAuthor().getId()))) {
|
||||
MessageFactory.create("Sorry! You do not have permission for this command!")
|
||||
.setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
return;
|
||||
}
|
||||
command.execute(commandName, event.getGuild(), event.getMember(), event.getChannel(), args);
|
||||
} catch (CommandNotFoundException | IOException ignored) {
|
||||
}
|
||||
}
|
||||
|
||||
private void chatter(RixaGuild rixaGuild, TextChannel channel, String message) {
|
||||
ConversationModule conversationModule = (ConversationModule) rixaGuild
|
||||
.getModule("Conversation");
|
||||
if (!conversationModule.isEnabled()) {
|
||||
return;
|
||||
}
|
||||
try {
|
||||
MessageFactory.create(conversationModule.getChatBotSession().think(message)).selfDestruct(0)
|
||||
.queue(channel);
|
||||
} catch (Exception ignored) {
|
||||
}
|
||||
}
|
||||
}
|
31
src/main/java/io/rixa/bot/events/ReadyListener.java
Normal file
31
src/main/java/io/rixa/bot/events/ReadyListener.java
Normal file
@ -0,0 +1,31 @@
|
||||
package io.rixa.bot.events;
|
||||
|
||||
import io.rixa.bot.guild.manager.GuildManager;
|
||||
import io.rixa.bot.user.RixaUser;
|
||||
import io.rixa.bot.user.manager.UserManager;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.ScheduledExecutorService;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import net.dv8tion.jda.core.events.ReadyEvent;
|
||||
import net.dv8tion.jda.core.hooks.SubscribeEvent;
|
||||
|
||||
public class ReadyListener {
|
||||
|
||||
private ScheduledExecutorService scheduler;
|
||||
|
||||
public ReadyListener() {
|
||||
this.scheduler = Executors.newSingleThreadScheduledExecutor();
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public void onReady(ReadyEvent event) {
|
||||
if (event.getJDA().getGuilds().size() == 0) {
|
||||
return;
|
||||
}
|
||||
this.scheduler.scheduleWithFixedDelay(() -> {
|
||||
event.getJDA().getGuilds().forEach(guild ->
|
||||
GuildManager.getInstance().addGuild(guild).getModule("Levels").reload());
|
||||
UserManager.getInstance().getUserMap().values().forEach(RixaUser::save);
|
||||
}, 0, 5, TimeUnit.MINUTES);
|
||||
}
|
||||
}
|
101
src/main/java/io/rixa/bot/events/UserListener.java
Normal file
101
src/main/java/io/rixa/bot/events/UserListener.java
Normal file
@ -0,0 +1,101 @@
|
||||
package io.rixa.bot.events;
|
||||
|
||||
import io.rixa.bot.Rixa;
|
||||
import io.rixa.bot.guild.RixaGuild;
|
||||
import io.rixa.bot.guild.manager.GuildManager;
|
||||
import io.rixa.bot.utils.MessageFactory;
|
||||
import net.dv8tion.jda.core.JDA;
|
||||
import net.dv8tion.jda.core.entities.Guild;
|
||||
import net.dv8tion.jda.core.entities.Message;
|
||||
import net.dv8tion.jda.core.entities.MessageEmbed;
|
||||
import net.dv8tion.jda.core.events.guild.member.GuildMemberJoinEvent;
|
||||
import net.dv8tion.jda.core.events.guild.member.GuildMemberLeaveEvent;
|
||||
import net.dv8tion.jda.core.events.message.priv.react.PrivateMessageReactionAddEvent;
|
||||
import net.dv8tion.jda.core.hooks.SubscribeEvent;
|
||||
|
||||
public class UserListener {
|
||||
|
||||
@SubscribeEvent
|
||||
public void onJoin(GuildMemberJoinEvent event) {
|
||||
RixaGuild rixaGuild = GuildManager.getInstance().getGuild(event.getGuild());
|
||||
if (!rixaGuild.getSettings().getJoinMessage().equalsIgnoreCase("default_value")
|
||||
&& rixaGuild.getSettings().getGreetings() != null) {
|
||||
MessageFactory.create(rixaGuild.getSettings().getJoinMessage()
|
||||
.replace("%guild%", event.getGuild().getName())
|
||||
.replace("%user%", event.getUser().getName())
|
||||
.replace("%joinPosition%", String.valueOf(event.getGuild().getMembers().size())))
|
||||
.selfDestruct(0).queue(rixaGuild.getSettings().getGreetings());
|
||||
}
|
||||
if (!rixaGuild.getSettings().isJoinVerification()) {
|
||||
if (rixaGuild.getSettings().getDefaultRole() != null) {
|
||||
event.getGuild().getController()
|
||||
.addRolesToMember(event.getMember(), rixaGuild.getSettings().getDefaultRole()).queue();
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (!rixaGuild.getConfirmationUsers().contains(event.getUser().getId())) {
|
||||
rixaGuild.getConfirmationUsers().add(event.getUser().getId());
|
||||
}
|
||||
MessageFactory.create(rixaGuild.getSettings().getJoinPrivateMessage()
|
||||
.replace("%guild%", event.getGuild().getName())
|
||||
.replace("%user%", event.getUser().getName())
|
||||
.replace("%joinPosition%", String.valueOf(event.getGuild().getMembers().size())))
|
||||
.selfDestruct(0).send(event.getUser(), success ->
|
||||
success.addReaction("\uD83D\uDC4D").queue(s ->
|
||||
success.addReaction("\uD83D\uDC4E").queue()));
|
||||
} // 👍
|
||||
|
||||
@SubscribeEvent
|
||||
public void onAddReactionPM(PrivateMessageReactionAddEvent event) {
|
||||
if (event.getUser().isBot()) {
|
||||
return;
|
||||
}
|
||||
String messageId = event.getMessageId();
|
||||
Message message = event.getChannel().getMessageById(messageId).complete();
|
||||
if (message == null || message.getEmbeds().size() == 0) {
|
||||
return;
|
||||
}
|
||||
if (!event.getReaction().getReactionEmote().getName().contains("\uD83D\uDC4D") &&
|
||||
!event.getReaction().getReactionEmote().getName().contains("\uD83D\uDC4E")) {
|
||||
return;
|
||||
}
|
||||
// Add check to see if reaction added is a thumbs up or down
|
||||
MessageEmbed messageEmbed = message.getEmbeds().get(0);
|
||||
if (messageEmbed.getFooter() == null || messageEmbed.getFooter().getText().isEmpty()) {
|
||||
return;
|
||||
}
|
||||
String guildId = messageEmbed.getFooter().getText();
|
||||
Guild guild = null;
|
||||
for (JDA jda : Rixa.getInstance().getShardList()) {
|
||||
if (jda.getGuildById(guildId) != null) {
|
||||
guild = jda.getGuildById(guildId);
|
||||
}
|
||||
}
|
||||
if (guild == null) {
|
||||
return;
|
||||
}
|
||||
RixaGuild rixaGuild = GuildManager.getInstance().getGuild(guild);
|
||||
if (!rixaGuild.getConfirmationUsers().contains(event.getUser().getId())) {
|
||||
return;
|
||||
}
|
||||
rixaGuild.getConfirmationUsers().remove(event.getUser().getId());
|
||||
guild.getController().addRolesToMember(
|
||||
guild.getMember(event.getUser()), rixaGuild.getSettings().getDefaultRole()).queue();
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public void onQuit(GuildMemberLeaveEvent event) {
|
||||
RixaGuild rixaGuild = GuildManager.getInstance().getGuild(event.getGuild());
|
||||
if (rixaGuild.getConfirmationUsers().contains(event.getUser().getId())) {
|
||||
rixaGuild.getConfirmationUsers().remove(event.getUser().getId());
|
||||
}
|
||||
if (!rixaGuild.getSettings().getJoinMessage().equalsIgnoreCase("default_value") &&
|
||||
rixaGuild.getSettings().getFarewell() != null) {
|
||||
MessageFactory.create(rixaGuild.getSettings().getQuitMessage()
|
||||
.replace("%guild%", event.getGuild().getName())
|
||||
.replace("%user%", event.getUser().getName())
|
||||
.replace("%joinPosition%", String.valueOf(event.getGuild().getMembers().size())))
|
||||
.selfDestruct(0).queue(rixaGuild.getSettings().getFarewell());
|
||||
}
|
||||
}
|
||||
}
|
131
src/main/java/io/rixa/bot/guild/RixaGuild.java
Normal file
131
src/main/java/io/rixa/bot/guild/RixaGuild.java
Normal file
@ -0,0 +1,131 @@
|
||||
package io.rixa.bot.guild;
|
||||
|
||||
import io.rixa.bot.commands.perms.RixaPermission;
|
||||
import io.rixa.bot.data.storage.DatabaseAdapter;
|
||||
import io.rixa.bot.guild.manager.IGuild;
|
||||
import io.rixa.bot.guild.modules.RixaModule;
|
||||
import io.rixa.bot.guild.modules.module.ConversationModule;
|
||||
import io.rixa.bot.guild.modules.module.LevelsModule;
|
||||
import io.rixa.bot.guild.modules.module.MusicModule;
|
||||
import io.rixa.bot.guild.settings.Settings;
|
||||
import io.rixa.bot.user.manager.UserManager;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import net.dv8tion.jda.core.entities.Guild;
|
||||
import net.dv8tion.jda.core.entities.Member;
|
||||
import net.dv8tion.jda.core.entities.User;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class RixaGuild implements IGuild {
|
||||
|
||||
@Getter private final Map<String, RixaModule> modules;
|
||||
@Getter private List<String> confirmationUsers;
|
||||
@Getter @Setter private List<String> keywords;
|
||||
@Getter @Setter private String description;
|
||||
@Getter private Map<String, List<RixaPermission>> permissionMap;
|
||||
@Getter private final String id;
|
||||
@Getter private Guild guild;
|
||||
@Getter private Settings settings;
|
||||
|
||||
public RixaGuild(Guild guild) {
|
||||
this.guild = guild;
|
||||
id = guild.getId();
|
||||
modules = new HashMap<>();
|
||||
keywords = new ArrayList<>();
|
||||
confirmationUsers = new ArrayList<>();
|
||||
permissionMap = new HashMap<>();
|
||||
load();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void load() {
|
||||
settings = new Settings(this);
|
||||
if (!(DatabaseAdapter.getInstance().exists("modules", "guild_id", guild.getId()))) {
|
||||
DatabaseAdapter.getInstance().get().update
|
||||
("INSERT INTO `modules` (`guild_id`, `levels`, `conversation`) VALUES (?, ?, ?);",
|
||||
guild.getId(), false, true);
|
||||
}
|
||||
registerModules(
|
||||
new ConversationModule("conversation", "Have a conversation with Rixa!", this),
|
||||
new MusicModule("music", "Listen to music from within discord!", this),
|
||||
new LevelsModule("levels", "Levels for your discord server", this)
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void save() {
|
||||
modules.values().forEach(RixaModule::save);
|
||||
settings.save();
|
||||
|
||||
permissionMap.keySet().forEach(object -> {
|
||||
List<RixaPermission> permissions = permissionMap.get(object);
|
||||
List<String> permission = new ArrayList<>();
|
||||
Arrays.stream(RixaPermission.values()).forEach(stringPermission ->
|
||||
permission.add("`" + stringPermission.toString() + "`=" +
|
||||
(permissions.contains(stringPermission) ? "'1'" : "'0'")));
|
||||
DatabaseAdapter.getInstance().get().update(
|
||||
"UPDATE `permissions` SET " + String.join(", " + permission) +
|
||||
" WHERE `guild_id` = ? AND `object_id` = ?",
|
||||
guild.getId(), object);
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public RixaModule getModule(String id) {
|
||||
return modules.get(id.toLowerCase());
|
||||
}
|
||||
|
||||
private void registerModules(RixaModule... modules) {
|
||||
for (RixaModule module : modules) {
|
||||
registerModule(module);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public RixaModule registerModule(RixaModule module) {
|
||||
if (!(isRegistered(module.getName()))) modules.put(module.getName(), module);
|
||||
return module;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isRegistered(String id) {
|
||||
return modules.containsKey(id.toLowerCase());
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasPermission(User user, RixaPermission permission) {
|
||||
Member member = guild.getMember(user);
|
||||
if (member == null) return false;
|
||||
if (!member.getRoles().stream().filter(role -> (permissionMap.containsKey(role.getId()) &&
|
||||
permissionMap.get(role.getId()).contains(permission)))
|
||||
.collect(Collectors.toList()).isEmpty()) {
|
||||
return true;
|
||||
}
|
||||
return UserManager.getInstance().getUser
|
||||
(user).hasPermission(guild.getId(), permission);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addPermission(String roleId, RixaPermission rixaPermission) {
|
||||
if (!permissionMap.containsKey(roleId)) {
|
||||
permissionMap.put(roleId, Collections.singletonList(rixaPermission));
|
||||
return;
|
||||
}
|
||||
List<RixaPermission> permissionsList = permissionMap.get(roleId);
|
||||
if (permissionsList.contains(rixaPermission)) return;
|
||||
permissionsList.add(rixaPermission);
|
||||
permissionMap.replace(roleId, permissionsList);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removePermission(String roleId, RixaPermission rixaPermission) {
|
||||
if (!permissionMap.containsKey(roleId)) return;
|
||||
List<RixaPermission> permissionsList = permissionMap.get(roleId);
|
||||
if (!permissionsList.contains(rixaPermission)) return;
|
||||
permissionsList.remove(rixaPermission);
|
||||
permissionMap.replace(roleId, permissionsList);
|
||||
}
|
||||
}
|
@ -0,0 +1,7 @@
|
||||
package io.rixa.bot.guild.enums;
|
||||
|
||||
public enum PermissionType {
|
||||
|
||||
USER,
|
||||
GUILD
|
||||
}
|
61
src/main/java/io/rixa/bot/guild/manager/GuildManager.java
Normal file
61
src/main/java/io/rixa/bot/guild/manager/GuildManager.java
Normal file
@ -0,0 +1,61 @@
|
||||
package io.rixa.bot.guild.manager;
|
||||
|
||||
import io.rixa.bot.data.storage.DatabaseAdapter;
|
||||
import io.rixa.bot.data.storage.enums.Statements;
|
||||
import io.rixa.bot.guild.RixaGuild;
|
||||
import io.rixa.bot.guild.mapper.GuildMapper;
|
||||
import net.dv8tion.jda.core.entities.Guild;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public class GuildManager {
|
||||
|
||||
private Map<String, RixaGuild> rixaGuildMap = new HashMap<>();
|
||||
|
||||
private GuildManager() {
|
||||
instance = this;
|
||||
}
|
||||
private static GuildManager instance;
|
||||
|
||||
public static GuildManager getInstance() {
|
||||
return (instance == null) ? new GuildManager() : instance;
|
||||
}
|
||||
|
||||
public RixaGuild getGuild(Guild guild) {
|
||||
if (!hasGuild(guild.getId())) {
|
||||
return addGuild(guild);
|
||||
}
|
||||
return rixaGuildMap.get(guild.getId());
|
||||
}
|
||||
|
||||
public RixaGuild getGuild(String id) {
|
||||
return rixaGuildMap.get(id);
|
||||
}
|
||||
|
||||
public boolean hasGuild(String id) {
|
||||
return rixaGuildMap.containsKey(id);
|
||||
}
|
||||
|
||||
public RixaGuild addGuild(Guild guild) {
|
||||
if (hasGuild(guild.getId())) return rixaGuildMap.get(guild.getId());
|
||||
if (!(DatabaseAdapter.getInstance().exists("core", "guild_id", guild.getId()))) {
|
||||
insert(guild);
|
||||
}
|
||||
RixaGuild rixaGuild = new RixaGuild(guild);
|
||||
rixaGuildMap.put(guild.getId(), rixaGuild);
|
||||
DatabaseAdapter.getInstance().get().queryForObject(
|
||||
Statements.SELECT_ALL_FROM_TABLE.getStatement("{table_name}", "core"), new Object[] { guild.getId() }, new GuildMapper());
|
||||
return rixaGuild;
|
||||
}
|
||||
|
||||
private void insert(Guild guild) {
|
||||
DatabaseAdapter.getInstance().get().update
|
||||
(Statements.INSERT_CORE.getStatement(),
|
||||
guild.getId(), guild.getName(), "Description not set.", "No Keywords Found ");
|
||||
}
|
||||
|
||||
public Map<String, RixaGuild> getGuilds() {
|
||||
return rixaGuildMap;
|
||||
}
|
||||
}
|
24
src/main/java/io/rixa/bot/guild/manager/IGuild.java
Normal file
24
src/main/java/io/rixa/bot/guild/manager/IGuild.java
Normal file
@ -0,0 +1,24 @@
|
||||
package io.rixa.bot.guild.manager;
|
||||
|
||||
import io.rixa.bot.commands.perms.RixaPermission;
|
||||
import io.rixa.bot.guild.modules.RixaModule;
|
||||
import net.dv8tion.jda.core.entities.User;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface IGuild {
|
||||
|
||||
String getId();
|
||||
void load();
|
||||
void save();
|
||||
RixaModule getModule(String id);
|
||||
RixaModule registerModule(RixaModule module);
|
||||
boolean isRegistered(String id);
|
||||
void setDescription(String description);
|
||||
void setKeywords(List<String> keywords);
|
||||
|
||||
boolean hasPermission(User user, RixaPermission permission);
|
||||
|
||||
void addPermission(String guildId, RixaPermission permission);
|
||||
void removePermission(String guildId, RixaPermission rixaPermission);
|
||||
}
|
@ -0,0 +1,9 @@
|
||||
package io.rixa.bot.guild.manager;
|
||||
|
||||
public interface RixaSettings {
|
||||
|
||||
String getPrefix();
|
||||
|
||||
void load();
|
||||
void save();
|
||||
}
|
29
src/main/java/io/rixa/bot/guild/mapper/GuildMapper.java
Normal file
29
src/main/java/io/rixa/bot/guild/mapper/GuildMapper.java
Normal file
@ -0,0 +1,29 @@
|
||||
package io.rixa.bot.guild.mapper;
|
||||
|
||||
import io.rixa.bot.guild.manager.GuildManager;
|
||||
import io.rixa.bot.guild.manager.IGuild;
|
||||
import org.springframework.jdbc.core.RowMapper;
|
||||
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
public class GuildMapper implements RowMapper<IGuild> {
|
||||
|
||||
@Override
|
||||
public IGuild mapRow(ResultSet resultSet, int i) throws SQLException {
|
||||
IGuild guild = GuildManager.getInstance().getGuild(resultSet.getString("guild_id"));
|
||||
/*System.out.println("Keywords: " + resultSet.getArray("keywords"));
|
||||
System.out.println("Keywords 2: " + resultSet.getArray("keywords").getArray());*/
|
||||
String description = resultSet.getString("description");
|
||||
String keyWords = resultSet.getString("keywords");
|
||||
List<String> keywords = (!keyWords.contains(",") ||
|
||||
keyWords.equalsIgnoreCase("No keywords found")) ? Collections.singletonList(keyWords) :
|
||||
Arrays.asList(keyWords.split(":"));
|
||||
guild.setDescription(description);
|
||||
guild.setKeywords(keywords);
|
||||
return guild;
|
||||
}
|
||||
}
|
@ -1,19 +1,15 @@
|
||||
package me.savvy.rixa.modules;
|
||||
package io.rixa.bot.guild.modules;
|
||||
|
||||
import io.rixa.bot.guild.RixaGuild;
|
||||
|
||||
/**
|
||||
* Created by Timber on 5/23/2017.
|
||||
*/
|
||||
public interface RixaModule {
|
||||
|
||||
String getName();
|
||||
|
||||
String getDescription();
|
||||
|
||||
boolean isEnabled();
|
||||
|
||||
void load();
|
||||
|
||||
void setEnabled(boolean b);
|
||||
|
||||
void load();
|
||||
void save();
|
||||
void reload();
|
||||
RixaGuild getGuild();
|
||||
}
|
@ -0,0 +1,56 @@
|
||||
package io.rixa.bot.guild.modules.module;
|
||||
|
||||
import com.google.code.chatterbotapi.ChatterBot;
|
||||
import com.google.code.chatterbotapi.ChatterBotFactory;
|
||||
import com.google.code.chatterbotapi.ChatterBotSession;
|
||||
import com.google.code.chatterbotapi.ChatterBotType;
|
||||
import io.rixa.bot.data.storage.DatabaseAdapter;
|
||||
import io.rixa.bot.data.storage.enums.Statements;
|
||||
import io.rixa.bot.guild.RixaGuild;
|
||||
import io.rixa.bot.guild.modules.RixaModule;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
public class ConversationModule implements RixaModule {
|
||||
|
||||
@Getter private ChatterBotFactory factory;
|
||||
@Getter private ChatterBotSession chatBotSession;
|
||||
@Getter private ChatterBot chatBot;
|
||||
@Getter private String name, description;
|
||||
@Getter private RixaGuild guild;
|
||||
@Getter @Setter boolean enabled;
|
||||
|
||||
public ConversationModule(String name, String description, RixaGuild guild) {
|
||||
this.name = name;
|
||||
this.description = description;
|
||||
this.enabled = true;
|
||||
this.guild = guild;
|
||||
load();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void load() {
|
||||
setEnabled(DatabaseAdapter.getInstance().get().queryForObject
|
||||
(Statements.SELECT_MODULE_STATUS.getStatement("{module_name}", getName()),
|
||||
new Object[]{guild.getId()}, (resultSet, i) -> resultSet.getBoolean(getName())));
|
||||
reload();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void save() {
|
||||
// Check & Set if enabled;
|
||||
DatabaseAdapter.getInstance().get().update("UPDATE `modules` SET `" + name + "` = ? WHERE `guild_id` = ?;", enabled, guild.getId());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void reload() {
|
||||
if (!isEnabled()) return;
|
||||
try {
|
||||
factory = new ChatterBotFactory();
|
||||
chatBot = factory.create(ChatterBotType.PANDORABOTS, "b0dafd24ee35a477");
|
||||
chatBotSession = chatBot.createSession();
|
||||
} catch(Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,76 @@
|
||||
package io.rixa.bot.guild.modules.module;
|
||||
|
||||
import io.rixa.bot.data.storage.DatabaseAdapter;
|
||||
import io.rixa.bot.data.storage.enums.Statements;
|
||||
import io.rixa.bot.guild.RixaGuild;
|
||||
import io.rixa.bot.guild.modules.RixaModule;
|
||||
import io.rixa.bot.pagination.ObjectPagination;
|
||||
import io.rixa.bot.user.RixaUser;
|
||||
import io.rixa.bot.user.manager.UserManager;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
public class LevelsModule implements RixaModule {
|
||||
|
||||
@Getter
|
||||
private String name, description;
|
||||
@Getter
|
||||
@Setter
|
||||
boolean enabled;
|
||||
@Getter
|
||||
private RixaGuild guild;
|
||||
@Getter
|
||||
private ObjectPagination objectPagination;
|
||||
|
||||
public LevelsModule(String name, String description, RixaGuild rixaGuild) {
|
||||
this.name = name;
|
||||
this.description = description;
|
||||
this.guild = rixaGuild;
|
||||
load();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void load() {
|
||||
// SELECT * FROM `levels` ORDER BY `experience` DESC LIMIT 100, 50;
|
||||
setEnabled(DatabaseAdapter.getInstance().get().queryForObject
|
||||
(Statements.SELECT_MODULE_STATUS.getStatement("{module_name}", getName()),
|
||||
new Object[]{guild.getId()}, (resultSet, i) -> resultSet.getBoolean(getName())));
|
||||
reload();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void save() {
|
||||
DatabaseAdapter.getInstance().get().update("UPDATE `modules` SET `" + name + "` = ? WHERE `guild_id` = ?;", enabled, guild.getId());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void reload() {
|
||||
if (!isEnabled()) return;
|
||||
UserManager.getInstance().getUserMap().values().forEach(RixaUser::save);
|
||||
int count = DatabaseAdapter.getInstance().get().queryForObject
|
||||
("SELECT COUNT(*) FROM `levels`", Integer.class);
|
||||
if (count == 0) {
|
||||
objectPagination = new ObjectPagination(Collections.emptyList(), 10);
|
||||
return;
|
||||
}
|
||||
List<Object> expList = DatabaseAdapter.getInstance().get().queryForObject
|
||||
(Statements.SELECT_ALL_FROM_TABLE.getStatement("{table_name}", "levels"),
|
||||
new Object[]{guild.getId()}, (resultSet, i) -> {
|
||||
List<Object> list = new ArrayList<>();
|
||||
resultSet.beforeFirst();
|
||||
while (resultSet.next()) {
|
||||
list.add(resultSet.getString("user_id") + ":" +
|
||||
resultSet.getInt("experience"));
|
||||
}
|
||||
return list;
|
||||
});
|
||||
if (objectPagination == null)
|
||||
objectPagination = new ObjectPagination(expList, 10);
|
||||
else
|
||||
objectPagination.updateList(expList);
|
||||
}
|
||||
}
|
@ -0,0 +1,69 @@
|
||||
package io.rixa.bot.guild.modules.module;
|
||||
|
||||
import io.rixa.bot.Rixa;
|
||||
import io.rixa.bot.data.storage.DatabaseAdapter;
|
||||
import io.rixa.bot.data.storage.enums.Statements;
|
||||
import io.rixa.bot.guild.RixaGuild;
|
||||
import io.rixa.bot.guild.manager.GuildManager;
|
||||
import io.rixa.bot.guild.modules.RixaModule;
|
||||
import io.rixa.bot.guild.modules.module.music.MusicManager;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import net.dv8tion.jda.core.entities.Role;
|
||||
|
||||
import java.util.concurrent.ExecutorService;
|
||||
|
||||
public class MusicModule implements RixaModule {
|
||||
|
||||
@Getter private String name, description;
|
||||
@Getter @Setter private Role musicRole;
|
||||
@Getter @Setter boolean enabled;
|
||||
@Getter @Setter private MusicManager musicManager;
|
||||
@Getter private RixaGuild guild;
|
||||
|
||||
public MusicModule(String name, String description, RixaGuild guild) {
|
||||
this.name = name;
|
||||
this.description = description;
|
||||
this.enabled = true;
|
||||
this.guild = guild;
|
||||
load();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void load() {
|
||||
if (!(DatabaseAdapter.getInstance().exists("music", "guild_id", guild.getId()))) {
|
||||
insert();
|
||||
this.enabled = false;
|
||||
return;
|
||||
}
|
||||
setEnabled(DatabaseAdapter.getInstance().get().queryForObject("SELECT `enabled` FROM `music` WHERE `guild_id` = ?",
|
||||
new Object[]{guild.getId()}, (resultSet, i) -> resultSet.getBoolean("enabled")));
|
||||
reload();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void save() {
|
||||
// Check & Set if enabled;
|
||||
DatabaseAdapter.getInstance().get().update("UPDATE `music` SET `enabled` = ? WHERE `guild_id` = ?", enabled, guild.getId());
|
||||
if (musicRole != null)
|
||||
DatabaseAdapter.getInstance().get().update("UPDATE `music` SET `music_role` = ? WHERE `guild_id` = ?", musicRole.getId(), guild.getId());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void reload() {
|
||||
if (!isEnabled()) return;
|
||||
DatabaseAdapter.getInstance().get().queryForObject(Statements.SELECT_ALL_FROM_TABLE.getStatement("{table_name}", "music"),
|
||||
new Object[] { guild.getId() }, (resultSet, i) -> {
|
||||
if (!resultSet.getString("music_role").equalsIgnoreCase("default_value")
|
||||
&& guild.getGuild().getRoleById(resultSet.getString("music_role")) != null) {
|
||||
this.musicRole = guild.getGuild().getRoleById(resultSet.getString("music_role"));
|
||||
}
|
||||
return 0;
|
||||
});
|
||||
}
|
||||
|
||||
private void insert() {
|
||||
DatabaseAdapter.getInstance().get().update("INSERT INTO `music` (`guild_id`, `music_role`, `enabled`) VALUES (?, ?, ?);",
|
||||
guild.getId(), "default_value", false);
|
||||
}
|
||||
}
|
@ -1,14 +1,12 @@
|
||||
package me.savvy.rixa.modules.music;
|
||||
package io.rixa.bot.guild.modules.module.music;
|
||||
|
||||
import com.sedmelluq.discord.lavaplayer.player.AudioPlayer;
|
||||
import com.sedmelluq.discord.lavaplayer.track.playback.AudioFrame;
|
||||
import lombok.Getter;
|
||||
import net.dv8tion.jda.core.audio.AudioSendHandler;
|
||||
|
||||
/**
|
||||
* Created by Timber on 3/13/2017.
|
||||
*/
|
||||
public class AudioPlayerSendHandler implements AudioSendHandler {
|
||||
private final AudioPlayer audioPlayer;
|
||||
@Getter private final AudioPlayer audioPlayer;
|
||||
private AudioFrame lastFrame;
|
||||
|
||||
/**
|
||||
@ -27,8 +25,7 @@ public class AudioPlayerSendHandler implements AudioSendHandler {
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] provide20MsAudio()
|
||||
{
|
||||
public byte[] provide20MsAudio() {
|
||||
if (lastFrame == null)
|
||||
{
|
||||
lastFrame = audioPlayer.provide();
|
||||
@ -41,8 +38,7 @@ public class AudioPlayerSendHandler implements AudioSendHandler {
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isOpus()
|
||||
{
|
||||
public boolean isOpus() {
|
||||
return true;
|
||||
}
|
||||
}
|
@ -1,24 +1,22 @@
|
||||
package me.savvy.rixa.modules.music;
|
||||
package io.rixa.bot.guild.modules.module.music;
|
||||
|
||||
import com.sedmelluq.discord.lavaplayer.player.AudioPlayer;
|
||||
import com.sedmelluq.discord.lavaplayer.player.AudioPlayerManager;
|
||||
import lombok.Getter;
|
||||
|
||||
/**
|
||||
* Created by Timber on 3/13/2017.
|
||||
*/
|
||||
public class MusicManager {
|
||||
/**
|
||||
* Audio player for the guild.
|
||||
*/
|
||||
public final AudioPlayer player;
|
||||
@Getter private final AudioPlayer player;
|
||||
/**
|
||||
* Track scheduler for the player.
|
||||
*/
|
||||
public final TrackScheduler scheduler;
|
||||
@Getter private final TrackScheduler scheduler;
|
||||
/**
|
||||
* Wrapper around AudioPlayer to use it as an AudioSendHandler.
|
||||
*/
|
||||
public final AudioPlayerSendHandler sendHandler;
|
||||
@Getter private final AudioPlayerSendHandler sendHandler;
|
||||
|
||||
/**
|
||||
* Creates a player and a track scheduler.
|
@ -0,0 +1,80 @@
|
||||
package io.rixa.bot.guild.modules.module.music;
|
||||
|
||||
import com.sedmelluq.discord.lavaplayer.player.AudioPlayer;
|
||||
import com.sedmelluq.discord.lavaplayer.player.event.AudioEventAdapter;
|
||||
import com.sedmelluq.discord.lavaplayer.track.AudioTrack;
|
||||
import com.sedmelluq.discord.lavaplayer.track.AudioTrackEndReason;
|
||||
import io.rixa.bot.pagination.Pagination;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Queue;
|
||||
|
||||
public class TrackScheduler extends AudioEventAdapter {
|
||||
@Getter @Setter private boolean repeating = false, playlistRepeat = false;
|
||||
@Getter private final AudioPlayer player;
|
||||
@Getter private final Queue<AudioTrack> queue;
|
||||
@Getter private AudioTrack lastTrack;
|
||||
@Getter private Pagination queuePagination;
|
||||
|
||||
/**
|
||||
* @param player The audio player this scheduler uses
|
||||
*/
|
||||
public TrackScheduler(AudioPlayer player) {
|
||||
this.player = player;
|
||||
this.queue = new LinkedList<>();
|
||||
queuePagination = new Pagination(queue, 5);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add the next track to queue or play right away if nothing is in the queue.
|
||||
*
|
||||
* @param track The track to play or add to queue.
|
||||
*/
|
||||
public void queue(AudioTrack track) {
|
||||
// Calling startTrack with the noInterrupt set to true will start the track only if nothing is currently playing. If
|
||||
// something is playing, it returns false and does nothing. In that case the player was already playing so this
|
||||
// track goes to the queue instead.
|
||||
if (!player.startTrack(track, true)) {
|
||||
queue.offer(track);
|
||||
}
|
||||
queuePagination.updateList(queue);
|
||||
}
|
||||
|
||||
/**
|
||||
* Start the next track, stopping the current one if it is playing.
|
||||
*/
|
||||
public AudioTrack nextTrack() {
|
||||
// Start the next track, regardless of if something is already playing or not. In case queue was empty, we are
|
||||
// giving null to startTrack, which is a valid argument and will simply stop the player.
|
||||
AudioTrack track = queue.poll();
|
||||
player.startTrack(track, false);
|
||||
queuePagination.updateList(queue);
|
||||
return track;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTrackEnd(AudioPlayer player, AudioTrack track, AudioTrackEndReason endReason) {
|
||||
this.lastTrack = track;
|
||||
// Only start the next track if the end reason is suitable for it (FINISHED or LOAD_FAILED)
|
||||
if (endReason.mayStartNext) {
|
||||
if (repeating)
|
||||
player.startTrack(lastTrack.makeClone(), false);
|
||||
else {
|
||||
if (playlistRepeat) {
|
||||
queue(lastTrack.makeClone());
|
||||
}
|
||||
nextTrack();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void shuffle() {
|
||||
Collections.shuffle((List<?>) queue);
|
||||
queuePagination.updateList(queue);
|
||||
}
|
||||
}
|
77
src/main/java/io/rixa/bot/guild/settings/Settings.java
Normal file
77
src/main/java/io/rixa/bot/guild/settings/Settings.java
Normal file
@ -0,0 +1,77 @@
|
||||
package io.rixa.bot.guild.settings;
|
||||
|
||||
import io.rixa.bot.data.storage.DatabaseAdapter;
|
||||
import io.rixa.bot.guild.RixaGuild;
|
||||
import io.rixa.bot.guild.manager.RixaSettings;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import net.dv8tion.jda.core.entities.Role;
|
||||
import net.dv8tion.jda.core.entities.TextChannel;
|
||||
import org.springframework.jdbc.core.RowMapper;
|
||||
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
|
||||
public class Settings implements RixaSettings {
|
||||
|
||||
@Getter @Setter private String prefix, joinMessage, quitMessage, joinPrivateMessage;
|
||||
@Getter @Setter private boolean joinVerification;
|
||||
@Getter @Setter private TextChannel greetings, farewell;
|
||||
@Getter @Setter private Role muteRole, defaultRole;
|
||||
@Getter private RixaGuild rixaGuild;
|
||||
|
||||
public Settings(RixaGuild rixaGuild) {
|
||||
this.rixaGuild = rixaGuild;
|
||||
load();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void load() {
|
||||
if (!(DatabaseAdapter.getInstance().exists("settings", "guild_id", rixaGuild.getId()))) {
|
||||
DatabaseAdapter.getInstance().get().update
|
||||
("INSERT INTO settings(guild_id, log_enabled, log_channel, joinMessage, quitMessage, greetings, farewell," +
|
||||
" prefix, joinPm, joinVerification, defaultRole, muteRole) VALUES " +
|
||||
"(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);",
|
||||
rixaGuild.getId(), false, "default_value", "default_value", "default_value", "default_value",
|
||||
"default_value", "!", "default", 0, "default_value", "default_value");
|
||||
}
|
||||
DatabaseAdapter.getInstance().get().query("SELECT * FROM `settings` WHERE `guild_id` = ?",
|
||||
new Object[] { rixaGuild.getId() }, (resultSet, i) -> {
|
||||
setPrefix(resultSet.getString("prefix"));
|
||||
setJoinMessage(resultSet.getString("joinMessage"));
|
||||
setQuitMessage(resultSet.getString("quitMessage"));
|
||||
setJoinPrivateMessage(resultSet.getString("joinPm"));
|
||||
setJoinVerification(resultSet.getBoolean("joinVerification"));
|
||||
String greetingsId = resultSet.getString("greetings");
|
||||
String farewellId = resultSet.getString("farewell");
|
||||
String defaultRoleId = resultSet.getString("defaultRole");
|
||||
String muteRoleId = resultSet.getString("muteRole");
|
||||
if (!greetingsId.equalsIgnoreCase("default_value") && rixaGuild.getGuild().getTextChannelById(greetingsId) != null) {
|
||||
greetings = rixaGuild.getGuild().getTextChannelById(greetingsId);
|
||||
}
|
||||
if (!farewellId.equalsIgnoreCase("default_value") && rixaGuild.getGuild().getTextChannelById(farewellId) != null) {
|
||||
farewell = rixaGuild.getGuild().getTextChannelById(farewellId);
|
||||
}
|
||||
if (!defaultRoleId.equalsIgnoreCase("default_value") && rixaGuild.getGuild().getRoleById(defaultRoleId) != null) {
|
||||
defaultRole = rixaGuild.getGuild().getRoleById(defaultRoleId);
|
||||
}
|
||||
if (!muteRoleId.equalsIgnoreCase("default_value") && rixaGuild.getGuild().getRoleById(muteRoleId) != null) {
|
||||
muteRole = rixaGuild.getGuild().getRoleById(muteRoleId);
|
||||
}
|
||||
return null;
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void save() {
|
||||
DatabaseAdapter.getInstance().get().update("UPDATE `settings` SET " +
|
||||
"`prefix` = ?, `joinMessage` = ?, `quitMessage` = ?, " +
|
||||
"`joinPm` = ?, `joinVerification` = ?, `greetings` = ?, " +
|
||||
"`farewell` = ?, `defaultRole` = ?, `muteRole` = ?;",
|
||||
prefix, joinMessage, quitMessage, joinPrivateMessage, joinVerification,
|
||||
((greetings == null) ? "default_value" : greetings.getId()),
|
||||
((farewell == null) ? "default_value" : farewell.getId()),
|
||||
((defaultRole == null) ? "default_value" : defaultRole.getId()),
|
||||
((muteRole == null) ? "default_value" : muteRole.getId()));
|
||||
}
|
||||
}
|
35
src/main/java/io/rixa/bot/pagination/ObjectPagination.java
Normal file
35
src/main/java/io/rixa/bot/pagination/ObjectPagination.java
Normal file
@ -0,0 +1,35 @@
|
||||
package io.rixa.bot.pagination;
|
||||
|
||||
import lombok.Getter;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
public class ObjectPagination {
|
||||
|
||||
@Getter private List<Object> objects;
|
||||
@Getter private int maxPage, pageSize;
|
||||
public ObjectPagination(List<Object> objects, int pageSize) {
|
||||
this.objects = objects;
|
||||
this.pageSize = pageSize;
|
||||
this.maxPage = (objects.size() / pageSize + (objects.size() % pageSize));
|
||||
}
|
||||
|
||||
public List<Object> getPage(int page) {
|
||||
if(pageSize <= 0 || page <= 0) {
|
||||
throw new IllegalArgumentException("Invalid page size: " + pageSize);
|
||||
}
|
||||
|
||||
int fromIndex = (page - 1) * pageSize;
|
||||
if(objects == null || objects.size() < fromIndex){
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
// toIndex exclusive
|
||||
return objects.subList(fromIndex, Math.min(fromIndex + pageSize, objects.size()));
|
||||
}
|
||||
|
||||
public void updateList(List<Object> obj) {
|
||||
this.objects = obj;
|
||||
}
|
||||
}
|
42
src/main/java/io/rixa/bot/pagination/Pagination.java
Normal file
42
src/main/java/io/rixa/bot/pagination/Pagination.java
Normal file
@ -0,0 +1,42 @@
|
||||
package io.rixa.bot.pagination;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
public class Pagination {
|
||||
|
||||
@Getter @Setter private List<Object> objects;
|
||||
@Getter private int maxPage, pageSize;
|
||||
|
||||
public <E> Pagination(Collection<E> objects, int pageSize) {
|
||||
this.objects = new ArrayList<>(objects);
|
||||
this.pageSize = pageSize;
|
||||
this.maxPage = (objects.size() / pageSize + (objects.size() % pageSize));
|
||||
}
|
||||
|
||||
public List<Object> getPage(int page) {
|
||||
if(objects.isEmpty()) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
if(pageSize <= 0 || page <= 0) {
|
||||
throw new IllegalArgumentException("Invalid page size: " + pageSize);
|
||||
}
|
||||
|
||||
int fromIndex = (page - 1) * pageSize;
|
||||
if(objects.size() < fromIndex){
|
||||
return Collections.emptyList();
|
||||
}
|
||||
// toIndex exclusive
|
||||
return objects.subList(fromIndex, Math.min(fromIndex + pageSize, objects.size()));
|
||||
}
|
||||
|
||||
public <E> void updateList(Collection<E> objects) {
|
||||
this.objects.clear();
|
||||
this.objects.addAll(objects);
|
||||
}
|
||||
}
|
17
src/main/java/io/rixa/bot/reactions/React.java
Normal file
17
src/main/java/io/rixa/bot/reactions/React.java
Normal file
@ -0,0 +1,17 @@
|
||||
package io.rixa.bot.reactions;
|
||||
|
||||
import lombok.Getter;
|
||||
import net.dv8tion.jda.core.events.message.react.MessageReactionAddEvent;
|
||||
import net.dv8tion.jda.core.hooks.SubscribeEvent;
|
||||
|
||||
public abstract class React {
|
||||
|
||||
@Getter private final String name;
|
||||
|
||||
public React(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public abstract void onReact(MessageReactionAddEvent event);
|
||||
}
|
35
src/main/java/io/rixa/bot/reactions/ReactManager.java
Normal file
35
src/main/java/io/rixa/bot/reactions/ReactManager.java
Normal file
@ -0,0 +1,35 @@
|
||||
package io.rixa.bot.reactions;
|
||||
|
||||
import io.rixa.bot.commands.exceptions.ReactNotFoundException;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public class ReactManager {
|
||||
|
||||
private Map<String, React> reactMap = new HashMap<>();
|
||||
|
||||
|
||||
private void registerReact(React react) {
|
||||
if (this.reactMap.containsKey(react.getName())) {
|
||||
return;
|
||||
}
|
||||
this.reactMap.put(react.getName(), react);
|
||||
}
|
||||
|
||||
public void registerReact(React... reacts) {
|
||||
for (React react : reacts) {
|
||||
registerReact(react);
|
||||
}
|
||||
}
|
||||
|
||||
public React getReaction(String react) throws ReactNotFoundException {
|
||||
if (reactMap.containsKey(react.toLowerCase())) {
|
||||
return reactMap.get(react.toLowerCase());
|
||||
}
|
||||
throw new ReactNotFoundException("Could not find reaction");
|
||||
}
|
||||
|
||||
public Map<String, React> getAllReactions() {
|
||||
return this.reactMap;
|
||||
}
|
||||
}
|
134
src/main/java/io/rixa/bot/reactions/react/HelpReaction.java
Normal file
134
src/main/java/io/rixa/bot/reactions/react/HelpReaction.java
Normal file
@ -0,0 +1,134 @@
|
||||
package io.rixa.bot.reactions.react;
|
||||
|
||||
import io.rixa.bot.Rixa;
|
||||
import io.rixa.bot.commands.handler.CommandHandler;
|
||||
import io.rixa.bot.commands.handler.CommandType;
|
||||
import io.rixa.bot.guild.RixaGuild;
|
||||
import io.rixa.bot.guild.manager.GuildManager;
|
||||
import io.rixa.bot.reactions.React;
|
||||
import net.dv8tion.jda.core.EmbedBuilder;
|
||||
import net.dv8tion.jda.core.JDA;
|
||||
import net.dv8tion.jda.core.entities.Message;
|
||||
import net.dv8tion.jda.core.entities.MessageEmbed;
|
||||
import net.dv8tion.jda.core.events.message.guild.react.GuildMessageReactionAddEvent;
|
||||
import net.dv8tion.jda.core.events.message.priv.react.PrivateMessageReactionAddEvent;
|
||||
import net.dv8tion.jda.core.events.message.react.MessageReactionAddEvent;
|
||||
import net.dv8tion.jda.core.exceptions.ErrorResponseException;
|
||||
import net.dv8tion.jda.core.hooks.SubscribeEvent;
|
||||
import org.intellij.lang.annotations.Subst;
|
||||
|
||||
public class HelpReaction extends React {
|
||||
|
||||
public HelpReaction(String name) {
|
||||
super(name);
|
||||
}
|
||||
|
||||
@Override
|
||||
@SubscribeEvent
|
||||
public void onReact(MessageReactionAddEvent event) {
|
||||
System.out.println("Help Triggered");
|
||||
if (event.getUser().getId().equalsIgnoreCase(event.getJDA().getSelfUser().getId())) {
|
||||
return;
|
||||
}
|
||||
System.out.println("Not bot");
|
||||
Message message = event.getChannel().getMessageById(event.getMessageId()).complete();
|
||||
this.execute(message, event.getReaction().getReactionEmote().getName(), event.getJDA());
|
||||
}
|
||||
|
||||
private void execute(Message message, String emoteName, JDA jda) {
|
||||
System.out.println("Executed");
|
||||
MessageEmbed messageEmbed = message.getEmbeds().get(0);
|
||||
if (!messageEmbed.getTitle().contains(": ")) {
|
||||
return;
|
||||
}
|
||||
String title = messageEmbed.getTitle().split(": ")[1];
|
||||
RixaGuild rixaGuild = GuildManager.getInstance().getGuild(jda.getGuildById(title));
|
||||
if (rixaGuild == null) {
|
||||
return;
|
||||
}
|
||||
String prefix = rixaGuild.getSettings().getPrefix();
|
||||
EmbedBuilder embedBuilder;
|
||||
try {
|
||||
switch (emoteName) {
|
||||
case "\uD83D\uDDD1":// waste bin
|
||||
if (message.getAuthor().getId().equalsIgnoreCase(jda.getSelfUser().getId())) {
|
||||
message.delete().complete();
|
||||
}
|
||||
break;
|
||||
case "\u0031\u20E3":// one emoji
|
||||
embedBuilder = new EmbedBuilder();
|
||||
String stringBuilder = "\u2753" +
|
||||
" **General Commands Help**" +
|
||||
"\n" +
|
||||
"Click a number below for information about other commands.";
|
||||
embedBuilder.setTitle(String.format("Help: %s", title));
|
||||
embedBuilder.setDescription(stringBuilder);
|
||||
Rixa.getInstance().getCommandHandler().getAllCommands().values()
|
||||
.stream().filter(cmd -> cmd.getCommandType() == CommandType.USER)
|
||||
.forEach(cmd -> embedBuilder.addField(prefix + cmd.getCommand(),
|
||||
cmd.getDescription(), false));
|
||||
message.editMessage(embedBuilder.build()).queue();
|
||||
break;
|
||||
case "\u0032\u20E3": // two emoji
|
||||
embedBuilder = new EmbedBuilder();
|
||||
stringBuilder = "\u2753" +
|
||||
" **Staff Commands Help**" +
|
||||
"\n" +
|
||||
"Click a number below for information about other commands.";
|
||||
embedBuilder.setTitle(String.format("Help: %s", title));
|
||||
embedBuilder.setDescription(stringBuilder);
|
||||
Rixa.getInstance().getCommandHandler().getAllCommands().values().stream()
|
||||
.filter(cmd -> cmd.getCommandType() == CommandType.STAFF)
|
||||
.forEach(cmd -> embedBuilder.addField(prefix + cmd.getCommand(),
|
||||
cmd.getDescription(), false));
|
||||
message.editMessage(embedBuilder.build()).queue();
|
||||
break;
|
||||
case "\u0033\u20E3": // three emoji
|
||||
embedBuilder = new EmbedBuilder();
|
||||
stringBuilder = "\u2753" +
|
||||
" **Music Commands Help**" +
|
||||
"\n" +
|
||||
"Click a number below for information about other commands.";
|
||||
embedBuilder.setTitle(String.format("Help: %s", title));
|
||||
embedBuilder.setDescription(stringBuilder);
|
||||
embedBuilder.addField(prefix + "music join [name]",
|
||||
"Joins a voice channel that has the provided name", false)
|
||||
.addField(prefix + "music join [id]",
|
||||
"Joins a voice channel based on the provided id.", false)
|
||||
.addField(prefix + "music leave",
|
||||
"Leaves the voice channel that the bot is currently in.", false)
|
||||
.addField(prefix + "music play",
|
||||
"Plays songs from the current queue. Starts playing again if it was previously paused",
|
||||
false)
|
||||
.addField(prefix + "music play [url]",
|
||||
"Adds a new song to the queue and starts playing if it wasn't playing already",
|
||||
false)
|
||||
.addField(prefix + "music playlist",
|
||||
"Adds a playlist to the queue and starts playing if not already playing", false)
|
||||
.addField(prefix + "music pause", "Pauses audio playback", false)
|
||||
.addField(prefix + "music stop",
|
||||
"Completely stops audio playback, skipping the current song.", false)
|
||||
.addField(prefix + "music skip",
|
||||
"Skips the current song, automatically starting the next", false)
|
||||
.addField(prefix + "music nowplaying",
|
||||
"Prints information about the currently playing song (title, current time)",
|
||||
false)
|
||||
.addField(prefix + "music np", "Alias for nowplaying", false)
|
||||
.addField(prefix + "music list", "Lists the songs in the queue", false)
|
||||
.addField(prefix + "music volume [vol]",
|
||||
"Sets the volume of the MusicPlayer [10 - 100]", false)
|
||||
.addField(prefix + "music restart",
|
||||
"Restarts the current song or restarts the previous song if there is no current song playing.",
|
||||
false)
|
||||
.addField(prefix + "music repeat",
|
||||
"Makes the player repeat the currently playing song", false)
|
||||
.addField(prefix + "music reset",
|
||||
"Completely resets the player, fixing all errors and clearing the queue.", false)
|
||||
.addField(prefix + "music shuffle", "Shuffle current music queue.", false);
|
||||
message.editMessage(embedBuilder.build()).queue();
|
||||
break;
|
||||
}
|
||||
} catch (ErrorResponseException ignored) {
|
||||
}
|
||||
}
|
||||
}
|
119
src/main/java/io/rixa/bot/user/RixaUser.java
Normal file
119
src/main/java/io/rixa/bot/user/RixaUser.java
Normal file
@ -0,0 +1,119 @@
|
||||
package io.rixa.bot.user;
|
||||
|
||||
import io.rixa.bot.commands.perms.RixaPermission;
|
||||
import io.rixa.bot.data.storage.DatabaseAdapter;
|
||||
import io.rixa.bot.data.storage.enums.Statements;
|
||||
import io.rixa.bot.guild.enums.PermissionType;
|
||||
import io.rixa.bot.pagination.ObjectPagination;
|
||||
import io.rixa.bot.user.mapper.UserPermissionsMapper;
|
||||
import io.rixa.bot.utils.DiscordUtils;
|
||||
import lombok.Getter;
|
||||
import net.dv8tion.jda.core.entities.Guild;
|
||||
import net.dv8tion.jda.core.entities.User;
|
||||
import org.springframework.dao.EmptyResultDataAccessException;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ThreadLocalRandom;
|
||||
|
||||
public class RixaUser {
|
||||
|
||||
@Getter
|
||||
private User user;
|
||||
@Getter
|
||||
private Map<String, Integer> levels;
|
||||
@Getter
|
||||
private Map<String, List<RixaPermission>> permissions;
|
||||
@Getter
|
||||
private long last_awarded;
|
||||
|
||||
public RixaUser(User user) {
|
||||
this.user = user;
|
||||
levels = new HashMap<>();
|
||||
permissions = new HashMap<>();
|
||||
last_awarded = (System.currentTimeMillis() - 60000);
|
||||
load();
|
||||
}
|
||||
|
||||
private void load() {
|
||||
int count = DatabaseAdapter.getInstance().get().queryForObject
|
||||
("SELECT COUNT(*) FROM `levels` WHERE `user_id` = ?", new Object[] { user.getId() }, Integer.class);
|
||||
if (count > 0) {
|
||||
DatabaseAdapter.getInstance().get().queryForObject("SELECT * FROM `levels` WHERE `user_id` = ?",
|
||||
new Object[]{user.getId()},
|
||||
(resultSet, i) -> {
|
||||
resultSet.beforeFirst();
|
||||
while (resultSet.next()) {
|
||||
levels.put(resultSet.getString("guild_id"), resultSet.getInt("experience"));
|
||||
}
|
||||
return 0;
|
||||
});
|
||||
}
|
||||
permissions.clear();
|
||||
permissions.putAll(DatabaseAdapter.getInstance().get().query("SELECT * FROM `permissions` WHERE `type` = ? AND `object_id` = ?",
|
||||
new Object[]{PermissionType.USER, user.getId()}, new UserPermissionsMapper()));
|
||||
}
|
||||
|
||||
public void save() {
|
||||
levels.forEach((guildId, integer) -> {
|
||||
int i = DatabaseAdapter.getInstance().get().queryForObject
|
||||
("SELECT COUNT(*) FROM `levels` WHERE `guild_id` = ? AND `user_id` = ?", new Object[]{
|
||||
guildId, user.getId()
|
||||
}, Integer.class);
|
||||
if (i > 0) {
|
||||
DatabaseAdapter.getInstance().get().update(
|
||||
"UPDATE `levels` SET `experience` = ? WHERE `guild_id` = ? AND `user_id` = ?", integer, guildId,
|
||||
user.getId());
|
||||
return;
|
||||
}
|
||||
DatabaseAdapter.getInstance().get().update
|
||||
("INSERT INTO `levels` (guild_id, user_id, experience) VALUES (?, ?, ?);", guildId, user.getId(), integer);
|
||||
});
|
||||
}
|
||||
|
||||
public boolean awardIfCan(Guild guild) {
|
||||
long b = ((System.currentTimeMillis() - last_awarded) / 1000);
|
||||
if (b < 60) {
|
||||
return false;
|
||||
}
|
||||
int amountAdding = ThreadLocalRandom.current().nextInt(15, 25);
|
||||
int exp = levels.getOrDefault(guild.getId(), 0);
|
||||
int currentLevel = DiscordUtils.getLevelFromExperience(exp);
|
||||
if (levels.containsKey(guild.getId())) {
|
||||
levels.replace(guild.getId(), exp + amountAdding);
|
||||
} else {
|
||||
levels.put(guild.getId(), exp + amountAdding);
|
||||
}
|
||||
this.last_awarded = System.currentTimeMillis();
|
||||
return currentLevel < DiscordUtils.getLevelFromExperience(levels.get(guild.getId()));
|
||||
}
|
||||
|
||||
public void addPermission(String guildId, RixaPermission rixaPermission) {
|
||||
if (!permissions.containsKey(guildId)) {
|
||||
permissions.put(guildId, Collections.singletonList(rixaPermission));
|
||||
return;
|
||||
}
|
||||
List<RixaPermission> permissionsList = permissions.get(guildId);
|
||||
if (permissionsList.contains(rixaPermission)) return;
|
||||
permissionsList.add(rixaPermission);
|
||||
permissions.replace(guildId, permissionsList);
|
||||
}
|
||||
|
||||
public void removePermission(String guildId, RixaPermission rixaPermission) {
|
||||
if (!permissions.containsKey(guildId)) return;
|
||||
List<RixaPermission> permissionsList = permissions.get(guildId);
|
||||
if (!permissionsList.contains(rixaPermission)) return;
|
||||
permissionsList.remove(rixaPermission);
|
||||
permissions.replace(guildId, permissionsList);
|
||||
}
|
||||
|
||||
public boolean hasPermission(String guildId, RixaPermission rixaPermission) {
|
||||
return permissions.containsKey(guildId) && permissions.get(guildId).contains(rixaPermission);
|
||||
}
|
||||
|
||||
public int getLevels(String id) {
|
||||
return levels.getOrDefault(id, 0);
|
||||
}
|
||||
}
|
42
src/main/java/io/rixa/bot/user/manager/UserManager.java
Normal file
42
src/main/java/io/rixa/bot/user/manager/UserManager.java
Normal file
@ -0,0 +1,42 @@
|
||||
package io.rixa.bot.user.manager;
|
||||
|
||||
import io.rixa.bot.user.RixaUser;
|
||||
import lombok.Getter;
|
||||
import net.dv8tion.jda.core.entities.User;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public class UserManager {
|
||||
|
||||
private static UserManager instance;
|
||||
@Getter private Map<String, RixaUser> userMap = new HashMap<>();
|
||||
|
||||
private UserManager() {
|
||||
instance = this;
|
||||
}
|
||||
|
||||
public RixaUser getUser(User user) {
|
||||
if (hasUser(user.getId()))
|
||||
return userMap.get(user.getId());
|
||||
RixaUser rixaUser = new RixaUser(user);
|
||||
addUser(rixaUser);
|
||||
return rixaUser;
|
||||
}
|
||||
|
||||
public void addUser(RixaUser user) {
|
||||
if (hasUser(user.getUser().getId())) return;
|
||||
userMap.put(user.getUser().getId(), user);
|
||||
}
|
||||
|
||||
public void removeUser(String id) {
|
||||
if (!hasUser(id)) return;
|
||||
userMap.remove(id);
|
||||
}
|
||||
|
||||
public boolean hasUser(String id) { return userMap.containsKey(id); }
|
||||
|
||||
public static UserManager getInstance() {
|
||||
return (instance == null) ? new UserManager() : instance;
|
||||
}
|
||||
}
|
@ -0,0 +1,31 @@
|
||||
package io.rixa.bot.user.mapper;
|
||||
|
||||
import io.rixa.bot.commands.perms.RixaPermission;
|
||||
import org.springframework.dao.DataAccessException;
|
||||
import org.springframework.jdbc.core.ResultSetExtractor;
|
||||
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public class UserPermissionsMapper implements ResultSetExtractor<Map<String, List<RixaPermission>>>{
|
||||
@Override
|
||||
public Map<String, List<RixaPermission>> extractData(ResultSet resultSet) throws SQLException, DataAccessException {
|
||||
Map<String, List<RixaPermission>> permissionsMap = new HashMap<>();
|
||||
List<RixaPermission> permissions = new ArrayList<>();
|
||||
while (resultSet.next()) {
|
||||
String guildId = resultSet.getString("guild_id");
|
||||
RixaPermission rixaPermission = RixaPermission.fromString(resultSet.getString("permission"));
|
||||
|
||||
if (permissionsMap.containsKey(guildId)) permissions.addAll(permissionsMap.get(guildId));
|
||||
|
||||
if (!permissions.contains(rixaPermission)) permissions.add(rixaPermission);
|
||||
permissionsMap.replace(guildId, permissions);
|
||||
permissions.clear();
|
||||
}
|
||||
return permissionsMap;
|
||||
}
|
||||
}
|
169
src/main/java/io/rixa/bot/utils/DiscordUtils.java
Normal file
169
src/main/java/io/rixa/bot/utils/DiscordUtils.java
Normal file
@ -0,0 +1,169 @@
|
||||
package io.rixa.bot.utils;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
import net.dv8tion.jda.core.Permission;
|
||||
import net.dv8tion.jda.core.entities.Guild;
|
||||
import net.dv8tion.jda.core.entities.Member;
|
||||
import net.dv8tion.jda.core.entities.Role;
|
||||
import net.dv8tion.jda.core.entities.VoiceChannel;
|
||||
|
||||
public class DiscordUtils {
|
||||
|
||||
public static List<Member> memberSearch(Guild guild, String string, boolean bots) {
|
||||
List<Member> members = new ArrayList<>();
|
||||
String finalString = string.toLowerCase();
|
||||
for (Member member : guild.getMembers()) {
|
||||
if ((member.getUser().getName().toLowerCase() + "#" + member.getUser().getDiscriminator())
|
||||
.contains(finalString)
|
||||
|| (member.getEffectiveName().toLowerCase().contains(finalString))
|
||||
|| finalString.contains(member.getUser().getId())
|
||||
|| finalString.contains(
|
||||
member.getUser().getName().toLowerCase() + "#" + member.getUser().getDiscriminator())
|
||||
|| finalString.contains(member.getEffectiveName().toLowerCase())
|
||||
|| finalString.contains(member.getUser().getName().toLowerCase())
|
||||
|| finalString.equalsIgnoreCase(member.getEffectiveName().toLowerCase())
|
||||
|| finalString.equalsIgnoreCase(member.getUser().getName().toLowerCase())) {
|
||||
|
||||
if (!bots && member.getUser().isBot()) {
|
||||
continue;
|
||||
}
|
||||
members.add(member);
|
||||
}
|
||||
}
|
||||
return members;
|
||||
}
|
||||
|
||||
public static Object[] memberSearchArray(Guild guild, String string, boolean bots) {
|
||||
Object[] array = new Object[2];
|
||||
// First item is string, second is member
|
||||
String finalString = string.toLowerCase().trim();
|
||||
for (Member member : guild.getMembers()) {
|
||||
//String nameDescrim = member.getUser().getName().toLowerCase() + "#" + member.getUser().getDiscriminator().toLowerCase();
|
||||
if (finalString.contains(
|
||||
member.getUser().getName().toLowerCase() + "#" + member.getUser().getDiscriminator())) {
|
||||
array[0] = member.getEffectiveName();
|
||||
array[1] = member;
|
||||
break;
|
||||
} else if (finalString.contains(member.getUser().getId())) {
|
||||
array[0] = member.getEffectiveName();
|
||||
array[1] = member;
|
||||
break;
|
||||
} else if (finalString.contains(member.getEffectiveName().toLowerCase())) {
|
||||
array[0] = member.getEffectiveName();
|
||||
array[1] = member;
|
||||
break;
|
||||
} else if (finalString.contains(member.getUser().getName().toLowerCase())) {
|
||||
array[0] = member.getEffectiveName();
|
||||
array[1] = member;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return array;
|
||||
}
|
||||
|
||||
public static Role searchFirstRole(Guild guild, String s) {
|
||||
return roleSearch(guild, s).get(0);
|
||||
}
|
||||
|
||||
public static List<Role> roleSearch(Guild guild, String string) {
|
||||
List<Role> roles = new ArrayList<>();
|
||||
guild.getRoles().forEach(role -> {
|
||||
if (role.getName().equalsIgnoreCase(string)
|
||||
|| role.getName().toLowerCase().contains(string.toLowerCase())
|
||||
|| string.contains(role.getId())
|
||||
|| string.toLowerCase().contains(role.getName().toLowerCase())) {
|
||||
roles.add(role);
|
||||
}
|
||||
});
|
||||
return roles;
|
||||
}
|
||||
|
||||
public static boolean roleExists(Guild guild, String name) {
|
||||
List<Role> roles = roleSearch(guild, name);
|
||||
|
||||
return roles == null;
|
||||
}
|
||||
|
||||
public static boolean roleExists(Guild guild, Role role) {
|
||||
return roleExists(guild, role.getName());
|
||||
}
|
||||
|
||||
public static Role getMentionedRole(Guild guild, String string) {
|
||||
Role mentionedRole = null;
|
||||
for (Role role : guild.getRoles()) {
|
||||
if (string.contains(role.getAsMention()) || string.contains("@" + role.getName())) {
|
||||
mentionedRole = role;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return mentionedRole;
|
||||
}
|
||||
|
||||
public static VoiceChannel voiceChannelSearch(Guild guild, String string) {
|
||||
List<VoiceChannel> voiceChannels = guild.getVoiceChannelsByName(string, true);
|
||||
if (!voiceChannels.isEmpty()) {
|
||||
return voiceChannels.get(0);
|
||||
}
|
||||
Optional<VoiceChannel> optional = guild.getVoiceChannels().stream().sorted()
|
||||
.filter(voiceChannel -> voiceChannel.getId().equalsIgnoreCase(string) ||
|
||||
voiceChannel.getName().equalsIgnoreCase(string) ||
|
||||
voiceChannel.getName().contains(string)).findFirst();
|
||||
return optional.orElse(null);
|
||||
}
|
||||
|
||||
|
||||
public static int getLevelFromExperience(int xp) {
|
||||
int level = 0;
|
||||
while (xp >= getNeededXP(level)) {
|
||||
xp -= getNeededXP(level);
|
||||
level++;
|
||||
}
|
||||
return level;
|
||||
}
|
||||
|
||||
public static Double getNeededXP(double n) {
|
||||
if (n < 0) {
|
||||
return 0.0;
|
||||
}
|
||||
return (6 * Math.pow(n, 3) + 119 * n + 100);
|
||||
}
|
||||
|
||||
public static int getRemainingExperience(int xp) {
|
||||
int level = getLevelFromExperience(xp);
|
||||
|
||||
for (int i = 0; i < level; i++) {
|
||||
xp -= getNeededXP(i);
|
||||
}
|
||||
return xp;
|
||||
}
|
||||
|
||||
public static Role createMuteRole(Guild guild) {
|
||||
Role role =
|
||||
guild.getController().createRole().setName("Mute")
|
||||
.setColor(Color.DARK_GRAY).setMentionable(false)
|
||||
.complete();
|
||||
guild.getTextChannels().forEach(textChannel ->
|
||||
textChannel.createPermissionOverride(role).setPermissions(Arrays.asList(
|
||||
Permission.MESSAGE_READ, Permission.MESSAGE_HISTORY),
|
||||
Collections.singletonList(
|
||||
Permission.MESSAGE_WRITE)).queue());
|
||||
return role;
|
||||
}
|
||||
|
||||
// Create this role is owner requests users must have permission for using music
|
||||
public static Role createMusicRole(Guild guild) {
|
||||
// Don't need to do anything with permissions as we're assuming users have basic perms
|
||||
Role musicRole = guild.getController().createRole().setName("Music").setColor(Color.BLACK).setMentionable(false).complete();
|
||||
|
||||
if(roleExists(guild, musicRole)) {
|
||||
// Will probably remove this and check roleExists directly where it's needed
|
||||
return null; // yeah yeah ik
|
||||
}
|
||||
return musicRole;
|
||||
}
|
||||
}
|
62
src/main/java/io/rixa/bot/utils/FileUtils.java
Normal file
62
src/main/java/io/rixa/bot/utils/FileUtils.java
Normal file
@ -0,0 +1,62 @@
|
||||
package io.rixa.bot.utils;
|
||||
|
||||
import io.rixa.bot.Rixa;
|
||||
|
||||
import java.io.*;
|
||||
import java.net.URL;
|
||||
import java.net.URLConnection;
|
||||
|
||||
public class FileUtils {
|
||||
|
||||
/*
|
||||
Method borrowed from https://hub.spigotmc.org/stash/projects/SPIGOT/repos/bukkit/browse/src/main/java/org/bukkit/plugin/java/JavaPlugin.java
|
||||
*/
|
||||
public static boolean saveResource(String resourcePath, boolean replace) throws IOException{
|
||||
if (resourcePath == null || resourcePath.equals("")) {
|
||||
throw new IllegalArgumentException("ResourcePath cannot be null or empty");
|
||||
}
|
||||
|
||||
resourcePath = resourcePath.replace('\\', '/');
|
||||
InputStream in = getResource(resourcePath);
|
||||
if (in == null) {
|
||||
throw new IllegalArgumentException("The embedded resource '" + resourcePath + "' cannot be found in " + "file");
|
||||
}
|
||||
|
||||
File outFile = new File(Rixa.getInstance().getDefaultPath(), resourcePath);
|
||||
int lastIndex = resourcePath.lastIndexOf('/');
|
||||
File outDir = new File(Rixa.getInstance().getDefaultPath(), resourcePath.substring(0, lastIndex >= 0 ? lastIndex : 0));
|
||||
|
||||
if (!outDir.exists()) {
|
||||
outDir.mkdirs();
|
||||
}
|
||||
|
||||
if (!outFile.exists() || replace) {
|
||||
OutputStream out = new FileOutputStream(outFile);
|
||||
byte[] buf = new byte[1024];
|
||||
int len;
|
||||
while ((len = in.read(buf)) > 0) {
|
||||
out.write(buf, 0, len);
|
||||
}
|
||||
out.close();
|
||||
in.close();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
Method borrowed from https://hub.spigotmc.org/stash/projects/SPIGOT/repos/bukkit/browse/src/main/java/org/bukkit/plugin/java/JavaPlugin.java
|
||||
*/
|
||||
public static InputStream getResource(String filename) throws IOException {
|
||||
if (filename == null) {
|
||||
throw new IllegalArgumentException("Filename cannot be null");
|
||||
}
|
||||
URL url = FileUtils.class.getClassLoader().getResource(filename);
|
||||
if (url == null) {
|
||||
return null;
|
||||
}
|
||||
URLConnection connection = url.openConnection();
|
||||
connection.setUseCaches(false);
|
||||
return connection.getInputStream();
|
||||
}
|
||||
}
|
181
src/main/java/io/rixa/bot/utils/MessageFactory.java
Normal file
181
src/main/java/io/rixa/bot/utils/MessageFactory.java
Normal file
@ -0,0 +1,181 @@
|
||||
package io.rixa.bot.utils;
|
||||
|
||||
import lombok.Getter;
|
||||
import net.dv8tion.jda.core.EmbedBuilder;
|
||||
import net.dv8tion.jda.core.entities.Message;
|
||||
import net.dv8tion.jda.core.entities.MessageEmbed;
|
||||
import net.dv8tion.jda.core.entities.TextChannel;
|
||||
import net.dv8tion.jda.core.entities.User;
|
||||
import net.dv8tion.jda.core.exceptions.PermissionException;
|
||||
import net.dv8tion.jda.core.exceptions.RateLimitedException;
|
||||
|
||||
import java.awt.*;
|
||||
import java.time.OffsetDateTime;
|
||||
import java.time.OffsetTime;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.ScheduledExecutorService;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
public class MessageFactory {
|
||||
|
||||
private Message message;
|
||||
|
||||
@Getter
|
||||
private EmbedBuilder builder;
|
||||
@Getter private int selfDestruct;
|
||||
|
||||
public MessageFactory(String description) {
|
||||
this();
|
||||
setDescription(description);
|
||||
}
|
||||
|
||||
public MessageFactory() {
|
||||
this.builder = new EmbedBuilder();
|
||||
selfDestruct = 20;
|
||||
}
|
||||
|
||||
public MessageFactory setTitle(String title, String url) {
|
||||
builder.setTitle(title, url);
|
||||
return this;
|
||||
}
|
||||
|
||||
public MessageFactory setDescription(String description) {
|
||||
builder.setDescription(description);
|
||||
return this;
|
||||
}
|
||||
|
||||
public MessageFactory setTitle(String title) {
|
||||
builder.setTitle(title);
|
||||
return this;
|
||||
}
|
||||
|
||||
public MessageFactory setImage(String image) {
|
||||
builder.setImage(image);
|
||||
return this;
|
||||
}
|
||||
|
||||
public MessageFactory setColor(Color color) {
|
||||
builder.setColor(color);
|
||||
return this;
|
||||
}
|
||||
|
||||
public MessageFactory addField(String name, String value, boolean inLine) {
|
||||
builder.addField(name, value, inLine);
|
||||
return this;
|
||||
}
|
||||
|
||||
public MessageFactory addThumbnail(String url) {
|
||||
builder.setThumbnail(url);
|
||||
return this;
|
||||
}
|
||||
|
||||
public MessageFactory setAuthor(String name, String url, String iconURL) {
|
||||
builder.setAuthor(name, url, iconURL);
|
||||
return this;
|
||||
}
|
||||
|
||||
public MessageFactory setTimestamp() {
|
||||
builder.setTimestamp(OffsetDateTime.now());
|
||||
return this;
|
||||
}
|
||||
|
||||
public MessageFactory setAuthor(String name, String iconURL) {
|
||||
builder.setAuthor(name, iconURL, iconURL);
|
||||
return this;
|
||||
}
|
||||
|
||||
public MessageFactory queue(TextChannel channel, Consumer<Message> success) {
|
||||
try {
|
||||
success.andThen(successMessage -> {
|
||||
this.message = successMessage;
|
||||
destroy();
|
||||
});
|
||||
channel.sendMessage(builder.build()).queue(success);
|
||||
} catch (PermissionException ex) {
|
||||
System.out.println("I do not have permission: " + ex.getPermission().getName() + " on server " + channel.getGuild().getName() + " in channel: " + channel.getName());
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
public MessageFactory queue(TextChannel channel) {
|
||||
try {
|
||||
channel.sendMessage(builder.build()).queue(successMessage -> this.message = successMessage);
|
||||
destroy();
|
||||
} catch (PermissionException ex) {
|
||||
System.out.println("I do not have permission: " + ex.getPermission().getName() + " on server " + channel.getGuild().getName() + " in channel: " + channel.getName());
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
public Message complete(TextChannel channel) {
|
||||
try {
|
||||
message = channel.sendMessage(builder.build()).complete();
|
||||
destroy();
|
||||
return message;
|
||||
} catch (PermissionException ex) {
|
||||
System.out.println("I do not have permission: " + ex.getPermission().getName() + " on server " + channel.getGuild().getName() + " in channel: " + channel.getName());
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public void send(User member) {
|
||||
member.openPrivateChannel().complete().sendMessage(builder.build()).queue();
|
||||
destroy();
|
||||
}
|
||||
|
||||
public void send(User member, Consumer<Message> success) {
|
||||
success.andThen(message -> this.message = message);
|
||||
member.openPrivateChannel().queue(s -> s.sendMessage(builder.build()).queue(success));
|
||||
}
|
||||
|
||||
public MessageFactory sendUser(User member) {
|
||||
member.openPrivateChannel().complete().sendMessage(builder.build()).queue(message1 -> this.message = message1);
|
||||
destroy();
|
||||
return this;
|
||||
}
|
||||
|
||||
public MessageFactory addReaction(String reaction) {
|
||||
if(message == null) {
|
||||
throw new NullPointerException("Message must not be null!");
|
||||
}
|
||||
message.addReaction(reaction).queue();
|
||||
return this;
|
||||
}
|
||||
|
||||
public MessageFactory selfDestruct(int time) {
|
||||
this.selfDestruct = time;
|
||||
return this;
|
||||
}
|
||||
|
||||
private void destroy() {
|
||||
if (getSelfDestruct() == 0) return;
|
||||
ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
|
||||
executor.schedule(() -> {
|
||||
if (message != null) message.delete().queue();
|
||||
executor.shutdown();
|
||||
}, getSelfDestruct(), TimeUnit.SECONDS);
|
||||
}
|
||||
|
||||
public MessageEmbed build() {
|
||||
return builder.build();
|
||||
}
|
||||
|
||||
public MessageFactory setThumbnail(String thumbnail) {
|
||||
builder.setThumbnail(thumbnail);
|
||||
return this;
|
||||
}
|
||||
|
||||
public MessageFactory footer(String s, String iconURL) {
|
||||
builder.setFooter(s, iconURL);
|
||||
return this;
|
||||
}
|
||||
|
||||
public static MessageFactory create() {
|
||||
return new MessageFactory();
|
||||
}
|
||||
|
||||
public static MessageFactory create(String s) {
|
||||
return new MessageFactory(s);
|
||||
}
|
||||
}
|
70
src/main/java/io/rixa/bot/utils/Utils.java
Normal file
70
src/main/java/io/rixa/bot/utils/Utils.java
Normal file
@ -0,0 +1,70 @@
|
||||
package io.rixa.bot.utils;
|
||||
|
||||
public class Utils {
|
||||
|
||||
public static boolean isInt(String s) {
|
||||
try {
|
||||
Integer.parseInt(s);
|
||||
return true;
|
||||
} catch (NumberFormatException ex) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean isInteger(String s) {
|
||||
return isInteger(s,10);
|
||||
}
|
||||
|
||||
public static boolean isInteger(String s, int radix) {
|
||||
if(s.isEmpty()) return false;
|
||||
for(int i = 0; i < s.length(); i++) {
|
||||
if(i == 0 && s.charAt(i) == '-') {
|
||||
if(s.length() == 1) return false;
|
||||
else continue;
|
||||
}
|
||||
if(Character.digit(s.charAt(i),radix) < 0) return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public static long toMilliSec(String s) {
|
||||
// This is not my regex :P | From: http://stackoverflow.com/a/8270824
|
||||
String[] sl = s.split("(?<=\\D)(?=\\d)|(?<=\\d)(?=\\D)");
|
||||
|
||||
long i = Long.parseLong(sl[0]);
|
||||
switch (sl[1]) {
|
||||
case "seconds":
|
||||
case "second":
|
||||
case "sec":
|
||||
case "s":
|
||||
return i * 1000;
|
||||
case "minutes":
|
||||
case "min":
|
||||
case "minute":
|
||||
case "m":
|
||||
return i * 1000 * 60;
|
||||
case "hours":
|
||||
case "hour":
|
||||
case "hr":
|
||||
case "h":
|
||||
return i * 1000 * 60 * 60;
|
||||
case "days":
|
||||
case "day":
|
||||
case "dy":
|
||||
case "d":
|
||||
return i * 1000 * 60 * 60 * 24;
|
||||
case "weeks":
|
||||
case "week":
|
||||
case "wk":
|
||||
case "w":
|
||||
return i * 1000 * 60 * 60 * 24 * 7;
|
||||
case "months":
|
||||
case "month":
|
||||
case "mnth":
|
||||
case "mo":
|
||||
return i * 1000 * 60 * 60 * 24 * 30;
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
}
|
@ -1,4 +1,7 @@
|
||||
package me.savvy.rixa.utils;
|
||||
package io.rixa.bot.utils;
|
||||
|
||||
|
||||
import io.rixa.bot.Rixa;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.IOException;
|
||||
@ -6,9 +9,6 @@ import java.io.InputStreamReader;
|
||||
import java.net.HttpURLConnection;
|
||||
import java.net.URL;
|
||||
|
||||
/**
|
||||
* Created by savit on 7/11/2017.
|
||||
*/
|
||||
public class WebUtil {
|
||||
|
||||
public static String getWebPage(String url) throws IOException {
|
||||
@ -24,10 +24,9 @@ public class WebUtil {
|
||||
|
||||
int response = conn.getResponseCode();
|
||||
if (response == 403) {
|
||||
System.out.println("Quota Exceeded");
|
||||
}
|
||||
else if (response != 200) {
|
||||
System.out.println("DEBUG: Response code: " + response);
|
||||
Rixa.getInstance().getLogger().info("Quota Exceeded");
|
||||
} else if (response != 200) {
|
||||
Rixa.getInstance().getLogger().info("DEBUG: Response code: " + response);
|
||||
}
|
||||
|
||||
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
|
@ -1,173 +0,0 @@
|
||||
package me.savvy.rixa;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import me.savvy.rixa.commands.admin.AddRoleCommand;
|
||||
import me.savvy.rixa.commands.admin.BatchMoveCommand;
|
||||
import me.savvy.rixa.commands.admin.ConfigCommand;
|
||||
import me.savvy.rixa.commands.admin.RemoveRoleCommand;
|
||||
import me.savvy.rixa.commands.general.*;
|
||||
import me.savvy.rixa.commands.handlers.CommandExec;
|
||||
import me.savvy.rixa.commands.handlers.CommandHandler;
|
||||
import me.savvy.rixa.commands.mod.DeleteMessagesCommand;
|
||||
import me.savvy.rixa.commands.mod.MuteCommand;
|
||||
import me.savvy.rixa.commands.mod.PurgeMessagesCommand;
|
||||
import me.savvy.rixa.commands.mod.RaidModeCommand;
|
||||
import me.savvy.rixa.commands.owner.CleanGuildCommand;
|
||||
import me.savvy.rixa.commands.owner.OwnerCommand;
|
||||
import me.savvy.rixa.data.database.sql.SQLBuilder;
|
||||
import me.savvy.rixa.data.database.sql.other.DatabaseTables;
|
||||
import me.savvy.rixa.data.filemanager.ConfigManager;
|
||||
import me.savvy.rixa.data.filemanager.LanguageManager;
|
||||
import me.savvy.rixa.events.*;
|
||||
import me.savvy.rixa.events.Shutdown;
|
||||
import me.savvy.rixa.modules.reactions.handlers.React;
|
||||
import me.savvy.rixa.modules.reactions.handlers.ReactionManager;
|
||||
import me.savvy.rixa.modules.reactions.react.ConfigReaction;
|
||||
import me.savvy.rixa.modules.reactions.react.HelpReaction;
|
||||
import me.savvy.rixa.modules.reactions.react.LeaderboardReaction;
|
||||
import net.dv8tion.jda.core.AccountType;
|
||||
import net.dv8tion.jda.core.JDA;
|
||||
import net.dv8tion.jda.core.JDABuilder;
|
||||
import net.dv8tion.jda.core.OnlineStatus;
|
||||
import net.dv8tion.jda.core.entities.Game;
|
||||
import net.dv8tion.jda.core.exceptions.RateLimitedException;
|
||||
import net.dv8tion.jda.core.hooks.AnnotatedEventManager;
|
||||
|
||||
import javax.security.auth.login.LoginException;
|
||||
import java.io.File;
|
||||
import java.sql.SQLException;
|
||||
import java.util.Arrays;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.ScheduledExecutorService;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
/**
|
||||
* Created by Timber on 5/7/2017.
|
||||
* Edited by Majr on 9/22/2017
|
||||
*/
|
||||
public class Rixa {
|
||||
|
||||
@Getter
|
||||
private static long timeUp;
|
||||
@Getter
|
||||
private static Rixa instance;
|
||||
@Getter
|
||||
private static List<JDA> shardsList;
|
||||
@Getter
|
||||
private static ConfigManager config;
|
||||
@Getter
|
||||
@Setter
|
||||
private static SQLBuilder database;
|
||||
@Getter
|
||||
@Setter
|
||||
private LanguageManager languageManager;
|
||||
@Getter
|
||||
@Setter
|
||||
private ScheduledExecutorService executorService;
|
||||
|
||||
// String search = event.getMessage().getContent().substring(event.getMessage().getContent().indexOf(" ") + 1);
|
||||
public static void main(String[] args) {
|
||||
instance = new Rixa();
|
||||
shardsList = new LinkedList<>();
|
||||
config = new ConfigManager(new File("Rixa/config.json"));
|
||||
load();
|
||||
|
||||
Runtime.getRuntime().addShutdownHook(new Thread() {
|
||||
@Override
|
||||
public void run() {
|
||||
getShardsList().forEach(JDA::shutdown);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private static void load() {
|
||||
getInstance().setExecutorService(Executors.newSingleThreadScheduledExecutor());
|
||||
|
||||
database = new SQLBuilder(
|
||||
config.getJsonObject().getJSONObject("sql").getString("userName"),
|
||||
config.getJsonObject().getJSONObject("sql").getString("password"),
|
||||
config.getJsonObject().getJSONObject("sql").getString("portNumber"),
|
||||
config.getJsonObject().getJSONObject("sql").getString("databaseName"),
|
||||
config.getJsonObject().getJSONObject("sql").getString("hostName"));
|
||||
Arrays.stream(DatabaseTables.values()).forEach(databaseTables -> {
|
||||
System.out.println("Checking database table (creating if needed): " + databaseTables.toString());
|
||||
try {
|
||||
database.executeUpdate(databaseTables.getQuery());
|
||||
System.out.println("Done checking " + databaseTables.toString());
|
||||
} catch (SQLException e) {
|
||||
getInstance().getLogger().severe("Could not create table: " + databaseTables.toString());
|
||||
e.printStackTrace();
|
||||
}
|
||||
});
|
||||
|
||||
getInstance().setLanguageManager(new LanguageManager(new File("Rixa/languages/language.json")));
|
||||
try {
|
||||
int shards = 5;
|
||||
for (int i = 0; i < shards; i++) {
|
||||
Logger.getLogger("Rixa").info("Loading shard #" + i);
|
||||
JDABuilder jda = new JDABuilder(AccountType.BOT)
|
||||
.setToken(config.getJsonObject().getString("secretToken"))
|
||||
.setEventManager(new AnnotatedEventManager())
|
||||
.addEventListener(new MessageEvent())
|
||||
.addEventListener(new BotEvent())
|
||||
.addEventListener(new MemberEvent())
|
||||
.addEventListener(new VoiceChannel())
|
||||
.addEventListener(new Shutdown())
|
||||
.setGame(Game.of(config.getJsonObject().getString("botGame")))
|
||||
.setAutoReconnect(true)
|
||||
.setStatus(OnlineStatus.ONLINE)
|
||||
.setAudioEnabled(true)
|
||||
.useSharding(i, shards);
|
||||
shardsList.add(jda.buildAsync());
|
||||
getInstance().getLogger().info("Shard #" + i + " has been loaded");
|
||||
Thread.sleep(5000);
|
||||
}
|
||||
} catch (LoginException | InterruptedException | RateLimitedException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
//Guilds.getGuilds().values().parallelStream().forEach((rixaGuild) -> rixaGuild.load());
|
||||
|
||||
timeUp = System.currentTimeMillis();
|
||||
register(new InfoCommand(), new ServerInfoCommand(), new HelpCommand(),
|
||||
new DeleteMessagesCommand(), new PingCommand(), new PurgeMessagesCommand(),
|
||||
new BatchMoveCommand(), new MuteCommand(), new MusicCommand(),
|
||||
new ConfigCommand(), new UrbanDictionaryCommand(), new YoutubeCommand(),
|
||||
new AddRoleCommand(), new RemoveRoleCommand(), new LevelsCommand(),
|
||||
new LeaderboardCommand(), new RaidModeCommand(), new OwnerCommand(),
|
||||
new ColorCommand(), new ModulesCommand(), new FeaturesCommand(),
|
||||
new CleanGuildCommand());
|
||||
register(new HelpReaction(), new ConfigReaction(), new LeaderboardReaction());
|
||||
}
|
||||
|
||||
private static void register(CommandExec... commandExecs) {
|
||||
for (CommandExec command : commandExecs) {
|
||||
CommandHandler.registerCommand(command);
|
||||
}
|
||||
}
|
||||
|
||||
private static void register(React... react) {
|
||||
for (React reaction : react) {
|
||||
ReactionManager.registerReaction(reaction);
|
||||
}
|
||||
}
|
||||
|
||||
public Logger getLogger() {
|
||||
return Logger.getLogger("Rixa");
|
||||
}
|
||||
|
||||
public void close() {
|
||||
try {
|
||||
database.closeConnection();
|
||||
Thread.sleep(200);
|
||||
getShardsList().forEach(JDA::shutdown);
|
||||
Thread.sleep(200);
|
||||
System.exit(0);
|
||||
} catch (InterruptedException ex) {
|
||||
getLogger().severe("Could not shutdown Rixa instance.");
|
||||
}
|
||||
}
|
||||
}
|
@ -1,17 +0,0 @@
|
||||
package me.savvy.rixa.action;
|
||||
|
||||
import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent;
|
||||
|
||||
/**
|
||||
* Created by savit on 6/24/2017.
|
||||
*/
|
||||
public interface Action {
|
||||
|
||||
String getName();
|
||||
|
||||
String getDescription();
|
||||
|
||||
void execute();
|
||||
|
||||
void execute(GuildMessageReceivedEvent event);
|
||||
}
|
@ -1,45 +0,0 @@
|
||||
package me.savvy.rixa.action;
|
||||
|
||||
import lombok.Getter;
|
||||
import net.dv8tion.jda.core.entities.Guild;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* Created by savit on 6/24/2017.
|
||||
*/
|
||||
public class ActionManager {
|
||||
|
||||
@Getter
|
||||
private Guild guild;
|
||||
@Getter
|
||||
private Map<String, Action> actionMap;
|
||||
|
||||
public ActionManager(Guild guild) {
|
||||
this.guild = guild;
|
||||
actionMap = new HashMap<>();
|
||||
}
|
||||
|
||||
public Action getAction(String actionName) {
|
||||
return actionMap.get(actionName);
|
||||
}
|
||||
|
||||
public void addAction(String actionName, Action action) {
|
||||
if(hasAction(actionName)) {
|
||||
actionMap.remove(actionName);
|
||||
}
|
||||
actionMap.put(actionName, action);
|
||||
}
|
||||
|
||||
public void removeAction(String actionName) {
|
||||
if(!(hasAction(actionName))) {
|
||||
return;
|
||||
}
|
||||
actionMap.remove(actionName);
|
||||
}
|
||||
|
||||
public boolean hasAction(String actionName) {
|
||||
return actionMap.containsKey(actionName);
|
||||
}
|
||||
}
|
@ -1,28 +0,0 @@
|
||||
package me.savvy.rixa.action.actions;
|
||||
|
||||
import me.savvy.rixa.action.Action;
|
||||
import me.savvy.rixa.utils.MessageBuilder;
|
||||
import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent;
|
||||
|
||||
/**
|
||||
* Created by savit on 6/24/2017.
|
||||
*/
|
||||
public class MessageResponse implements Action {
|
||||
@Override
|
||||
public String getName() {
|
||||
return "MessageResponse";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDescription() {
|
||||
return "Upon trigger, responds with messages";
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(GuildMessageReceivedEvent event) {
|
||||
new MessageBuilder("MessageResponse action is still in development.")
|
||||
.setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
}
|
||||
|
||||
public void execute() {}
|
||||
}
|
@ -1,55 +0,0 @@
|
||||
package me.savvy.rixa.commands.admin;
|
||||
|
||||
import me.savvy.rixa.commands.handlers.Command;
|
||||
import me.savvy.rixa.commands.handlers.CommandExec;
|
||||
import me.savvy.rixa.commands.handlers.CommandType;
|
||||
import me.savvy.rixa.commands.handlers.RixaPermission;
|
||||
import me.savvy.rixa.guild.RixaGuild;
|
||||
import me.savvy.rixa.guild.management.Guilds;
|
||||
import me.savvy.rixa.utils.MessageBuilder;
|
||||
import me.savvy.rixa.utils.Utils;
|
||||
import net.dv8tion.jda.core.entities.ChannelType;
|
||||
import net.dv8tion.jda.core.entities.Member;
|
||||
import net.dv8tion.jda.core.entities.Role;
|
||||
import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent;
|
||||
import net.dv8tion.jda.core.exceptions.PermissionException;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Created by savit on 7/7/2017.
|
||||
*/
|
||||
public class AddRoleCommand implements CommandExec {
|
||||
|
||||
@Command(
|
||||
description = "Give a user a role",
|
||||
type = CommandType.ADMIN,
|
||||
channelType = ChannelType.TEXT,
|
||||
usage = "%paddrole", mainCommand = "addrole", aliases = {"ar", "addroles", "ars"})
|
||||
public void execute(GuildMessageReceivedEvent event) {
|
||||
RixaGuild rixaGuild = Guilds.getGuild(event.getGuild());
|
||||
if(!rixaGuild.hasPermission(event.getMember(), RixaPermission.ADD_ROLE)) {
|
||||
new MessageBuilder(event.getMember().getAsMention() + ", you do not have permission for this command.").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
return;
|
||||
}
|
||||
String[] messages = event.getMessage().getContent().split(" ");
|
||||
List<Member> memberList = Utils.memberSearch(event.getGuild(), event.getMessage().getContent(), true);
|
||||
List<Role> roleList = Utils.roleSearch(event.getGuild(), event.getMessage().getContent());
|
||||
if (messages.length >= 3) {
|
||||
if(memberList.size() < 1 ||
|
||||
roleList.size() < 1) {
|
||||
new MessageBuilder(event.getMember().getAsMention() + ", incorrect usage try [" + messages[0] + " <role> <user>].").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
return;
|
||||
}
|
||||
try {
|
||||
int users = memberList.size();
|
||||
memberList.forEach(user -> event.getGuild().getController().addRolesToMember(user, roleList).queue());
|
||||
new MessageBuilder("Successfully given " + users + " users `" + roleList.size() + "` role(s)").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
} catch (PermissionException ex) {
|
||||
new MessageBuilder(event.getMember().getAsMention() + ", sorry I do not have permission for this!").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
}
|
||||
} else {
|
||||
new MessageBuilder(event.getMember().getAsMention() + ", incorrect usage try [" + messages[0] + " <role> <user>].").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
}
|
||||
}
|
||||
}
|
@ -1,64 +0,0 @@
|
||||
package me.savvy.rixa.commands.admin;
|
||||
|
||||
import me.savvy.rixa.commands.handlers.Command;
|
||||
import me.savvy.rixa.commands.handlers.CommandExec;
|
||||
import me.savvy.rixa.commands.handlers.RixaPermission;
|
||||
import me.savvy.rixa.guild.RixaGuild;
|
||||
import me.savvy.rixa.guild.management.Guilds;
|
||||
import me.savvy.rixa.utils.MessageBuilder;
|
||||
import me.savvy.rixa.utils.Utils;
|
||||
import net.dv8tion.jda.core.entities.ChannelType;
|
||||
import net.dv8tion.jda.core.entities.Member;
|
||||
import net.dv8tion.jda.core.entities.Role;
|
||||
import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent;
|
||||
import net.dv8tion.jda.core.exceptions.PermissionException;
|
||||
|
||||
import java.awt.*;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Created by Timber on 5/23/2017.
|
||||
*/
|
||||
public class BatchMoveCommand implements CommandExec {
|
||||
@Override
|
||||
@Command(mainCommand = "batchmove",
|
||||
aliases = "bmove",
|
||||
description = "Move users within one role to another!",
|
||||
channelType = ChannelType.TEXT)
|
||||
public void execute(GuildMessageReceivedEvent event) {
|
||||
RixaGuild rixaGuild = Guilds.getGuild(event.getGuild());
|
||||
if(!rixaGuild.hasPermission(event.getMember(), RixaPermission.BATCH_MOVE)) {
|
||||
new MessageBuilder(event.getMember().getAsMention() + ", you do not have permission for this command.").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
return;
|
||||
}
|
||||
List<Role> roleList = Utils.roleSearch(event.getGuild(), event.getMessage().getContent());
|
||||
if(roleList.size() < 2) {
|
||||
new MessageBuilder("You need to include two roles!").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
return;
|
||||
}
|
||||
Role old_role = roleList.get(0);
|
||||
Role new_role = roleList.get(1);
|
||||
List<Member> userWithRole = event.getGuild().getMembersWithRoles(old_role);
|
||||
if(userWithRole.size() == 0) {
|
||||
new MessageBuilder("There are no users with the role " + old_role.getAsMention()).setColor(old_role.getColor()).queue(event.getChannel());
|
||||
return;
|
||||
}
|
||||
new MessageBuilder("Moving **" + userWithRole.size() + "** users with role: " + old_role.getAsMention()
|
||||
+ " to " + new_role.getAsMention()).setColor(old_role.getColor()).queue(event.getChannel());
|
||||
int success = 0;
|
||||
for(Member member: userWithRole) {
|
||||
try {
|
||||
event.getGuild().getController().modifyMemberRoles
|
||||
(member, Collections.singletonList(new_role), Collections.singletonList(old_role)).queue();
|
||||
success++;
|
||||
} catch(PermissionException ex) {
|
||||
new MessageBuilder("I do not have permission to modify " + member.getAsMention() + "'s role").setColor(Color.RED).queue(event.getChannel());
|
||||
}
|
||||
}
|
||||
if(success > 0) {
|
||||
new MessageBuilder("Successfully moved **" + success + "** users to role " +
|
||||
new_role.getAsMention()).setColor(new_role.getColor()).queue(event.getChannel());
|
||||
}
|
||||
}
|
||||
}
|
@ -1,300 +0,0 @@
|
||||
package me.savvy.rixa.commands.admin;
|
||||
|
||||
import me.savvy.rixa.commands.handlers.Command;
|
||||
import me.savvy.rixa.commands.handlers.CommandExec;
|
||||
import me.savvy.rixa.commands.handlers.CommandType;
|
||||
import me.savvy.rixa.commands.handlers.RixaPermission;
|
||||
import me.savvy.rixa.guild.RixaGuild;
|
||||
import me.savvy.rixa.guild.management.Guilds;
|
||||
import me.savvy.rixa.modules.music.MusicModule;
|
||||
import me.savvy.rixa.utils.MessageBuilder;
|
||||
import me.savvy.rixa.utils.Utils;
|
||||
import net.dv8tion.jda.core.entities.ChannelType;
|
||||
import net.dv8tion.jda.core.entities.Member;
|
||||
import net.dv8tion.jda.core.entities.Role;
|
||||
import net.dv8tion.jda.core.entities.TextChannel;
|
||||
import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Created by Timber on 6/6/2017.
|
||||
*/
|
||||
public class ConfigCommand implements CommandExec {
|
||||
|
||||
private List<String> config;
|
||||
private static ConfigCommand instance;
|
||||
public ConfigCommand() {
|
||||
instance = this;
|
||||
config = Arrays.asList(
|
||||
"%pconfig set greetings ; Set channel where greeting messages are announced!",
|
||||
"%pconfig set farewell ; Set channel where farewell messages are announced!",
|
||||
"%pconfig set prefix <prefix> ; Set Rixa's command prefix!",
|
||||
"%pconfig set defaultRole <role> ; Set role to be assigned when a user joins the server!",
|
||||
"%pconfig set muteRole <role> ; Set role to be assigned when a user is muted!",
|
||||
"%pconfig set musicRole <musicRole> ; Set role required to use the music functions! (Not required)",
|
||||
|
||||
"%pconfig set twitterCKey <key> ; Set Twitter Consumer Key!",
|
||||
"%pconfig set twitterCSecret <key> ; Set Twitter Consumer Secret!",
|
||||
"%pconfig set twitterAToken <key> ; Set Twitter Access Key!",
|
||||
"%pconfig set twitterASecret <key> ; Set Twitter Access Secret!",
|
||||
"%config set twitterChannel ; Set the channel for Twitter feed updates!",
|
||||
|
||||
"%pconfig set tjoinMessage <joinMessage> ; Set the greetings message for when a user joins the server!",
|
||||
"%pconfig set quitMessage <quitMessage> ; Set the quit message for when a user leaves the server!",
|
||||
"%pconfig set joinPm <joinPm> ; Set the message to be private messaged when a user joins!",
|
||||
"%pconfig set description <description> ; Set your server description!",
|
||||
"%pconfig addPerm <role> <permission> ; Give a role permission to access a command!",
|
||||
"%pconfig removePerm <role> <permission> ; Remove a role's permission to access a command!",
|
||||
"%pconfig enable <module> ; Enabled a Rixa Module!",
|
||||
"%pconfig disable <module> ; Disable a Rixa Module!"
|
||||
);
|
||||
}
|
||||
@Override
|
||||
@Command(mainCommand = "config",
|
||||
description = "Configure Rixa to your liking!",
|
||||
type = CommandType.ADMIN,
|
||||
channelType = ChannelType.TEXT)
|
||||
public void execute(GuildMessageReceivedEvent event) {
|
||||
RixaGuild rixaGuild = Guilds.getGuild(event.getGuild());
|
||||
if (!rixaGuild.hasPermission(event.getMember(), RixaPermission.ACCESS_CONFIG)) {
|
||||
new MessageBuilder(event.getMember().getAsMention() + ", you do not have permission for this command.")
|
||||
.setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
return;
|
||||
}
|
||||
String[] messages = event.getMessage().getContent().split(" ");
|
||||
if(messages.length == 2) {
|
||||
int page = 0;
|
||||
try {
|
||||
try {
|
||||
page = Integer.parseInt(messages[1]);
|
||||
sendHelp(event.getMember(), page, rixaGuild.getGuildSettings().getPrefix()).sendUser(event.getAuthor()).addReaction("\u2B05").addReaction("\u27A1");
|
||||
event.getMessage().delete().complete();
|
||||
new MessageBuilder(event.getMember().getAsMention() + ", the configuration menu has been private messaged to you").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
} catch(NumberFormatException ex) {
|
||||
sendHelp(event.getMember(), page, rixaGuild.getGuildSettings().getPrefix()).sendUser(event.getAuthor()).addReaction("\u2B05").addReaction("\u27A1");
|
||||
}
|
||||
} catch (IllegalArgumentException ex){
|
||||
sendHelp(event.getMember(), page, rixaGuild.getGuildSettings().getPrefix()).sendUser(event.getAuthor()).addReaction("\u2B05").addReaction("\u27A1");
|
||||
event.getMessage().delete().complete();
|
||||
new MessageBuilder(event.getMember().getAsMention() + ", the configuration menu has been private messaged to you").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
}
|
||||
return;
|
||||
}else if (messages.length < 3) {
|
||||
sendHelp(event.getMember(), 0, rixaGuild.getGuildSettings().getPrefix()).sendUser(event.getAuthor()).addReaction("\u2B05").addReaction("\u27A1");
|
||||
event.getMessage().delete().complete();
|
||||
new MessageBuilder(event.getMember().getAsMention() + ", the configuration menu has been private messaged to you").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
return;
|
||||
}
|
||||
String message;
|
||||
if (messages[1].equalsIgnoreCase("set")) {
|
||||
if (messages[2].equalsIgnoreCase("joinpm")) {
|
||||
message = getMessage(messages);
|
||||
if(event.getMessage().getMentionedChannels().size() > 0) {
|
||||
for (TextChannel messageChannel : event.getMessage().getMentionedChannels()) {
|
||||
message = message.replace(messageChannel.getAsMention(), "<#" + messageChannel.getId() + ">");
|
||||
}
|
||||
}
|
||||
rixaGuild.getGuildSettings().setJoinPrivateMessage(message);
|
||||
new MessageBuilder("Successfully set Private Join Message to\n" + message.replace("{0}", event.getMember().getUser().getName())
|
||||
.replace("{1}", event.getGuild().getName())).setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
} else if (messages[2].equalsIgnoreCase("description")) {
|
||||
message = getMessage(messages);
|
||||
rixaGuild.getGuildSettings().setDescription(message);
|
||||
new MessageBuilder("Successfully set Server Description to\n" + message.replace("{0}", event.getMember().getUser().getName())
|
||||
.replace("{1}", event.getGuild().getName())).setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
} else if (messages[2].equalsIgnoreCase("joinmessage")) {
|
||||
message = getMessage(messages);
|
||||
if(event.getMessage().getMentionedChannels().size() > 0) {
|
||||
for (TextChannel messageChannel : event.getMessage().getMentionedChannels()) {
|
||||
message = message.replace(messageChannel.getAsMention(), "<#" + messageChannel.getId() + ">");
|
||||
}
|
||||
}
|
||||
rixaGuild.getGuildSettings().setJoinMessage(message);
|
||||
new MessageBuilder("Successfully set Join Message to\n" + message.replace("{0}", event.getMember().getUser().getName())
|
||||
.replace("{1}", event.getGuild().getName())).setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
} else if (messages[2].equalsIgnoreCase("quitmessage")) {
|
||||
message = getMessage(messages);
|
||||
if(event.getMessage().getMentionedChannels().size() > 0) {
|
||||
for (TextChannel messageChannel : event.getMessage().getMentionedChannels()) {
|
||||
message = message.replace(messageChannel.getAsMention(), "<#" + messageChannel.getId() + ">");
|
||||
}
|
||||
}
|
||||
rixaGuild.getGuildSettings().setQuitMessage(message);
|
||||
new MessageBuilder("Successfully set Quit Message to\n" + message.replace("{0}", event.getMember().getUser().getName())
|
||||
.replace("{1}", event.getGuild().getName())).setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
} else if (messages[2].equalsIgnoreCase("greetings")) {
|
||||
rixaGuild.getGuildSettings().setJoinMessageChannel(event.getChannel());
|
||||
new MessageBuilder("Successfully updated Greetings channel!").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
} else if (messages[2].equalsIgnoreCase("farewell")) {
|
||||
rixaGuild.getGuildSettings().setQuitMessageChannel(event.getChannel());
|
||||
new MessageBuilder("Successfully updated Farewell channel!").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
} /*else if(messages[2].equalsIgnoreCase("logchannel")) {
|
||||
rixaGuild.getGuildSettings().setLogChannel(event.getChannel());
|
||||
event.getChannel().sendMessage("Successfully updated `Log Channel`").queue();
|
||||
|
||||
break;
|
||||
}*/ else if (messages[2].equalsIgnoreCase("prefix")) {
|
||||
String pref = messages[3];
|
||||
if (pref.length() > 3) {
|
||||
new MessageBuilder("Command prefix can only be 1 to 3 characters long!").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
return;
|
||||
}
|
||||
rixaGuild.getGuildSettings().setPrefix(pref);
|
||||
new MessageBuilder("Successfully updated command prefix!").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
} else if (messages[2].equalsIgnoreCase("defaultRole")) {
|
||||
if (Utils.roleSearch(event.getGuild(), event.getMessage().getContent()).size() < 1) {
|
||||
new MessageBuilder(event.getMember().getAsMention() + ", incorrect usage try [" + messages[0] + " set defaultRole <role>].\nMake sure to mention the role!")
|
||||
.setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
return;
|
||||
}
|
||||
Role role = Utils.roleSearch(event.getGuild(), event.getMessage().getContent()).get(0);
|
||||
rixaGuild.getGuildSettings().setDefaultRole(role.getId());
|
||||
new MessageBuilder("Successfully set default role to " + role.getName() + "!").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
} else if (messages[2].equalsIgnoreCase("muteRole")) {
|
||||
if (Utils.roleSearch(event.getGuild(), event.getMessage().getContent()).size() < 1) {
|
||||
new MessageBuilder(event.getMember().getAsMention() + ", incorrect usage try [" + messages[0] + " set muteRole <role>].")
|
||||
.setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
return;
|
||||
}
|
||||
Role role = Utils.roleSearch(event.getGuild(), event.getMessage().getContent()).get(0);
|
||||
rixaGuild.getGuildSettings().setMuteRole(role.getId());
|
||||
new MessageBuilder("Successfully set mute role to " + role.getName() + "!").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
} else if (messages[2].equalsIgnoreCase("musicRole")) {
|
||||
if (Utils.roleSearch(event.getGuild(), event.getMessage().getContent()).size() < 1) {
|
||||
new MessageBuilder(event.getMember().getAsMention() + ", incorrect usage try [" + messages[0] + " set musicRole <role>].")
|
||||
.setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
return;
|
||||
}
|
||||
Role role = Utils.roleSearch(event.getGuild(), event.getMessage().getContent()).get(0);
|
||||
((MusicModule) rixaGuild.getModule("Music")).setMusicRole(role.getId());
|
||||
new MessageBuilder("Successfully set music role to " + role.getName() + "!").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
}
|
||||
} else if (messages[1].equalsIgnoreCase("enable")) {
|
||||
rixaGuild.getModules().keySet().forEach(moduleName -> {
|
||||
if (messages[2].equalsIgnoreCase(moduleName)) {
|
||||
rixaGuild.getModule(moduleName).setEnabled(true);
|
||||
new MessageBuilder("Successfully enabled the `" + moduleName + "` module!").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
}
|
||||
});
|
||||
if (messages[2].equalsIgnoreCase("joinverification")) {
|
||||
Guilds.getGuild(event.getGuild()).getGuildSettings().setJoinVerification(true);
|
||||
new MessageBuilder("Successfully enabled Join Verification!").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
}
|
||||
} else if (messages[1].equalsIgnoreCase("disable")) {
|
||||
|
||||
rixaGuild.getModules().keySet().forEach(moduleName -> {
|
||||
if (messages[2].equalsIgnoreCase(moduleName)) {
|
||||
rixaGuild.getModule(moduleName).setEnabled(false);
|
||||
new MessageBuilder("Successfully disabled the `" + moduleName + "` module!").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
}
|
||||
});
|
||||
if (messages[2].equalsIgnoreCase("joinverification")) {
|
||||
Guilds.getGuild(event.getGuild()).getGuildSettings().setJoinVerification(false);
|
||||
new MessageBuilder("Successfully disabled Join Verification!").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
} else if (messages[2].equalsIgnoreCase("joinmessage")) {
|
||||
Guilds.getGuild(event.getGuild()).getGuildSettings().setJoinMessageChannel("default_value");
|
||||
new MessageBuilder("Successfully disabled Join messages!").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
} else if (messages[2].equalsIgnoreCase("quitmessage")) {
|
||||
Guilds.getGuild(event.getGuild()).getGuildSettings().setQuitMessageChannel("default_value");
|
||||
new MessageBuilder("Successfully disabled Quit messages!").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
}
|
||||
} else if (messages[1].equalsIgnoreCase("addperm") || messages[1].equalsIgnoreCase("addpermission") || messages[1].equalsIgnoreCase("aperm")) {
|
||||
String permission = "notFound";
|
||||
for (String string : messages) {
|
||||
for(RixaPermission rixaPermission: RixaPermission.values()) {
|
||||
if (rixaPermission.name().equalsIgnoreCase(string)) {
|
||||
permission = string.toUpperCase();
|
||||
}
|
||||
}
|
||||
}
|
||||
if (permission.equalsIgnoreCase("notFound")) {
|
||||
new MessageBuilder("Sorry that permission does not exist!").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
return;
|
||||
}
|
||||
|
||||
if (Utils.roleSearch(event.getGuild(), event.getMessage().getContent()).size() == 0) {
|
||||
new MessageBuilder(event.getMember().getAsMention() + ", incorrect usage try [" + messages[0] + " addPerm <role> <permission>].")
|
||||
.setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
return;
|
||||
}
|
||||
RixaPermission perm = RixaPermission.valueOf(permission.toUpperCase());
|
||||
Role role = Utils.roleSearch(event.getGuild(), event.getMessage().getContent()).get(0);
|
||||
if (rixaGuild.hasPermission(role, perm)) {
|
||||
new MessageBuilder("That role already has this permission!").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
return;
|
||||
}
|
||||
rixaGuild.setPermission(role, perm, true);
|
||||
new MessageBuilder("Successfully given the role " + role.getName() + " the permission " + perm.name() + "!").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
} else if (messages[1].equalsIgnoreCase("removeperm")
|
||||
|| messages[1].equalsIgnoreCase("removepermission")
|
||||
|| messages[1].equalsIgnoreCase("rperm")
|
||||
|| messages[1].equalsIgnoreCase("delperm")) {
|
||||
String permission = "notFound";
|
||||
for (String string : messages) {
|
||||
for(RixaPermission rixaPermission: RixaPermission.values()) {
|
||||
if (rixaPermission.name().equalsIgnoreCase(string)) {
|
||||
permission = string.toUpperCase();
|
||||
}
|
||||
}
|
||||
}
|
||||
if (permission.equalsIgnoreCase("notFound")) {
|
||||
new MessageBuilder("Sorry that permission does not exist!").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
return;
|
||||
}
|
||||
RixaPermission perm = RixaPermission.valueOf(permission.toUpperCase());
|
||||
if (Utils.roleSearch(event.getGuild(), event.getMessage().getContent()).size() == 0) {
|
||||
new MessageBuilder(event.getMember().getAsMention() + ", incorrect usage try [" + messages[0] + " removePerm <role> <permission>].")
|
||||
.setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
return;
|
||||
}
|
||||
Role role = Utils.roleSearch(event.getGuild(), event.getMessage().getContent()).get(0);
|
||||
if (!rixaGuild.hasPermission(role, perm)) {
|
||||
new MessageBuilder("That role doesn't have this permission!").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
return;
|
||||
}
|
||||
rixaGuild.setPermission(role, perm, false);
|
||||
new MessageBuilder("Successfully removed the permission " + perm.name() + " from the role " + role.getName() + "!").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
} else {
|
||||
int page = 0;
|
||||
sendHelp(event.getMember(), page, rixaGuild.getGuildSettings().getPrefix()).sendUser(event.getAuthor()).addReaction("\u2B05").addReaction("\u27A1");
|
||||
event.getMessage().delete().complete();
|
||||
new MessageBuilder(event.getMember().getAsMention() + ", the configuration menu has been private messaged to you").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
}
|
||||
}
|
||||
|
||||
public MessageBuilder sendHelp(Member member, int page, String prefix) {
|
||||
int sizePerPage = 4;
|
||||
int maxPages = config.size() / sizePerPage + (config.size() % sizePerPage > 0 ? 1 : 0);
|
||||
if(page < 0) {
|
||||
page = 0;
|
||||
}
|
||||
if(page > maxPages - 2) {
|
||||
page = maxPages - 3;
|
||||
}
|
||||
int from = Math.max(0, page * sizePerPage);
|
||||
int to = Math.min(config.size(), (page + 2) * sizePerPage);
|
||||
List<String> configList = config.subList(from, to);
|
||||
MessageBuilder builder = new MessageBuilder("\u2699" + " **Config**" +
|
||||
"\n" +
|
||||
"Click the back or forward reactions to switch between pages.");
|
||||
configList.forEach(object -> {
|
||||
builder.addField(object.split(" ; ")[0].replace("%p", prefix), object.split(" ; ")[1], false);
|
||||
});
|
||||
builder.footer("Page: (" + page + " / " + (maxPages - 2) + ")", member.getGuild().getIconUrl());
|
||||
return builder.setColor(member.getColor()).setTitle(String.format("Config: %s", member.getGuild().getId()));
|
||||
}
|
||||
|
||||
private String getMessage(String[] messages) {
|
||||
StringBuilder builder = new StringBuilder();
|
||||
for(int i = 3; i < messages.length; i++) {
|
||||
builder.append(messages[i]).append(" ");
|
||||
}
|
||||
return builder.toString().trim();
|
||||
}
|
||||
|
||||
public static ConfigCommand getInstance() {
|
||||
return instance;
|
||||
}
|
||||
}
|
@ -1,32 +0,0 @@
|
||||
package me.savvy.rixa.commands.admin;
|
||||
|
||||
import me.savvy.rixa.commands.handlers.Command;
|
||||
import me.savvy.rixa.commands.handlers.CommandExec;
|
||||
import me.savvy.rixa.commands.handlers.CommandType;
|
||||
import net.dv8tion.jda.core.entities.ChannelType;
|
||||
import net.dv8tion.jda.core.entities.TextChannel;
|
||||
import net.dv8tion.jda.core.entities.User;
|
||||
import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent;
|
||||
import net.dv8tion.jda.core.requests.restaction.InviteAction;
|
||||
|
||||
/**
|
||||
* Created by savit on 7/7/2017.
|
||||
*/
|
||||
public class InviteCommand implements CommandExec {
|
||||
|
||||
@Command(
|
||||
description = "Receive an invite from a server",
|
||||
type = CommandType.BOT_OWNER,
|
||||
channelType = ChannelType.TEXT,
|
||||
usage = "%pinvite", mainCommand = "invite")
|
||||
public void execute(GuildMessageReceivedEvent event) {
|
||||
User owner = event.getGuild().getOwner().getUser();
|
||||
if(!event.getAuthor().getId().equalsIgnoreCase(owner.getId())) {
|
||||
return;
|
||||
}
|
||||
TextChannel channel = event.getJDA().getGuildById(event.getMessage().getContent().split(" ")[1]).getTextChannels().get(0);
|
||||
InviteAction inviteAction = channel.createInvite();
|
||||
owner.openPrivateChannel().complete().sendMessage(
|
||||
"http://discord.gg/" + inviteAction.setMaxUses(1).complete().getCode()).queue();
|
||||
}
|
||||
}
|
@ -1,9 +0,0 @@
|
||||
package me.savvy.rixa.commands.admin;
|
||||
|
||||
public class LevelsManagementCommand {
|
||||
|
||||
// xp give/add <user> <amount>
|
||||
// xp take/remove <user> <amount>
|
||||
// xp set <user> <amount>
|
||||
// xp convert <type> <user/all>
|
||||
}
|
@ -1,55 +0,0 @@
|
||||
package me.savvy.rixa.commands.admin;
|
||||
|
||||
import me.savvy.rixa.commands.handlers.Command;
|
||||
import me.savvy.rixa.commands.handlers.CommandExec;
|
||||
import me.savvy.rixa.commands.handlers.CommandType;
|
||||
import me.savvy.rixa.commands.handlers.RixaPermission;
|
||||
import me.savvy.rixa.guild.RixaGuild;
|
||||
import me.savvy.rixa.guild.management.Guilds;
|
||||
import me.savvy.rixa.utils.MessageBuilder;
|
||||
import me.savvy.rixa.utils.Utils;
|
||||
import net.dv8tion.jda.core.entities.ChannelType;
|
||||
import net.dv8tion.jda.core.entities.Member;
|
||||
import net.dv8tion.jda.core.entities.Role;
|
||||
import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent;
|
||||
import net.dv8tion.jda.core.exceptions.PermissionException;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Created by savit on 7/7/2017.
|
||||
*/
|
||||
public class RemoveRoleCommand implements CommandExec {
|
||||
|
||||
@Command(
|
||||
description = "Remove a user's role",
|
||||
type = CommandType.ADMIN,
|
||||
channelType = ChannelType.TEXT,
|
||||
usage = "%premoverole", mainCommand = "removerole", aliases = {"rr", "removeroles"})
|
||||
public void execute(GuildMessageReceivedEvent event) {
|
||||
RixaGuild rixaGuild = Guilds.getGuild(event.getGuild());
|
||||
if(!rixaGuild.hasPermission(event.getMember(), RixaPermission.REMOVE_ROLE)) {
|
||||
new MessageBuilder(event.getMember().getAsMention() + ", you do not have permission for this command.").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
return;
|
||||
}
|
||||
String[] messages = event.getMessage().getContent().split(" ");
|
||||
List<Member> memberList = Utils.memberSearch(event.getGuild(), event.getMessage().getContent(), true);
|
||||
List<Role> roleList = Utils.roleSearch(event.getGuild(), event.getMessage().getContent());
|
||||
if (messages.length >= 3) {
|
||||
if(roleList.size() < 1 ||
|
||||
memberList.size() < 1) {
|
||||
new MessageBuilder(event.getMember().getAsMention() + ", incorrect usage try [" + messages[0] + " <role> <user>].").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
return;
|
||||
}
|
||||
try {
|
||||
int users = memberList.size();
|
||||
memberList.forEach(user -> event.getGuild().getController().removeRolesFromMember(user, roleList).queue());
|
||||
new MessageBuilder("Successfully removed `" + roleList.size() + "` role(s) from " + users + " user(s)!").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
} catch (PermissionException ex) {
|
||||
new MessageBuilder(event.getMember().getAsMention() + ", sorry I do not have permission for this!").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
}
|
||||
} else {
|
||||
new MessageBuilder(event.getMember().getAsMention() + ", incorrect usage try [" + messages[0] + " <role> <user>].").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
}
|
||||
}
|
||||
}
|
@ -1,80 +0,0 @@
|
||||
package me.savvy.rixa.commands.admin;
|
||||
|
||||
import me.savvy.rixa.commands.handlers.Command;
|
||||
import me.savvy.rixa.commands.handlers.CommandExec;
|
||||
import me.savvy.rixa.commands.handlers.CommandType;
|
||||
import me.savvy.rixa.guild.RixaGuild;
|
||||
import me.savvy.rixa.guild.management.Guilds;
|
||||
import me.savvy.rixa.utils.MessageBuilder;
|
||||
import net.dv8tion.jda.core.entities.ChannelType;
|
||||
import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public class RoleRewardsCommand implements CommandExec {
|
||||
|
||||
@Command(
|
||||
description = "View Role Rewards.",
|
||||
type = CommandType.ADMIN,
|
||||
channelType = ChannelType.TEXT,
|
||||
usage = "%prolerewards", mainCommand = "rolerewards",
|
||||
aliases = {"rolereward", "rw"})
|
||||
public void execute(GuildMessageReceivedEvent event) {
|
||||
RixaGuild rixaGuild = Guilds.getGuild(event.getGuild());
|
||||
String[] args = event.getMessage().getContent().split(" ");
|
||||
|
||||
// ?rw <add/remove/list> [level] [role]
|
||||
switch (args.length) {
|
||||
case 4:
|
||||
if (!isInt(args[2])) {
|
||||
new MessageBuilder(event.getMember().getAsMention() + ", incorrect usage try [" + args[0] + " <add/remove/list> [level] [role].").
|
||||
setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
return;
|
||||
}
|
||||
/*if (((LevelsModule) rixaGuild.getModule("Levels")).getRoleRewards().containsKey(Integer.parseInt(args[2]))) {
|
||||
new MessageBuilder(event.getMember().getAsMention() + ", incorrect usage try [" + args[0] + " <add/remove/list> [level] [role].").
|
||||
setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
return;
|
||||
}*/
|
||||
switch (args[1].toLowerCase()) {
|
||||
case "add":
|
||||
break;
|
||||
case "remove":
|
||||
break;
|
||||
default:
|
||||
new MessageBuilder(event.getMember().getAsMention() + ", incorrect usage try [" + args[0] + " <add/remove/list> [level] [role].").
|
||||
setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
switch(args[1].toLowerCase()) {
|
||||
case "list":
|
||||
Map<Integer, String> rewards = new HashMap<>();
|
||||
/* ((LevelsModule) rixaGuild.getModule("Levels")).getRoleRewards().forEach((integer, s) -> {
|
||||
|
||||
});*/
|
||||
break;
|
||||
default:
|
||||
new MessageBuilder(event.getMember().getAsMention() + ", incorrect usage try [" + args[0] + " <add/remove/list> [level] [role].").
|
||||
setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
new MessageBuilder(event.getMember().getAsMention() + ", incorrect usage try [" + args[0] + " <add/remove/list> [level] [role].").
|
||||
setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isInt(String s) {
|
||||
try {
|
||||
Integer.parseInt(s);
|
||||
return true;
|
||||
} catch (NumberFormatException ex) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
@ -1,22 +0,0 @@
|
||||
package me.savvy.rixa.commands.admin;
|
||||
|
||||
import me.savvy.rixa.commands.handlers.Command;
|
||||
import me.savvy.rixa.commands.handlers.CommandExec;
|
||||
import me.savvy.rixa.commands.handlers.CommandType;
|
||||
import net.dv8tion.jda.core.entities.ChannelType;
|
||||
import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent;
|
||||
|
||||
/**
|
||||
* Created by savit on 7/14/2017.
|
||||
*/
|
||||
public class TwitterCommand implements CommandExec {
|
||||
|
||||
@Command(
|
||||
description = "Configure twitter module.",
|
||||
type = CommandType.ADMIN,
|
||||
channelType = ChannelType.TEXT,
|
||||
usage = "%ptwitter", mainCommand = "twitter")
|
||||
public void execute(GuildMessageReceivedEvent event) {
|
||||
|
||||
}
|
||||
}
|
@ -1,77 +0,0 @@
|
||||
package me.savvy.rixa.commands.general;
|
||||
|
||||
import me.savvy.rixa.commands.handlers.Command;
|
||||
import me.savvy.rixa.commands.handlers.CommandExec;
|
||||
import me.savvy.rixa.guild.RixaGuild;
|
||||
import me.savvy.rixa.guild.management.Guilds;
|
||||
import me.savvy.rixa.old.RixaColor;
|
||||
import me.savvy.rixa.utils.MessageBuilder;
|
||||
import net.dv8tion.jda.core.entities.ChannelType;
|
||||
import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent;
|
||||
|
||||
import java.awt.*;
|
||||
import java.io.File;
|
||||
|
||||
public class ColorCommand implements CommandExec {
|
||||
|
||||
@Override
|
||||
@Command(mainCommand = "color",
|
||||
description = "View a HEX/RGB Color!",
|
||||
channelType = ChannelType.TEXT)
|
||||
public void execute(GuildMessageReceivedEvent event) {
|
||||
RixaGuild rixaGuild = Guilds.getGuild(event.getGuild());
|
||||
String message = event.getMessage().getContent();
|
||||
message = message.replace(rixaGuild.getGuildSettings().getPrefix() + "color ", "");
|
||||
RixaColor rixaColor = RixaColor.getInstance();
|
||||
Color color = null;
|
||||
if (message.startsWith("#")) {
|
||||
try {
|
||||
color = Color.decode(message);
|
||||
} catch (NumberFormatException ex) {
|
||||
new MessageBuilder(message + " is not a number! Example: `" +
|
||||
rixaGuild.getGuildSettings().getPrefix() + "color #212121`").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
String[] args = message.split(" ");
|
||||
if (args.length != 3) {
|
||||
new MessageBuilder(message + " is not a number! Example: `" +
|
||||
rixaGuild.getGuildSettings().getPrefix() + "color 6 2 9`").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
return;
|
||||
}
|
||||
int r = 0, g = 0, b = 0;
|
||||
for(int i = 0; i < args.length; i++) {
|
||||
Integer x;
|
||||
try {
|
||||
x = Integer.parseInt(args[i]);
|
||||
} catch (NumberFormatException ex) {
|
||||
new MessageBuilder(args[i] + " is not a number! Example: `" +
|
||||
rixaGuild.getGuildSettings().getPrefix() + "color 6 2 9`").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
return;
|
||||
}
|
||||
switch (i) {
|
||||
case 0:
|
||||
r = x;
|
||||
break;
|
||||
case 1:
|
||||
g = x;
|
||||
break;
|
||||
case 2:
|
||||
b = x;
|
||||
}
|
||||
}
|
||||
try {
|
||||
color = new Color(r, g, b);
|
||||
} catch (IllegalArgumentException ex) {
|
||||
new MessageBuilder(ex.getMessage()).setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
File file = rixaColor.coverIMG(color);
|
||||
String hex = String.format("#%02x%02x%02x", color.getRed(), color.getGreen(), color.getBlue());
|
||||
net.dv8tion.jda.core.MessageBuilder msg = new net.dv8tion.jda.core.MessageBuilder();
|
||||
msg.setEmbed(new MessageBuilder("Hex: " + hex + ", RGB: " + color.getRed() + ", " + color.getGreen() + ", " + color.getBlue()).getBuilder().build());
|
||||
event.getChannel().sendFile(file, msg.build()).queue();
|
||||
}
|
||||
}
|
@ -1,32 +0,0 @@
|
||||
package me.savvy.rixa.commands.general;
|
||||
|
||||
import me.savvy.rixa.commands.handlers.Command;
|
||||
import me.savvy.rixa.commands.handlers.CommandExec;
|
||||
import me.savvy.rixa.guild.RixaGuild;
|
||||
import me.savvy.rixa.guild.management.Guilds;
|
||||
import me.savvy.rixa.utils.MessageBuilder;
|
||||
import net.dv8tion.jda.core.entities.ChannelType;
|
||||
import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent;
|
||||
|
||||
/**
|
||||
* Created by Timber on 5/23/2017.
|
||||
*/
|
||||
public class FeaturesCommand implements CommandExec {
|
||||
|
||||
@Override
|
||||
@Command(mainCommand = "features",
|
||||
description = "List Rixa Features!",
|
||||
aliases = {"feature"},
|
||||
channelType = ChannelType.TEXT)
|
||||
public void execute(GuildMessageReceivedEvent event) {
|
||||
RixaGuild rixaGuild = Guilds.getGuild(event.getGuild());
|
||||
String[] features = {
|
||||
"Music", "Economy", "Moderation", "Server List", "User Profiles",
|
||||
"Role Management", "Fun Commands", "Custom Commands", "Games", "& more."
|
||||
};
|
||||
new MessageBuilder(
|
||||
features.length == 0 ? "There are currently no features listed." :
|
||||
"Rixa Features: " + String.join("\n", features
|
||||
)).setColor(event.getMember().getColor()).complete(event.getChannel());
|
||||
}
|
||||
}
|
@ -1,97 +0,0 @@
|
||||
package me.savvy.rixa.commands.general;
|
||||
|
||||
import me.savvy.rixa.Rixa;
|
||||
import me.savvy.rixa.commands.handlers.Command;
|
||||
import me.savvy.rixa.commands.handlers.CommandExec;
|
||||
import me.savvy.rixa.commands.handlers.CommandType;
|
||||
import net.dv8tion.jda.core.EmbedBuilder;
|
||||
import net.dv8tion.jda.core.JDA;
|
||||
import net.dv8tion.jda.core.JDAInfo;
|
||||
import net.dv8tion.jda.core.entities.ChannelType;
|
||||
import net.dv8tion.jda.core.entities.Member;
|
||||
import net.dv8tion.jda.core.entities.MessageEmbed;
|
||||
import net.dv8tion.jda.core.entities.User;
|
||||
import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent;
|
||||
|
||||
import java.time.OffsetDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.Date;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
/**
|
||||
* Created by Timber on 5/7/2017.
|
||||
*/
|
||||
public class InfoCommand implements CommandExec {
|
||||
|
||||
@Command(
|
||||
description = "Receive information about Rixa",
|
||||
type = CommandType.USER,
|
||||
channelType = ChannelType.TEXT,
|
||||
usage = "%pinfo", mainCommand = "info")
|
||||
public void execute(GuildMessageReceivedEvent event) {
|
||||
EmbedBuilder messageEmbed = new EmbedBuilder();
|
||||
String[] messages = event.getMessage().getContent().split(" ");
|
||||
if(messages.length == 1) {
|
||||
User botOwner = event.getJDA().getUserById("202944101333729280");
|
||||
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM/dd/yyyy HH:mm:ss");
|
||||
Date date1 = new Date(Rixa.getTimeUp());
|
||||
Date date2 = new Date();
|
||||
long difference = date2.getTime() - date1.getTime();
|
||||
long seconds = difference / 1000;
|
||||
int day = (int) TimeUnit.SECONDS.toDays(seconds);
|
||||
long hours = TimeUnit.SECONDS.toHours(seconds) - (day * 24);
|
||||
long minute = TimeUnit.SECONDS.toMinutes(seconds) - (TimeUnit.SECONDS.toHours(seconds) * 60);
|
||||
long second = TimeUnit.SECONDS.toSeconds(seconds) - (TimeUnit.SECONDS.toMinutes(seconds) * 60);
|
||||
int guildCount = 0;
|
||||
int userCount = 0;
|
||||
for (JDA jda : Rixa.getShardsList()) {
|
||||
guildCount += jda.getGuilds().size();
|
||||
userCount += jda.getUsers().size();
|
||||
}
|
||||
messageEmbed
|
||||
.setTitle("Rixa Discord Bot", "http://rixa.io/")
|
||||
.setDescription("Rixa is a user-friendly, multi-purpose bot currently in development which is capable of being customized to your Discord server needs. " +
|
||||
"Rixa is complete with a dashboard, user profile, server statistics system, and many more features such as assigning roles on user join, music module, " +
|
||||
"levels, and more. Rixa was created to bring ease and simplicity to managing Discord servers, and has since grown into much more than just a bot used for " +
|
||||
"moderation.")
|
||||
.addField("Created", event.getJDA().getSelfUser().getCreationTime().format(formatter), true)
|
||||
.addField("Bot Uptime ", "Uptime: " + day + " days " + hours + " hours " + minute + " minutes " + second + " seconds.", true)
|
||||
.addField("Total Guilds", String.valueOf(guildCount), true)
|
||||
.addField("Total Users", String.valueOf(userCount), true)
|
||||
.addField("JDA Version", JDAInfo.VERSION, true)
|
||||
.addField("Rixa Developer", botOwner.getName() + "#" + botOwner.getDiscriminator(), true)
|
||||
.setFooter("Requested by " + event.getAuthor().getName() + "#" + event.getAuthor().getDiscriminator(), event.getAuthor().getAvatarUrl());
|
||||
event.getChannel().sendMessage(messageEmbed.build()).queue();
|
||||
|
||||
} else if(messages.length >= 2) {
|
||||
if(event.getMessage().getMentionedUsers().size() != 1) {
|
||||
return;
|
||||
}
|
||||
|
||||
User user = event.getMessage().getMentionedUsers().get(0);
|
||||
Member member = event.getGuild().getMember(user);
|
||||
OffsetDateTime time = user.getCreationTime();
|
||||
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMM/dd/yyyy HH:mm:ss");
|
||||
EmbedBuilder eb = new EmbedBuilder();
|
||||
if(member.getGame() != null) {
|
||||
eb.setDescription("Playing **" + member.getGame().getName() + "**");
|
||||
}
|
||||
eb.setAuthor("User Information: " + user.getName(), null, user.getAvatarUrl());
|
||||
eb.setColor(member.getColor());
|
||||
eb.setThumbnail(user.getAvatarUrl());
|
||||
|
||||
eb.addField("User", user.getAsMention(), true)
|
||||
.addField("ID", user.getId(), true)
|
||||
.addField("Roles", String.valueOf(member.getRoles().size()), true)
|
||||
.addField("Status", member.getOnlineStatus().name(), true)
|
||||
.addField("Mutual Guilds", String.valueOf(user.getMutualGuilds().size()), true);
|
||||
if(member.getNickname() != null) {
|
||||
eb.addField("Nickname", member.getNickname(), true);
|
||||
}
|
||||
eb.addField("Created", time.format(formatter), true)
|
||||
.addField("Joined", member.getJoinDate().format(formatter), true);
|
||||
MessageEmbed embed = eb.build();
|
||||
event.getChannel().sendMessage(embed).complete();
|
||||
}
|
||||
}
|
||||
}
|
@ -1,32 +0,0 @@
|
||||
package me.savvy.rixa.commands.general;
|
||||
|
||||
import me.savvy.rixa.commands.handlers.Command;
|
||||
import me.savvy.rixa.commands.handlers.CommandExec;
|
||||
import me.savvy.rixa.guild.RixaGuild;
|
||||
import me.savvy.rixa.guild.management.Guilds;
|
||||
import me.savvy.rixa.modules.levels.LevelsModule;
|
||||
import me.savvy.rixa.utils.MessageBuilder;
|
||||
import net.dv8tion.jda.core.entities.ChannelType;
|
||||
import net.dv8tion.jda.core.entities.Message;
|
||||
import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent;
|
||||
|
||||
public class LeaderboardCommand implements CommandExec {
|
||||
|
||||
@Override
|
||||
@Command(mainCommand = "leaderboard",
|
||||
description = "Check your ping!",
|
||||
aliases = {"leaderboards", "levels"},
|
||||
channelType = ChannelType.TEXT)
|
||||
public void execute(GuildMessageReceivedEvent event) {
|
||||
RixaGuild rixaGuild = Guilds.getGuild(event.getGuild());
|
||||
if (!((LevelsModule) rixaGuild.getModule("Levels")).isEnabled()) {
|
||||
new MessageBuilder("Levels are not enabled on this server!").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
return;
|
||||
}
|
||||
Message message = event.getChannel().sendMessage
|
||||
(((LevelsModule) rixaGuild.getModule("Levels")).leaderboard
|
||||
(event.getMember(), 1).getBuilder().build()).complete();
|
||||
message.addReaction("\u2B05").complete();
|
||||
message.addReaction("\u27A1").complete();
|
||||
}
|
||||
}
|
@ -1,90 +0,0 @@
|
||||
package me.savvy.rixa.commands.general;
|
||||
|
||||
import me.savvy.rixa.Rixa;
|
||||
import me.savvy.rixa.commands.handlers.Command;
|
||||
import me.savvy.rixa.commands.handlers.CommandExec;
|
||||
import me.savvy.rixa.guild.RixaGuild;
|
||||
import me.savvy.rixa.guild.management.Guilds;
|
||||
import me.savvy.rixa.guild.user.UserData;
|
||||
import me.savvy.rixa.modules.levels.LevelsModule;
|
||||
import me.savvy.rixa.utils.MessageBuilder;
|
||||
import me.savvy.rixa.utils.Utils;
|
||||
import net.dv8tion.jda.core.entities.ChannelType;
|
||||
import net.dv8tion.jda.core.entities.Member;
|
||||
import net.dv8tion.jda.core.entities.User;
|
||||
import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent;
|
||||
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Created by savit on 7/11/2017.
|
||||
*/
|
||||
public class LevelsCommand implements CommandExec {
|
||||
|
||||
@Override
|
||||
@Command(mainCommand = "rank",
|
||||
description = "View your levels!",
|
||||
channelType = ChannelType.TEXT)
|
||||
public void execute(GuildMessageReceivedEvent event) {
|
||||
RixaGuild rixaGuild = Guilds.getGuild(event.getGuild());
|
||||
if (!rixaGuild.getModule("Levels").isEnabled()) {
|
||||
new MessageBuilder("Levels are not enabled on this server!").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
return;
|
||||
}
|
||||
|
||||
List<Member> memberList = Utils.memberSearch(event.getGuild(), event.getMessage().getContent(), false);
|
||||
|
||||
if (event.getMessage().getContent().split(" ").length == 2) {
|
||||
if (memberList.size() < 1) {
|
||||
new MessageBuilder(event.getMember().getAsMention() + ", incorrect usage try [" + rixaGuild.getGuildSettings().getPrefix() + "rank <user>].").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
return;
|
||||
}
|
||||
if (memberList.get(0) == null) {
|
||||
new MessageBuilder(event.getMember().getAsMention() + ", couldn't find user.").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
return;
|
||||
}
|
||||
getInfo(rixaGuild, memberList.get(0)).queue(event.getChannel());
|
||||
return;
|
||||
}
|
||||
getInfo(rixaGuild, event.getMember()).queue(event.getChannel());
|
||||
}
|
||||
|
||||
public MessageBuilder getInfo(RixaGuild rixaGuild, Member member) {
|
||||
User author = member.getUser();
|
||||
UserData data = ((LevelsModule) rixaGuild.getModule("Levels")).getUserData(author.getId());
|
||||
String query = "SELECT * FROM `levels` WHERE `guild_id` = '" + rixaGuild.getGuild().getId() + "' ORDER BY `experience` DESC";
|
||||
ResultSet rs = null;
|
||||
try {
|
||||
rs = Rixa.getDatabase().getPreparedStatement(query).executeQuery();
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
int rowNumber = 0;
|
||||
String rank = "Not found.";
|
||||
try {
|
||||
rs.beforeFirst();
|
||||
while (rs.next()) {
|
||||
rowNumber++;
|
||||
if (rs.getString("user_id").equalsIgnoreCase(author.getId())) {
|
||||
rank = String.valueOf(rowNumber);
|
||||
break;
|
||||
}
|
||||
}
|
||||
rs.close();
|
||||
} catch(SQLException ignored) {
|
||||
ignored.printStackTrace();
|
||||
}
|
||||
return new MessageBuilder()
|
||||
.setAuthor(author.getName(), author.getEffectiveAvatarUrl(), author.getEffectiveAvatarUrl())
|
||||
.setTitle(author.getName() + "'s level")
|
||||
.setColor(member.getColor())
|
||||
.addField("Rank", rank, true)
|
||||
.addField("Level", String.valueOf(data.getLevel()), true)
|
||||
.addField("Exp Needed",
|
||||
data.getRemainingExperience() + "/" + data.getNeededXP
|
||||
(data.getLevelFromExperience(data.getExperience())).intValue(), false)
|
||||
.addField("Total Exp", String.valueOf(data.getExperience()), true);
|
||||
}
|
||||
}
|
@ -1,25 +0,0 @@
|
||||
package me.savvy.rixa.commands.general;
|
||||
|
||||
import me.savvy.rixa.commands.handlers.Command;
|
||||
import me.savvy.rixa.commands.handlers.CommandExec;
|
||||
import me.savvy.rixa.guild.RixaGuild;
|
||||
import me.savvy.rixa.guild.management.Guilds;
|
||||
import me.savvy.rixa.utils.MessageBuilder;
|
||||
import net.dv8tion.jda.core.entities.ChannelType;
|
||||
import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent;
|
||||
|
||||
/**
|
||||
* Created by Timber on 5/23/2017.
|
||||
*/
|
||||
public class ModulesCommand implements CommandExec {
|
||||
|
||||
@Override
|
||||
@Command(mainCommand = "modules",
|
||||
description = "List Rixa Modules!",
|
||||
aliases = {"module"},
|
||||
channelType = ChannelType.TEXT)
|
||||
public void execute(GuildMessageReceivedEvent event) {
|
||||
RixaGuild rixaGuild = Guilds.getGuild(event.getGuild());
|
||||
new MessageBuilder("Available Rixa Modules: " + String.join(", ", rixaGuild.getModules().keySet())).setColor(event.getMember().getColor()).complete(event.getChannel());
|
||||
}
|
||||
}
|
@ -1,443 +0,0 @@
|
||||
package me.savvy.rixa.commands.general;
|
||||
|
||||
import com.sedmelluq.discord.lavaplayer.player.AudioLoadResultHandler;
|
||||
import com.sedmelluq.discord.lavaplayer.player.AudioPlayer;
|
||||
import com.sedmelluq.discord.lavaplayer.player.AudioPlayerManager;
|
||||
import com.sedmelluq.discord.lavaplayer.player.DefaultAudioPlayerManager;
|
||||
import com.sedmelluq.discord.lavaplayer.source.AudioSourceManagers;
|
||||
import com.sedmelluq.discord.lavaplayer.source.bandcamp.BandcampAudioSourceManager;
|
||||
import com.sedmelluq.discord.lavaplayer.source.beam.BeamAudioSourceManager;
|
||||
import com.sedmelluq.discord.lavaplayer.source.http.HttpAudioSourceManager;
|
||||
import com.sedmelluq.discord.lavaplayer.source.local.LocalAudioSourceManager;
|
||||
import com.sedmelluq.discord.lavaplayer.source.soundcloud.SoundCloudAudioSourceManager;
|
||||
import com.sedmelluq.discord.lavaplayer.source.twitch.TwitchStreamAudioSourceManager;
|
||||
import com.sedmelluq.discord.lavaplayer.source.vimeo.VimeoAudioSourceManager;
|
||||
import com.sedmelluq.discord.lavaplayer.source.youtube.YoutubeAudioSourceManager;
|
||||
import com.sedmelluq.discord.lavaplayer.tools.FriendlyException;
|
||||
import com.sedmelluq.discord.lavaplayer.track.AudioPlaylist;
|
||||
import com.sedmelluq.discord.lavaplayer.track.AudioTrack;
|
||||
import me.savvy.rixa.commands.handlers.Command;
|
||||
import me.savvy.rixa.commands.handlers.CommandExec;
|
||||
import me.savvy.rixa.commands.handlers.CommandType;
|
||||
import me.savvy.rixa.guild.RixaGuild;
|
||||
import me.savvy.rixa.guild.management.Guilds;
|
||||
import me.savvy.rixa.modules.music.MusicManager;
|
||||
import me.savvy.rixa.modules.music.MusicModule;
|
||||
import me.savvy.rixa.modules.music.TrackScheduler;
|
||||
import me.savvy.rixa.utils.MessageBuilder;
|
||||
import me.savvy.rixa.utils.YoutubeSearch;
|
||||
import net.dv8tion.jda.core.EmbedBuilder;
|
||||
import net.dv8tion.jda.core.Permission;
|
||||
import net.dv8tion.jda.core.entities.*;
|
||||
import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent;
|
||||
import net.dv8tion.jda.core.exceptions.PermissionException;
|
||||
|
||||
import java.awt.*;
|
||||
import java.io.IOException;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Queue;
|
||||
import java.util.logging.Level;
|
||||
|
||||
/**
|
||||
* Created by Timber on 6/6/2017.
|
||||
*/
|
||||
public class MusicCommand implements CommandExec {
|
||||
|
||||
private final int DEFAULT_VOLUME = 35; //(0 - 150, where 100 is default max volume)
|
||||
private final AudioPlayerManager playerManager;
|
||||
private final Map<String, MusicManager> musicManagers;
|
||||
public MusicCommand() {
|
||||
java.util.logging.Logger.getLogger("org.apache.http.client.protocol.ResponseProcessCookies").setLevel(Level.OFF);
|
||||
this.playerManager = new DefaultAudioPlayerManager();
|
||||
AudioSourceManagers.registerRemoteSources(playerManager);
|
||||
playerManager.registerSourceManager(new YoutubeAudioSourceManager());
|
||||
playerManager.registerSourceManager(new SoundCloudAudioSourceManager());
|
||||
playerManager.registerSourceManager(new BandcampAudioSourceManager());
|
||||
playerManager.registerSourceManager(new VimeoAudioSourceManager());
|
||||
playerManager.registerSourceManager(new TwitchStreamAudioSourceManager());
|
||||
playerManager.registerSourceManager(new HttpAudioSourceManager());
|
||||
playerManager.registerSourceManager(new LocalAudioSourceManager());
|
||||
playerManager.registerSourceManager(new BeamAudioSourceManager());
|
||||
musicManagers = new HashMap<>();
|
||||
}
|
||||
|
||||
@Command(description = "Play music in your voice chat.",
|
||||
type = CommandType.USER,
|
||||
channelType = ChannelType.TEXT,
|
||||
usage = "%pmusic", mainCommand = "music")
|
||||
public void execute(GuildMessageReceivedEvent event) {
|
||||
Guild guild = event.getGuild();
|
||||
RixaGuild rixaGuild = Guilds.getGuild(guild);
|
||||
MusicModule module = ((MusicModule) rixaGuild.getModule("Music"));
|
||||
if(!module.isEnabled()) {
|
||||
new MessageBuilder("Sorry music is not enabled on `" + guild.getName() + "`!").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
return;
|
||||
}
|
||||
if(module.isRoleRequired()) {
|
||||
Role role = event.getGuild().getRoleById(module.getMusicRole());
|
||||
boolean hasRole = false;
|
||||
for (Role roleItem : event.getMember().getRoles()) {
|
||||
if (roleItem.getId().equalsIgnoreCase(role.getId())) {
|
||||
hasRole = true;
|
||||
}
|
||||
}
|
||||
if(!hasRole) {
|
||||
new MessageBuilder("You must have the " + role.getName() + " role to use the music module.").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
return;
|
||||
}
|
||||
}
|
||||
String[] message = event.getMessage().getContent().split(" ");
|
||||
MusicManager mng = getMusicManager(guild);
|
||||
AudioPlayer player = mng.player;
|
||||
TrackScheduler scheduler = mng.scheduler;
|
||||
// music join <channel>
|
||||
if(message.length == 1) {
|
||||
sendHelp(event.getGuild().getId(), rixaGuild.getGuildSettings().getPrefix(), event.getAuthor(), event.getChannel());
|
||||
} else if (message.length == 2) {
|
||||
if(message[1].equalsIgnoreCase("join") || message[1].equalsIgnoreCase("summon") ) {
|
||||
if (event.getMember().getVoiceState().getChannel() == null) {
|
||||
new MessageBuilder("You must be in a voice channel to summon me!").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
return;
|
||||
}
|
||||
try {
|
||||
VoiceChannel channel = event.getMember().getVoiceState().getChannel();
|
||||
guild.getAudioManager().openAudioConnection(channel);
|
||||
new MessageBuilder("Entering Voice Channel: " + channel.getName()).setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
} catch (PermissionException e) {
|
||||
if (e.getPermission() == Permission.VOICE_CONNECT) {
|
||||
new MessageBuilder("I do not have permission to join the requested voice channel.").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
}
|
||||
}
|
||||
} else if (message[1].equalsIgnoreCase("reset")) {
|
||||
synchronized (musicManagers) {
|
||||
scheduler.queue.clear();
|
||||
player.destroy();
|
||||
guild.getAudioManager().setSendingHandler(null);
|
||||
musicManagers.remove(guild.getId());
|
||||
}
|
||||
mng = getMusicManager(guild);
|
||||
guild.getAudioManager().setSendingHandler(mng.sendHandler);
|
||||
new MessageBuilder("The player has been completely reset!").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
} else if (message[1].equalsIgnoreCase("skip")) {
|
||||
scheduler.nextTrack();
|
||||
new MessageBuilder("Successfully skipped current track.").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
} else if(message[1].equalsIgnoreCase("play") || message[1].equalsIgnoreCase("resume")) {
|
||||
if (player.isPaused()) {
|
||||
player.setPaused(false);
|
||||
new MessageBuilder("MusicPlayer resumed track: " + player.getPlayingTrack().getInfo().title).setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
} else if (player.getPlayingTrack() != null) {
|
||||
new MessageBuilder("MusicPlayer already playing track: " + player.getPlayingTrack().getInfo().title).setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
} else if (scheduler.queue.isEmpty()) {
|
||||
new MessageBuilder("The audio queue is empty! Add a track to the queue first!").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
}
|
||||
} else if (message[1].equalsIgnoreCase("leave")) {
|
||||
String desc = "";
|
||||
AudioTrack track = scheduler.nextTrack();
|
||||
if(track != null) {
|
||||
desc += "Track skipped. ";
|
||||
}
|
||||
new MessageBuilder(desc + "Leaving voice channel...").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
guild.getAudioManager().setSendingHandler(null);
|
||||
guild.getAudioManager().closeAudioConnection();
|
||||
} else if(message[1].equalsIgnoreCase("link")) {
|
||||
if (player.getPlayingTrack() == null) {
|
||||
new MessageBuilder("There is no track currently playing.").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
return;
|
||||
}
|
||||
new MessageBuilder("Track Name: " + player.getPlayingTrack().getInfo().title + "\n Track Link: " +
|
||||
player.getPlayingTrack().getInfo().uri).setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
} else if(message[1].equalsIgnoreCase("pause")) {
|
||||
if (player.getPlayingTrack() == null) {
|
||||
new MessageBuilder("There is no track currently playing.").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
return;
|
||||
}
|
||||
player.setPaused(!player.isPaused());
|
||||
if (player.isPaused()) {
|
||||
new MessageBuilder("The music player has been paused.").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
} else {
|
||||
new MessageBuilder("There music player has resumed playing.").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
}
|
||||
} else if(message[1].equalsIgnoreCase("stop")) {
|
||||
scheduler.queue.clear();
|
||||
player.stopTrack();
|
||||
player.setPaused(false);
|
||||
new MessageBuilder("The music player has been stopped and queue has been cleared.").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
} else if(message[1].equalsIgnoreCase("vol") || message[1].equalsIgnoreCase("volume")) {
|
||||
new MessageBuilder("Music player volume is currently at: " + player.getVolume()).setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
} else if(message[1].equalsIgnoreCase("restart")) {
|
||||
AudioTrack track = player.getPlayingTrack();
|
||||
if (track == null) {
|
||||
track = scheduler.lastTrack;
|
||||
}
|
||||
if (track != null) {
|
||||
new MessageBuilder("Restarting Track: " + track.getInfo().title).setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
player.playTrack(track.makeClone());
|
||||
} else {
|
||||
new MessageBuilder("No track has been previously played.").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
}
|
||||
} else if(message[1].equalsIgnoreCase("repeat")) {
|
||||
scheduler.setRepeating(!scheduler.isRepeating());
|
||||
new MessageBuilder("Repeat on music play has been " + (scheduler.isRepeating() ? "enabled" : "disabled")).setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
} else if(message[1].equalsIgnoreCase("np") || message[1].equalsIgnoreCase("nowplaying")) {
|
||||
AudioTrack currentTrack = player.getPlayingTrack();
|
||||
if (currentTrack != null) {
|
||||
String title = currentTrack.getInfo().title;
|
||||
String position = getTimestamp(currentTrack.getPosition());
|
||||
String duration = getTimestamp(currentTrack.getDuration());
|
||||
new MessageBuilder(String.format("Now Playing: %s [%s / %s]", title, position, duration)).setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
} else {
|
||||
new MessageBuilder("The music player is not playing anything!").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
}
|
||||
} else if(message[1].equalsIgnoreCase("list") || message[1].equalsIgnoreCase("queue") || message[1].equalsIgnoreCase("q")) {
|
||||
Queue<AudioTrack> queue = scheduler.queue;
|
||||
synchronized (queue) {
|
||||
if (queue.isEmpty()) {
|
||||
new MessageBuilder("The queue is currently empty!").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
} else {
|
||||
int trackCount = 0;
|
||||
long queueLength = 0;
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append("Current Queue Entries: ").append(queue.size()).append("\n\n");
|
||||
for (AudioTrack track : queue) {
|
||||
queueLength += track.getDuration();
|
||||
if (trackCount < 10) {
|
||||
sb.append("`[").append(getTimestamp(track.getDuration())).append("]` ");
|
||||
sb.append(track.getInfo().title).append("\n");
|
||||
trackCount++;
|
||||
}
|
||||
}
|
||||
sb.append("\n").append("Total Queue Time Length: ").append(getTimestamp(queueLength));
|
||||
new MessageBuilder(sb.toString().trim()).setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
}
|
||||
}
|
||||
} else if(message[1].equalsIgnoreCase("shuffle")) {
|
||||
if (scheduler.queue.isEmpty()) {
|
||||
new MessageBuilder("The queue is currently empty!").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
return;
|
||||
}
|
||||
scheduler.shuffle();
|
||||
new MessageBuilder("The queue has been shuffled!").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
} else {
|
||||
sendHelp(event.getGuild().getId(), rixaGuild.getGuildSettings().getPrefix(), event.getAuthor(), event.getChannel());
|
||||
}
|
||||
} else if (message.length == 3) {
|
||||
if(message[1].equalsIgnoreCase("join")) {
|
||||
VoiceChannel chan = null;
|
||||
String channelName = message[2];//getMessage(message, 2).trim();
|
||||
if (guild.getVoiceChannelsByName(channelName, true).size() >= 1) {
|
||||
chan = guild.getVoiceChannelsByName(channelName, true).get(0);
|
||||
} else {
|
||||
for (VoiceChannel voiceChannel : guild.getVoiceChannels()) {
|
||||
if (voiceChannel.getName().contains(channelName) || voiceChannel.getName().equalsIgnoreCase(channelName) ||
|
||||
voiceChannel.getId().equalsIgnoreCase(channelName)) {
|
||||
chan = voiceChannel;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (chan == null) {
|
||||
new MessageBuilder("Sorry I was unable to find the VoiceChannel: `" + channelName + "`.").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
} else {
|
||||
synchronized (musicManagers) {
|
||||
player.destroy();
|
||||
guild.getAudioManager().setSendingHandler(null);
|
||||
musicManagers.remove(guild.getId());
|
||||
}
|
||||
mng = getMusicManager(guild);
|
||||
guild.getAudioManager().setSendingHandler(mng.sendHandler);
|
||||
try {
|
||||
new MessageBuilder("Entering Voice Channel: " + chan.getName()).setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
guild.getAudioManager().openAudioConnection(chan);
|
||||
} catch (PermissionException e) {
|
||||
if (e.getPermission() == Permission.VOICE_CONNECT) {
|
||||
new MessageBuilder("I do not have permission to join the requested voice channel.").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if(message[1].equalsIgnoreCase("play") || message[1].equalsIgnoreCase("playlist") || message[1].equalsIgnoreCase("pplay")) {
|
||||
if (event.getMember().getVoiceState().getChannel() == null) {
|
||||
new MessageBuilder("You must be in a voice channel to summon me!").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
return;
|
||||
}
|
||||
try {
|
||||
guild.getAudioManager().openAudioConnection(event.getMember().getVoiceState().getChannel());
|
||||
loadAndPlay(mng, event.getChannel(), message[2], (message[2].toLowerCase().contains("playlist")
|
||||
|| message[1].equalsIgnoreCase("playlist")
|
||||
|| message[1].equalsIgnoreCase("pplay")));
|
||||
} catch (PermissionException e) {
|
||||
if (e.getPermission() == Permission.VOICE_CONNECT) {
|
||||
new MessageBuilder("I do not have permission to join the requested voice channel.").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
}
|
||||
}
|
||||
} else if(message[1].equalsIgnoreCase("vol") || message[1].equalsIgnoreCase("volume")) {
|
||||
try {
|
||||
int newVolume = Math.max(10, Math.min(100, Integer.parseInt(message[2])));
|
||||
int oldVolume = player.getVolume();
|
||||
player.setVolume(newVolume);
|
||||
new MessageBuilder("Music player volume changed from " + oldVolume + " to " + newVolume).setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
} catch (NumberFormatException e) {
|
||||
new MessageBuilder(message[2] + " is not a valid integer. Try a number between 10 and 100.").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
}
|
||||
} else {
|
||||
sendHelp(event.getGuild().getId(), rixaGuild.getGuildSettings().getPrefix(), event.getAuthor(), event.getChannel());
|
||||
}
|
||||
} // music youtube <query
|
||||
else if(message.length >= 3) {
|
||||
if(message[1].equalsIgnoreCase("join")) {
|
||||
VoiceChannel chan = null;
|
||||
String channelName = getMessage(message, 2);
|
||||
if (guild.getVoiceChannelsByName(channelName, true).size() >= 1) {
|
||||
chan = guild.getVoiceChannelsByName(channelName, true).get(0);
|
||||
} else {
|
||||
for (VoiceChannel voiceChannel : guild.getVoiceChannels()) {
|
||||
if (voiceChannel.getName().contains(channelName) || voiceChannel.getId().equalsIgnoreCase(channelName)
|
||||
|| voiceChannel.getName().equalsIgnoreCase(channelName)) {
|
||||
chan = voiceChannel;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (chan == null) {
|
||||
new MessageBuilder("Sorry I was unable to find the VoiceChannel: `" + message[2] + "`.").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
} else {
|
||||
synchronized (musicManagers) {
|
||||
player.destroy();
|
||||
guild.getAudioManager().setSendingHandler(null);
|
||||
musicManagers.remove(guild.getId());
|
||||
}
|
||||
mng = getMusicManager(guild);
|
||||
guild.getAudioManager().setSendingHandler(mng.sendHandler);
|
||||
try {
|
||||
new MessageBuilder("Entering Voice Channel: " + chan.getName()).setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
guild.getAudioManager().openAudioConnection(chan);
|
||||
} catch (PermissionException e) {
|
||||
if (e.getPermission() == Permission.VOICE_CONNECT) {
|
||||
new MessageBuilder("I do not have permission to join the requested voice channel.").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if(message[1].equalsIgnoreCase("youtube") || message[1].equalsIgnoreCase("yt") || message[1].equalsIgnoreCase("search")
|
||||
|| message[1].equalsIgnoreCase("ytsearch")) {
|
||||
String search = getMessage(message, 2);
|
||||
try {
|
||||
YoutubeSearch ytSearch = new YoutubeSearch(search);
|
||||
loadAndPlay(mng, event.getChannel(), ytSearch.getUrl(0), false);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
} else {
|
||||
sendHelp(event.getGuild().getId(), rixaGuild.getGuildSettings().getPrefix(), event.getAuthor(), event.getChannel());
|
||||
}
|
||||
} else {
|
||||
sendHelp(event.getGuild().getId(), rixaGuild.getGuildSettings().getPrefix(), event.getAuthor(), event.getChannel());
|
||||
}
|
||||
}
|
||||
|
||||
private void loadAndPlay(MusicManager mng, final TextChannel channel, final String trackUrl, final boolean addPlaylist) {
|
||||
playerManager.loadItemOrdered(mng, trackUrl, new AudioLoadResultHandler() {
|
||||
@Override
|
||||
public void trackLoaded(AudioTrack track) {
|
||||
String msg = "Adding to queue: " + track.getInfo().title;
|
||||
mng.scheduler.queue(track);
|
||||
new MessageBuilder(msg).setColor(Color.decode("#4CC276")).queue(channel);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void playlistLoaded(AudioPlaylist playlist) {
|
||||
AudioTrack firstTrack = playlist.getSelectedTrack();
|
||||
List<AudioTrack> tracks = playlist.getTracks();
|
||||
|
||||
if (firstTrack == null) {
|
||||
firstTrack = playlist.getTracks().get(0);
|
||||
}
|
||||
|
||||
if (addPlaylist) {
|
||||
new MessageBuilder("Adding (" + playlist.getTracks().size() +") tracks to queue from playlist: " + playlist.getName()).setColor(Color.decode("#4CC276")).queue(channel);
|
||||
tracks.forEach(mng.scheduler::queue);
|
||||
} else {
|
||||
new MessageBuilder("Adding to queue " + firstTrack.getInfo().title + " (first track of playlist " + playlist.getName() + ")").setColor(Color.decode("#4CC276")).queue(channel);
|
||||
mng.scheduler.queue(firstTrack);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void noMatches() {
|
||||
new MessageBuilder("Nothing found by " + trackUrl).setColor(Color.decode("#4CC276")).queue(channel);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void loadFailed(FriendlyException exception) {
|
||||
new MessageBuilder("Could not play: " + exception.getMessage()).setColor(Color.decode("#4CC276")).queue(channel);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private MusicManager getMusicManager(Guild guild) {
|
||||
String guildId = guild.getId();
|
||||
MusicManager mng = musicManagers.get(guildId);
|
||||
if (mng == null)
|
||||
{
|
||||
synchronized (musicManagers)
|
||||
{
|
||||
mng = musicManagers.get(guildId);
|
||||
if (mng == null)
|
||||
{
|
||||
mng = new MusicManager(playerManager);
|
||||
mng.player.setVolume(DEFAULT_VOLUME);
|
||||
musicManagers.put(guildId, mng);
|
||||
}
|
||||
}
|
||||
}
|
||||
return mng;
|
||||
}
|
||||
|
||||
private static String getTimestamp(long milliseconds) {
|
||||
int seconds = (int) (milliseconds / 1000) % 60 ;
|
||||
int minutes = (int) ((milliseconds / (1000 * 60)) % 60);
|
||||
int hours = (int) ((milliseconds / (1000 * 60 * 60)) % 24);
|
||||
|
||||
if (hours > 0)
|
||||
return String.format("%02d:%02d:%02d", hours, minutes, seconds);
|
||||
else
|
||||
return String.format("%02d:%02d", minutes, seconds);
|
||||
}
|
||||
|
||||
private String getMessage(String[] messages, int argToBegin) {
|
||||
StringBuilder builder = new StringBuilder();
|
||||
for(int i = argToBegin; i < messages.length; i++) {
|
||||
builder.append(messages[i]).append(" ");
|
||||
}
|
||||
return builder.toString().trim();
|
||||
}
|
||||
|
||||
private void sendHelp(String title, String prefix, User user, TextChannel textChannel) {
|
||||
EmbedBuilder embedBuilder = new EmbedBuilder();
|
||||
String stringBuilder = "\u2753" +
|
||||
" **Music Commands Help**" +
|
||||
"\n" +
|
||||
"Click a number below for information about other commands.";
|
||||
embedBuilder.setTitle(String.format("Help: %s", title));
|
||||
embedBuilder.setDescription(stringBuilder);
|
||||
embedBuilder.addField(prefix + "music join [name]", "Joins a voice channel that has the provided name", false)
|
||||
.addField(prefix + "music join [id]", "Joins a voice channel based on the provided id.", false)
|
||||
.addField(prefix + "music leave", "Leaves the voice channel that the bot is currently in.", false)
|
||||
.addField(prefix + "music play", "Plays songs from the current queue. Starts playing again if it was previously paused", false)
|
||||
.addField(prefix + "music play [url]", "Adds a new song to the queue and starts playing if it wasn't playing already", false)
|
||||
.addField(prefix + "music playlist", "Adds a playlist to the queue and starts playing if not already playing", false)
|
||||
.addField(prefix + "music pause", "Pauses audio playback", false)
|
||||
.addField(prefix + "music stop", "Completely stops audio playback, skipping the current song.", false)
|
||||
.addField(prefix + "music skip", "Skips the current song, automatically starting the next", false)
|
||||
.addField(prefix + "music nowplaying", "Prints information about the currently playing song (title, current time)", false)
|
||||
.addField(prefix + "music np", "Alias for nowplaying", false)
|
||||
.addField(prefix + "music list", "Lists the songs in the queue", false)
|
||||
.addField(prefix + "music volume [vol]", "Sets the volume of the MusicPlayer [10 - 100]", false)
|
||||
.addField(prefix + "music restart", "Restarts the current song or restarts the previous song if there is no current song playing.", false)
|
||||
.addField(prefix + "music repeat", "Makes the player repeat the currently playing song", false)
|
||||
.addField(prefix + "music reset", "Completely resets the player, fixing all errors and clearing the queue.", false)
|
||||
.addField(prefix + "music shuffle", "Shuffle current music queue.", false);
|
||||
user.openPrivateChannel().complete().sendMessage(embedBuilder.build()).queue();
|
||||
new MessageBuilder(user.getAsMention() + ", help menu delivered in private messages.").setColor(Color.decode("#4CC276")).queue(textChannel);
|
||||
}
|
||||
}
|
@ -1,29 +0,0 @@
|
||||
package me.savvy.rixa.commands.general;
|
||||
|
||||
import me.savvy.rixa.commands.handlers.Command;
|
||||
import me.savvy.rixa.commands.handlers.CommandExec;
|
||||
import me.savvy.rixa.utils.MessageBuilder;
|
||||
import net.dv8tion.jda.core.entities.ChannelType;
|
||||
import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent;
|
||||
|
||||
/**
|
||||
* Created by Timber on 5/23/2017.
|
||||
*/
|
||||
public class PingCommand implements CommandExec {
|
||||
|
||||
@Override
|
||||
@Command(mainCommand = "ping",
|
||||
description = "Check your ping!",
|
||||
channelType = ChannelType.TEXT)
|
||||
public void execute(GuildMessageReceivedEvent event) {
|
||||
new MessageBuilder("Pong!").setColor(event.getMember().getColor()).complete(event.getChannel());
|
||||
/*event.getChannel().sendMessage("Pong").queue(m -> {
|
||||
if(m!=null) {
|
||||
m.editMessage("Pong: " + event.getMessage().getCreationTime().until(m.getEditedTime(), ChronoUnit.MILLIS) + "ms").complete();
|
||||
|
||||
}
|
||||
});*/
|
||||
/*RixaAudioReceiveHandler handle = new RixaAudioReceiveHandler();
|
||||
handle.start(event.getGuild(), event.getMember().getVoiceState().getChannel());*/
|
||||
}
|
||||
}
|
@ -1,43 +0,0 @@
|
||||
package me.savvy.rixa.commands.general;
|
||||
|
||||
import me.savvy.rixa.commands.handlers.Command;
|
||||
import me.savvy.rixa.commands.handlers.CommandExec;
|
||||
import me.savvy.rixa.guild.RixaGuild;
|
||||
import me.savvy.rixa.guild.management.Guilds;
|
||||
import net.dv8tion.jda.core.EmbedBuilder;
|
||||
import net.dv8tion.jda.core.entities.ChannelType;
|
||||
import net.dv8tion.jda.core.entities.User;
|
||||
import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent;
|
||||
|
||||
import java.time.format.DateTimeFormatter;
|
||||
|
||||
/**
|
||||
* Created by Timber on 5/7/2017.
|
||||
*/
|
||||
public class ServerInfoCommand implements CommandExec {
|
||||
|
||||
@Command(usage = "%pserverinfo",
|
||||
channelType = ChannelType.TEXT,
|
||||
description = "Receive information about the server!",
|
||||
aliases = "sinfo", mainCommand = "serverinfo")
|
||||
public void execute(GuildMessageReceivedEvent event) {
|
||||
RixaGuild rixaGuild = Guilds.getGuild(event.getGuild());
|
||||
EmbedBuilder messageEmbed = new EmbedBuilder();
|
||||
User owner = event.getGuild().getOwner().getUser();
|
||||
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM/dd/yyyy HH:mm:ss");
|
||||
messageEmbed
|
||||
.setTitle(event.getGuild().getName(), "http://rixa.io/servers/" + event.getGuild().getId())
|
||||
.setDescription(rixaGuild.getGuildSettings().getDescription())
|
||||
.addField("Created", event.getGuild().getCreationTime().format(formatter), true)
|
||||
.addField("Region", event.getGuild().getRegion().toString(), true)
|
||||
.addField("Users", String.valueOf(event.getGuild().getMembers().size()), true)
|
||||
.addField("Text Channels", String.valueOf(event.getGuild().getTextChannels().size()), true)
|
||||
.addField("Voice Channels", String.valueOf(event.getGuild().getVoiceChannels().size()), true)
|
||||
.addField("Roles", String.valueOf(event.getGuild().getRoles().size()), true)
|
||||
.addField("Owner", owner.getName() + "#" + owner.getDiscriminator(), true)
|
||||
.addField("Enlisted", String.valueOf(rixaGuild.getGuildSettings().isEnlisted()), true)
|
||||
.setThumbnail(event.getGuild().getIconUrl())
|
||||
.setFooter("ServerID: " + event.getGuild().getId(), event.getGuild().getIconUrl());
|
||||
event.getChannel().sendMessage(messageEmbed.build()).queue();
|
||||
}
|
||||
}
|
@ -1,55 +0,0 @@
|
||||
package me.savvy.rixa.commands.general;
|
||||
|
||||
import me.savvy.rixa.commands.handlers.Command;
|
||||
import me.savvy.rixa.commands.handlers.CommandExec;
|
||||
import me.savvy.rixa.utils.MessageBuilder;
|
||||
import me.savvy.rixa.utils.UrbanDictionary;
|
||||
import net.dv8tion.jda.core.entities.ChannelType;
|
||||
import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.net.URLEncoder;
|
||||
|
||||
/**
|
||||
* Created by savit on 6/24/2017.
|
||||
*/
|
||||
public class UrbanDictionaryCommand implements CommandExec {
|
||||
|
||||
@Override
|
||||
@Command(mainCommand = "urbandictionary",
|
||||
aliases = {"ud"},
|
||||
description = "Search urban dictionary for a command!",
|
||||
channelType = ChannelType.TEXT)
|
||||
public void execute(GuildMessageReceivedEvent event) {
|
||||
String[] message = event.getMessage().getContent().split(" ");
|
||||
String search = getMessage(message);
|
||||
UrbanDictionary ud = null;
|
||||
try {
|
||||
ud = new UrbanDictionary(URLEncoder.encode(search, "UTF-8"));
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
if(ud == null) {
|
||||
new MessageBuilder("Search term not found.").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
}
|
||||
try {
|
||||
if(!ud.search()) {
|
||||
new MessageBuilder("Search term not found.").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
return;
|
||||
}
|
||||
} catch (IOException e) {
|
||||
new MessageBuilder("Search term not found.").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||
}
|
||||
new MessageBuilder(ud.getDefinition()).setTitle(String.format("Definition: %s", ud.getWordToSearch())).setColor(event.getMember().getColor())
|
||||
.addThumbnail("https://s-media-cache-ak0.pinimg.com/originals/f2/aa/37/f2aa3712516cfd0cf6f215301d87a7c2.jpg").queue(event.getChannel());
|
||||
}
|
||||
|
||||
private String getMessage(String[] messages) {
|
||||
StringBuilder builder = new StringBuilder();
|
||||
for(int i = 1; i < messages.length; i++) {
|
||||
builder.append(messages[i]).append(" ");
|
||||
}
|
||||
return builder.toString().trim();
|
||||
}
|
||||
}
|
@ -1,41 +0,0 @@
|
||||
package me.savvy.rixa.commands.general;
|
||||
|
||||
import me.savvy.rixa.commands.handlers.Command;
|
||||
import me.savvy.rixa.commands.handlers.CommandExec;
|
||||
import me.savvy.rixa.utils.YoutubeSearch;
|
||||
import net.dv8tion.jda.core.entities.ChannelType;
|
||||
import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
* Created by savit on 7/11/2017.
|
||||
*/
|
||||
public class YoutubeCommand implements CommandExec {
|
||||
|
||||
@Override
|
||||
@Command(mainCommand = "youtube",
|
||||
aliases = {"yt"},
|
||||
description = "Search youtube for music videos!",
|
||||
channelType = ChannelType.TEXT)
|
||||
public void execute(GuildMessageReceivedEvent event) {
|
||||
String[] message = event.getMessage().getContent().split(" ");
|
||||
String search = getMessage(message);
|
||||
try {
|
||||
YoutubeSearch ytSearch = new YoutubeSearch(search);
|
||||
event.getChannel().sendMessage(ytSearch.getUrl(0)).queue();/*
|
||||
new MessageBuilder(ytSearch.getUrl(0))
|
||||
.setColor(event.getMember().getColor()).queue(event.getChannel());*/
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
private String getMessage(String[] messages) {
|
||||
StringBuilder builder = new StringBuilder() ;
|
||||
for(int i = 1; i < messages.length; i++) {
|
||||
builder.append(messages[i]).append(" ");
|
||||
}
|
||||
return builder.toString().trim();
|
||||
}
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user