Compare commits

...

No commits in common. "3.0" and "master" have entirely different histories.
3.0 ... master

156 changed files with 5715 additions and 4243 deletions

85
.gitignore vendored
View File

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

View File

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

View File

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

View File

@ -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
View File

@ -0,0 +1 @@
theme: jekyll-theme-cayman

41
build.gradle Normal file
View 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

Binary file not shown.

View 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
View 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
View 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
View File

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

View File

@ -1,10 +0,0 @@
package io.rixa;
import io.rixa.bot.Rixa;
public class Main {
public static void main(String[] args) {
Rixa.getInstance();
}
}

View File

@ -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);
}
}

View File

@ -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;
}

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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");
}
}

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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;
}
}

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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;
}
}

View File

@ -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);
}
}

View File

@ -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;
}
}

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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();
}
}
}

View File

@ -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;
}
}
}

View File

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

View File

@ -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();
}
}

View File

@ -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();
}
}

View File

@ -1,8 +0,0 @@
package io.rixa.bot.commands.exceptions;
public class CommandNotFoundException extends Exception {
public CommandNotFoundException(String message) {
super(message);
}
}

View File

@ -1,8 +0,0 @@
package io.rixa.bot.commands.exceptions;
public class ReactNotFoundException extends Exception {
public ReactNotFoundException(String message) {
super(message);
}
}

View File

@ -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;
}
}

View File

@ -1,8 +0,0 @@
package io.rixa.bot.commands.handler;
public enum CommandType {
STAFF,
USER,
OWNER;
}

View File

@ -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;
}
}

View File

@ -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);
}
}

View File

@ -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 );
}
}

View File

@ -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;
}
}

View File

@ -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));
}
}

View File

@ -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) {
}
}
}

View File

@ -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);
}
}

View File

@ -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());
}
}
}

View File

@ -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);
}
}

View File

@ -1,7 +0,0 @@
package io.rixa.bot.guild.enums;
public enum PermissionType {
USER,
GUILD
}

View File

@ -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;
}
}

View File

@ -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);
}

View File

@ -1,9 +0,0 @@
package io.rixa.bot.guild.manager;
public interface RixaSettings {
String getPrefix();
void load();
void save();
}

View File

@ -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;
}
}

View File

@ -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();
}
}
}

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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()));
}
}

View File

@ -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;
}
}

View File

@ -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);
}
}

View File

@ -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);
}

View File

@ -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;
}
}

View File

@ -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) {
}
}
}

View File

@ -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);
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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();
}
}

View File

@ -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);
}
}

View File

@ -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;
}
}
}

View 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.");
}
}
}

View 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);
}

View 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);
}
}

View File

@ -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() {}
}

View File

@ -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());
}
}
}

View File

@ -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());
}
}
}

View 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;
}
}

View File

@ -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();
}
}

View File

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

View File

@ -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());
}
}
}

View File

@ -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;
}
}
}

View File

@ -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) {
}
}

View File

@ -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();
}
}

View File

@ -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());
}
}

View File

@ -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();

View File

@ -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();
}
}
}

View File

@ -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();
}
}

View File

@ -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);
}
}

View File

@ -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());
}
}

View 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);
}
}

View File

@ -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());*/
}
}

View File

@ -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();
}
}

View File

@ -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();
}
}

View File

@ -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();
}
}

View 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;
}

View File

@ -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);
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

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

View File

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

View File

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