Compare commits
No commits in common. "3.0" and "master" have entirely different histories.
85
.gitignore
vendored
85
.gitignore
vendored
@ -1,11 +1,10 @@
|
|||||||
# Created by https://www.gitignore.io/api/maven,intellij+iml
|
|
||||||
|
|
||||||
### Intellij+iml ###
|
# Created by https://www.gitignore.io/api/gradle,intellij,intellij+iml
|
||||||
|
|
||||||
|
### Intellij ###
|
||||||
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm
|
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm
|
||||||
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
|
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
|
||||||
|
|
||||||
.idea
|
|
||||||
|
|
||||||
# User-specific stuff:
|
# User-specific stuff:
|
||||||
.idea/**/workspace.xml
|
.idea/**/workspace.xml
|
||||||
.idea/**/tasks.xml
|
.idea/**/tasks.xml
|
||||||
@ -38,9 +37,6 @@ cmake-build-debug/
|
|||||||
# IntelliJ
|
# IntelliJ
|
||||||
/out/
|
/out/
|
||||||
|
|
||||||
#dependencies
|
|
||||||
/jars/
|
|
||||||
|
|
||||||
# mpeltonen/sbt-idea plugin
|
# mpeltonen/sbt-idea plugin
|
||||||
.idea_modules/
|
.idea_modules/
|
||||||
|
|
||||||
@ -50,15 +46,51 @@ atlassian-ide-plugin.xml
|
|||||||
# Cursive Clojure plugin
|
# Cursive Clojure plugin
|
||||||
.idea/replstate.xml
|
.idea/replstate.xml
|
||||||
|
|
||||||
# Ruby plugin and RubyMine
|
|
||||||
/.rakeTasks
|
|
||||||
|
|
||||||
# Crashlytics plugin (for Android Studio and IntelliJ)
|
# Crashlytics plugin (for Android Studio and IntelliJ)
|
||||||
com_crashlytics_export_strings.xml
|
com_crashlytics_export_strings.xml
|
||||||
crashlytics.properties
|
crashlytics.properties
|
||||||
crashlytics-build.properties
|
crashlytics-build.properties
|
||||||
fabric.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 ###
|
### Intellij+iml Patch ###
|
||||||
# Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-249601023
|
# Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-249601023
|
||||||
|
|
||||||
@ -67,18 +99,25 @@ modules.xml
|
|||||||
.idea/misc.xml
|
.idea/misc.xml
|
||||||
*.ipr
|
*.ipr
|
||||||
|
|
||||||
### Maven ###
|
### Gradle ###
|
||||||
target/
|
.gradle
|
||||||
pom.xml.tag
|
/build/
|
||||||
pom.xml.releaseBackup
|
|
||||||
pom.xml.versionsBackup
|
|
||||||
pom.xml.next
|
|
||||||
release.properties
|
|
||||||
dependency-reduced-pom.xml
|
|
||||||
buildNumber.properties
|
|
||||||
.mvn/timing.properties
|
|
||||||
|
|
||||||
# Avoid ignoring Maven wrapper jar file (.jar files are usually ignored)
|
# Ignore Gradle GUI config
|
||||||
!/.mvn/wrapper/maven-wrapper.jar
|
gradle-app.setting
|
||||||
|
|
||||||
# End of https://www.gitignore.io/api/maven,intellij+iml
|
# 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
|
||||||
|
@ -1,18 +0,0 @@
|
|||||||
<?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>
|
|
@ -1,6 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="VcsDirectoryMappings">
|
|
||||||
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
|
||||||
</component>
|
|
||||||
</project>
|
|
@ -1,2 +1,6 @@
|
|||||||
# Rixa
|
# Rixa
|
||||||
Rixa Discord Bot
|
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)
|
||||||
|
1
_config.yml
Normal file
1
_config.yml
Normal file
@ -0,0 +1 @@
|
|||||||
|
theme: jekyll-theme-cayman
|
41
build.gradle
Normal file
41
build.gradle
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
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
Normal file
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
Normal file
Binary file not shown.
6
gradle/wrapper/gradle-wrapper.properties
vendored
Normal file
6
gradle/wrapper/gradle-wrapper.properties
vendored
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
#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
Normal file
164
gradlew
vendored
Normal file
@ -0,0 +1,164 @@
|
|||||||
|
#!/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
Normal file
90
gradlew.bat
vendored
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
@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
131
pom.xml
@ -1,131 +0,0 @@
|
|||||||
<?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>
|
|
@ -1,10 +0,0 @@
|
|||||||
package io.rixa;
|
|
||||||
|
|
||||||
import io.rixa.bot.Rixa;
|
|
||||||
|
|
||||||
public class Main {
|
|
||||||
|
|
||||||
public static void main(String[] args) {
|
|
||||||
Rixa.getInstance();
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,225 +0,0 @@
|
|||||||
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,51 +0,0 @@
|
|||||||
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;
|
|
||||||
}
|
|
@ -1,292 +0,0 @@
|
|||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,50 +0,0 @@
|
|||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,40 +0,0 @@
|
|||||||
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");
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,30 +0,0 @@
|
|||||||
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,83 +0,0 @@
|
|||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,58 +0,0 @@
|
|||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,61 +0,0 @@
|
|||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,33 +0,0 @@
|
|||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,357 +0,0 @@
|
|||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,22 +0,0 @@
|
|||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,48 +0,0 @@
|
|||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,78 +0,0 @@
|
|||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,49 +0,0 @@
|
|||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,45 +0,0 @@
|
|||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,40 +0,0 @@
|
|||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,30 +0,0 @@
|
|||||||
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();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,33 +0,0 @@
|
|||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,89 +0,0 @@
|
|||||||
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
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,113 +0,0 @@
|
|||||||
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();
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,43 +0,0 @@
|
|||||||
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();
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,8 +0,0 @@
|
|||||||
package io.rixa.bot.commands.exceptions;
|
|
||||||
|
|
||||||
public class CommandNotFoundException extends Exception {
|
|
||||||
|
|
||||||
public CommandNotFoundException(String message) {
|
|
||||||
super(message);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,8 +0,0 @@
|
|||||||
package io.rixa.bot.commands.exceptions;
|
|
||||||
|
|
||||||
public class ReactNotFoundException extends Exception {
|
|
||||||
|
|
||||||
public ReactNotFoundException(String message) {
|
|
||||||
super(message);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,38 +0,0 @@
|
|||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,8 +0,0 @@
|
|||||||
package io.rixa.bot.commands.handler;
|
|
||||||
|
|
||||||
public enum CommandType {
|
|
||||||
|
|
||||||
STAFF,
|
|
||||||
USER,
|
|
||||||
OWNER;
|
|
||||||
}
|
|
@ -1,24 +0,0 @@
|
|||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,21 +0,0 @@
|
|||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,72 +0,0 @@
|
|||||||
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,40 +0,0 @@
|
|||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,13 +0,0 @@
|
|||||||
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));
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,133 +0,0 @@
|
|||||||
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) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,31 +0,0 @@
|
|||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,101 +0,0 @@
|
|||||||
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());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,131 +0,0 @@
|
|||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,7 +0,0 @@
|
|||||||
package io.rixa.bot.guild.enums;
|
|
||||||
|
|
||||||
public enum PermissionType {
|
|
||||||
|
|
||||||
USER,
|
|
||||||
GUILD
|
|
||||||
}
|
|
@ -1,61 +0,0 @@
|
|||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,24 +0,0 @@
|
|||||||
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);
|
|
||||||
}
|
|
@ -1,9 +0,0 @@
|
|||||||
package io.rixa.bot.guild.manager;
|
|
||||||
|
|
||||||
public interface RixaSettings {
|
|
||||||
|
|
||||||
String getPrefix();
|
|
||||||
|
|
||||||
void load();
|
|
||||||
void save();
|
|
||||||
}
|
|
@ -1,29 +0,0 @@
|
|||||||
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,56 +0,0 @@
|
|||||||
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();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,76 +0,0 @@
|
|||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,69 +0,0 @@
|
|||||||
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,80 +0,0 @@
|
|||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,77 +0,0 @@
|
|||||||
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()));
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,35 +0,0 @@
|
|||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,42 +0,0 @@
|
|||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,17 +0,0 @@
|
|||||||
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);
|
|
||||||
}
|
|
@ -1,35 +0,0 @@
|
|||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,134 +0,0 @@
|
|||||||
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) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,119 +0,0 @@
|
|||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,42 +0,0 @@
|
|||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,31 +0,0 @@
|
|||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,169 +0,0 @@
|
|||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,62 +0,0 @@
|
|||||||
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();
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,181 +0,0 @@
|
|||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,70 +0,0 @@
|
|||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
173
src/main/java/me/savvy/rixa/Rixa.java
Normal file
173
src/main/java/me/savvy/rixa/Rixa.java
Normal file
@ -0,0 +1,173 @@
|
|||||||
|
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.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
17
src/main/java/me/savvy/rixa/action/Action.java
Normal file
17
src/main/java/me/savvy/rixa/action/Action.java
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
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);
|
||||||
|
}
|
45
src/main/java/me/savvy/rixa/action/ActionManager.java
Normal file
45
src/main/java/me/savvy/rixa/action/ActionManager.java
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,28 @@
|
|||||||
|
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() {}
|
||||||
|
}
|
@ -0,0 +1,55 @@
|
|||||||
|
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());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,64 @@
|
|||||||
|
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());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
300
src/main/java/me/savvy/rixa/commands/admin/ConfigCommand.java
Normal file
300
src/main/java/me/savvy/rixa/commands/admin/ConfigCommand.java
Normal file
@ -0,0 +1,300 @@
|
|||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,32 @@
|
|||||||
|
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();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,9 @@
|
|||||||
|
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>
|
||||||
|
}
|
@ -0,0 +1,55 @@
|
|||||||
|
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());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,80 @@
|
|||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
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) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,77 @@
|
|||||||
|
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();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,32 @@
|
|||||||
|
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,40 +1,41 @@
|
|||||||
package io.rixa.bot.commands.cmds.general;
|
package me.savvy.rixa.commands.general;
|
||||||
|
|
||||||
import io.rixa.bot.commands.Command;
|
import me.savvy.rixa.commands.handlers.Command;
|
||||||
import io.rixa.bot.commands.handler.CommandType;
|
import me.savvy.rixa.commands.handlers.CommandExec;
|
||||||
import io.rixa.bot.commands.perms.RixaPermission;
|
import me.savvy.rixa.utils.MessageBuilder;
|
||||||
import io.rixa.bot.utils.MessageFactory;
|
|
||||||
import net.dv8tion.jda.core.EmbedBuilder;
|
import net.dv8tion.jda.core.EmbedBuilder;
|
||||||
import net.dv8tion.jda.core.entities.Guild;
|
import net.dv8tion.jda.core.entities.ChannelType;
|
||||||
import net.dv8tion.jda.core.entities.Member;
|
|
||||||
import net.dv8tion.jda.core.entities.Message;
|
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.events.message.guild.GuildMessageReceivedEvent;
|
||||||
import net.dv8tion.jda.core.exceptions.ErrorResponseException;
|
import net.dv8tion.jda.core.exceptions.ErrorResponseException;
|
||||||
import net.dv8tion.jda.core.exceptions.PermissionException;
|
import net.dv8tion.jda.core.exceptions.PermissionException;
|
||||||
|
|
||||||
public class HelpCommand extends Command {
|
/**
|
||||||
|
* Created by Timber on 5/7/2017.
|
||||||
|
*/
|
||||||
|
public class HelpCommand implements CommandExec {
|
||||||
|
|
||||||
public HelpCommand(String command, RixaPermission rixaPermission, String description, CommandType commandType) {
|
@Command(usage = "%phelp",
|
||||||
super(command, rixaPermission, description, commandType);
|
channelType = ChannelType.TEXT,
|
||||||
}
|
description = "Receive information about the server!", mainCommand = "help", aliases = "h")
|
||||||
|
public void execute(GuildMessageReceivedEvent event) {
|
||||||
@Override
|
try {
|
||||||
public void execute(String commandLabel, Guild guild, Member member, TextChannel channel, String[] args) {
|
event.getMessage().delete().complete();
|
||||||
|
} catch (PermissionException ignored) {}
|
||||||
EmbedBuilder embedBuilder = new EmbedBuilder();
|
EmbedBuilder embedBuilder = new EmbedBuilder();
|
||||||
String stringBuilder = "\u2753" +
|
String stringBuilder = "\u2753" +
|
||||||
" **Help**" +
|
" **Help**" +
|
||||||
"\n" +
|
"\n" +
|
||||||
"Click the corresponding number for more information about the command menu.";
|
"Click the corresponding number for more information about the command menu.";
|
||||||
embedBuilder.setTitle(String.format("Help: %s", guild.getId()))
|
embedBuilder.setTitle(String.format("Help: %s", event.getGuild().getId()))
|
||||||
.setDescription(stringBuilder)
|
.setDescription(stringBuilder)
|
||||||
.addField("1 - General Commands", "Reveals usable commands intended for `everyone`", false)
|
.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("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)
|
.addField("3 - Music Commands", "Reveals usable commands to configure Rixa for your discord!", false)
|
||||||
.setColor(member.getColor());
|
.setColor(event.getMember().getColor());
|
||||||
Message message = member.getUser().openPrivateChannel().complete().sendMessage(embedBuilder.build()).complete();
|
Message message = event.getAuthor().openPrivateChannel().complete().sendMessage(embedBuilder.build()).complete();
|
||||||
MessageFactory.create(member.getAsMention()
|
new MessageBuilder(event.getMember().getAsMention()
|
||||||
+ ", the help menu has been private messaged to you!").setColor(member.getColor()).queue(channel);
|
+ ", the help menu has been private messaged to you!").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||||
try {
|
try {
|
||||||
message.addReaction("\u0031\u20E3").queue();
|
message.addReaction("\u0031\u20E3").queue();
|
||||||
message.addReaction("\u0032\u20E3").queue();
|
message.addReaction("\u0032\u20E3").queue();
|
@ -0,0 +1,97 @@
|
|||||||
|
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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,32 @@
|
|||||||
|
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();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,90 @@
|
|||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,25 @@
|
|||||||
|
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());
|
||||||
|
}
|
||||||
|
}
|
443
src/main/java/me/savvy/rixa/commands/general/MusicCommand.java
Normal file
443
src/main/java/me/savvy/rixa/commands/general/MusicCommand.java
Normal file
@ -0,0 +1,443 @@
|
|||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,29 @@
|
|||||||
|
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());*/
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,43 @@
|
|||||||
|
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();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,55 @@
|
|||||||
|
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();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,41 @@
|
|||||||
|
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();
|
||||||
|
}
|
||||||
|
}
|
30
src/main/java/me/savvy/rixa/commands/handlers/Command.java
Normal file
30
src/main/java/me/savvy/rixa/commands/handlers/Command.java
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
package me.savvy.rixa.commands.handlers;
|
||||||
|
|
||||||
|
import net.dv8tion.jda.core.entities.ChannelType;
|
||||||
|
|
||||||
|
import java.lang.annotation.ElementType;
|
||||||
|
import java.lang.annotation.Retention;
|
||||||
|
import java.lang.annotation.RetentionPolicy;
|
||||||
|
import java.lang.annotation.Target;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by Timber on 5/7/2017.
|
||||||
|
*/
|
||||||
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
|
@Target(ElementType.METHOD)
|
||||||
|
public @interface Command {
|
||||||
|
|
||||||
|
String mainCommand();
|
||||||
|
|
||||||
|
String[] aliases() default {};
|
||||||
|
|
||||||
|
String description() default "";
|
||||||
|
|
||||||
|
String usage() default "";
|
||||||
|
|
||||||
|
CommandType type() default CommandType.USER;
|
||||||
|
|
||||||
|
boolean showInHelp() default true;
|
||||||
|
|
||||||
|
ChannelType channelType() default ChannelType.PRIVATE;
|
||||||
|
}
|
@ -0,0 +1,11 @@
|
|||||||
|
package me.savvy.rixa.commands.handlers;
|
||||||
|
|
||||||
|
import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by Timber on 5/7/2017.
|
||||||
|
*/
|
||||||
|
public interface CommandExec {
|
||||||
|
|
||||||
|
void execute(GuildMessageReceivedEvent event);
|
||||||
|
}
|
@ -0,0 +1,57 @@
|
|||||||
|
package me.savvy.rixa.commands.handlers;
|
||||||
|
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by Timber on 5/7/2017.
|
||||||
|
*/
|
||||||
|
public class CommandHandler {
|
||||||
|
|
||||||
|
private static final Map<String, CommandRegistrar> commands = new HashMap<>();
|
||||||
|
|
||||||
|
public static void registerCommand(CommandExec command) {
|
||||||
|
for (Method method : command.getClass().getMethods()) {
|
||||||
|
Command annotation = method.getAnnotation(Command.class);
|
||||||
|
if (annotation == null) continue;
|
||||||
|
CommandRegistrar cmd = new CommandRegistrar(annotation, method, command);
|
||||||
|
commands.put(annotation.mainCommand(), cmd);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean hasCommand(String s) {
|
||||||
|
if(getCommands().containsKey(s)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
for (CommandRegistrar commandRegistrar : getCommands().values()) {
|
||||||
|
if (commandRegistrar.getAnnotation().mainCommand().equalsIgnoreCase(s)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
for (String string : commandRegistrar.getAnnotation().aliases()) {
|
||||||
|
if (string.equalsIgnoreCase(s)) return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static CommandRegistrar get(String s) {
|
||||||
|
if(getCommands().containsKey(s)) {
|
||||||
|
return getCommands().get(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (CommandRegistrar commandRegistrar : getCommands().values()) {
|
||||||
|
if (commandRegistrar.getAnnotation().mainCommand().equalsIgnoreCase(s)) {
|
||||||
|
return commandRegistrar;
|
||||||
|
}
|
||||||
|
for (String string : commandRegistrar.getAnnotation().aliases()) {
|
||||||
|
if (string.equalsIgnoreCase(s)) return commandRegistrar;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Map<String, CommandRegistrar> getCommands() {
|
||||||
|
return commands;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,25 @@
|
|||||||
|
package me.savvy.rixa.commands.handlers;
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by Timber on 5/7/2017.
|
||||||
|
*/
|
||||||
|
public class CommandRegistrar {
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
private final Command annotation;
|
||||||
|
@Getter
|
||||||
|
private final Method method;
|
||||||
|
@Getter
|
||||||
|
private final CommandExec executor;
|
||||||
|
|
||||||
|
CommandRegistrar(Command annotation, Method method, CommandExec executor) {
|
||||||
|
this.annotation = annotation;
|
||||||
|
this.method = method;
|
||||||
|
this.executor = executor;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,8 @@
|
|||||||
|
package me.savvy.rixa.commands.handlers;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by Timber on 5/22/2017.
|
||||||
|
*/
|
||||||
|
public enum CommandType {
|
||||||
|
USER, MOD, ADMIN, BOT_OWNER
|
||||||
|
}
|
@ -0,0 +1,10 @@
|
|||||||
|
package me.savvy.rixa.commands.handlers;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by Timber on 5/23/2017.
|
||||||
|
*/
|
||||||
|
public enum RixaPermission {
|
||||||
|
|
||||||
|
MUTE, ADD_ROLE, REMOVE_ROLE, CLEAR_CHAT, ACCESS_CONFIG, PM_MESSAGE, KICK_MEMBER, BAN_MEMBER, BATCH_MOVE, UNMUTE, TOGGLE_RAIDMODE
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,76 @@
|
|||||||
|
package me.savvy.rixa.commands.mod;
|
||||||
|
|
||||||
|
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.Message;
|
||||||
|
import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent;
|
||||||
|
import net.dv8tion.jda.core.exceptions.PermissionException;
|
||||||
|
import net.dv8tion.jda.core.requests.RestAction;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by Timber on 5/23/2017.
|
||||||
|
*/
|
||||||
|
public class DeleteMessagesCommand implements CommandExec {
|
||||||
|
@Override
|
||||||
|
@Command(mainCommand = "clear",
|
||||||
|
aliases = { "delmessages", "dmessages", "delmsg", "deletemessages" },
|
||||||
|
description = "Clear messages from chat!",
|
||||||
|
channelType = ChannelType.TEXT,
|
||||||
|
type = CommandType.MOD,
|
||||||
|
usage = "%pclear")
|
||||||
|
public void execute(GuildMessageReceivedEvent event) {
|
||||||
|
RixaGuild rixaGuild = Guilds.getGuild(event.getGuild());
|
||||||
|
if(!rixaGuild.hasPermission(event.getMember(), RixaPermission.CLEAR_CHAT)) {
|
||||||
|
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) {
|
||||||
|
new MessageBuilder(event.getMember().getAsMention() + ", please enter an amount. Example /delmessages 5").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||||
|
messages = null;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if(!Utils.isInt(messages[1])) {
|
||||||
|
new MessageBuilder(event.getMember().getAsMention() + ", Amount must be a number. Example /delmessages 3").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||||
|
messages = null;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
int amount = Integer.parseInt(messages[1]);
|
||||||
|
if (amount < 2 || amount > 100) {
|
||||||
|
new MessageBuilder(event.getMember().getAsMention() + ", please provide at least 2 or at most 100 messages to be deleted").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||||
|
messages = null;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
RestAction<List<Message>> messageList = event.getChannel().getHistory().retrievePast(amount);
|
||||||
|
List<Message> messages1 = new ArrayList<Message>();
|
||||||
|
messageList.complete().forEach(message -> {
|
||||||
|
if(!event.getChannel().getPinnedMessages().complete().contains(message)) {
|
||||||
|
messages1.add(message);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
event.getChannel().deleteMessages(messages1).complete();
|
||||||
|
new MessageBuilder(event.getMember().getAsMention() + " has cleared **" + amount + "** messages from the chat history.").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||||
|
} catch (PermissionException ex) {
|
||||||
|
try {
|
||||||
|
new MessageBuilder(event.getMember().getAsMention() + ", sorry I do not have permission for this!").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||||
|
} catch (PermissionException e) {
|
||||||
|
event.getAuthor()
|
||||||
|
.openPrivateChannel().complete()
|
||||||
|
.sendMessage(event.getMember().getAsMention() + ", sorry I do not have permission for this!").queue();
|
||||||
|
}
|
||||||
|
} catch(IllegalArgumentException ex) {
|
||||||
|
new MessageBuilder(event.getMember().getAsMention() + ", sorry I do not have permission for this!").setColor(event.getMember().getColor()).queue(event.getChannel());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user