From 9f1f62d593e2fd4a902f4af29dec5fccd1f6b062 Mon Sep 17 00:00:00 2001 From: Stijn Date: Wed, 9 Mar 2022 22:11:11 +0100 Subject: [PATCH] Initial commit --- .gitignore | 3 + build.gradle.kts | 77 ++++++++ gradlew | 185 ++++++++++++++++++ gradlew.bat | 89 +++++++++ settings.gradle.kts | 19 ++ src/main/java/com/alttd/AltitudeBot.java | 60 ++++++ .../alttd/commandManager/CommandManager.java | 30 +++ .../alttd/commandManager/DiscordCommand.java | 24 +++ .../commands/CommandActivity.java | 4 + .../commands/CommandBlocked.java | 4 + .../commands/CommandChatHistory.java | 4 + .../commandManager/commands/CommandClose.java | 4 + .../commands/CommandCreateChat.java | 4 + .../commandManager/commands/CommandEmbed.java | 4 + .../commandManager/commands/CommandFlag.java | 4 + .../commands/CommandFlagList.java | 4 + .../commandManager/commands/CommandHelp.java | 35 ++++ .../commands/CommandHistory.java | 4 + .../commands/CommandIpHist.java | 4 + .../commands/CommandJoinDate.java | 4 + .../commands/CommandMarkTodo.java | 4 + .../commands/CommandMemberCount.java | 4 + .../commands/CommandRaffle.java | 4 + .../commands/CommandRemindMe.java | 4 + .../commandManager/commands/CommandStop.java | 4 + .../commandManager/commands/CommandTodo.java | 4 + .../commands/CommandUnblock.java | 4 + .../java/com/alttd/config/AbstractConfig.java | 153 +++++++++++++++ .../java/com/alttd/config/MessagesConfig.java | 24 +++ .../java/com/alttd/config/SettingsConfig.java | 22 +++ .../alttd/permissions/PermissionManager.java | 75 +++++++ src/main/java/com/alttd/templates/Parser.java | 10 + .../java/com/alttd/templates/Template.java | 20 ++ src/main/java/com/alttd/util/Logger.java | 35 ++++ 34 files changed, 933 insertions(+) create mode 100644 .gitignore create mode 100644 build.gradle.kts create mode 100755 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle.kts create mode 100644 src/main/java/com/alttd/AltitudeBot.java create mode 100644 src/main/java/com/alttd/commandManager/CommandManager.java create mode 100644 src/main/java/com/alttd/commandManager/DiscordCommand.java create mode 100644 src/main/java/com/alttd/commandManager/commands/CommandActivity.java create mode 100644 src/main/java/com/alttd/commandManager/commands/CommandBlocked.java create mode 100644 src/main/java/com/alttd/commandManager/commands/CommandChatHistory.java create mode 100644 src/main/java/com/alttd/commandManager/commands/CommandClose.java create mode 100644 src/main/java/com/alttd/commandManager/commands/CommandCreateChat.java create mode 100644 src/main/java/com/alttd/commandManager/commands/CommandEmbed.java create mode 100644 src/main/java/com/alttd/commandManager/commands/CommandFlag.java create mode 100644 src/main/java/com/alttd/commandManager/commands/CommandFlagList.java create mode 100644 src/main/java/com/alttd/commandManager/commands/CommandHelp.java create mode 100644 src/main/java/com/alttd/commandManager/commands/CommandHistory.java create mode 100644 src/main/java/com/alttd/commandManager/commands/CommandIpHist.java create mode 100644 src/main/java/com/alttd/commandManager/commands/CommandJoinDate.java create mode 100644 src/main/java/com/alttd/commandManager/commands/CommandMarkTodo.java create mode 100644 src/main/java/com/alttd/commandManager/commands/CommandMemberCount.java create mode 100644 src/main/java/com/alttd/commandManager/commands/CommandRaffle.java create mode 100644 src/main/java/com/alttd/commandManager/commands/CommandRemindMe.java create mode 100644 src/main/java/com/alttd/commandManager/commands/CommandStop.java create mode 100644 src/main/java/com/alttd/commandManager/commands/CommandTodo.java create mode 100644 src/main/java/com/alttd/commandManager/commands/CommandUnblock.java create mode 100644 src/main/java/com/alttd/config/AbstractConfig.java create mode 100644 src/main/java/com/alttd/config/MessagesConfig.java create mode 100644 src/main/java/com/alttd/config/SettingsConfig.java create mode 100644 src/main/java/com/alttd/permissions/PermissionManager.java create mode 100644 src/main/java/com/alttd/templates/Parser.java create mode 100644 src/main/java/com/alttd/templates/Template.java create mode 100644 src/main/java/com/alttd/util/Logger.java diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..bf968db --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +.gradle/ +.idea/ +gradle/ diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 0000000..d8842ee --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,77 @@ +import com.github.jengelman.gradle.plugins.shadow.tasks.ConfigureShadowRelocation + +plugins { + id("java") + id("com.github.johnrengelman.shadow") version "7.1.0" + id("maven-publish") +} + +group = "com.alttd" +version = "1.0.0-SNAPSHOT" +description = "Altitude Discord Bot." + +java { + toolchain { + languageVersion.set(JavaLanguageVersion.of(17)) + } +} + +publishing { + publications { + create("mavenJava") { + from(components["java"]) + } + } +} + +tasks { + withType { + options.encoding = Charsets.UTF_8.name() + } + + withType { + options.encoding = Charsets.UTF_8.name() + } + + shadowJar { + dependsOn(getByName("relocateJars") as ConfigureShadowRelocation) + archiveFileName.set("${project.name}-${project.version}.jar") + minimize() + configurations = listOf(project.configurations.shadow.get()) + } + + build { + dependsOn(shadowJar) + } + + create("relocateJars") { + target = shadowJar.get() + prefix = "${project.name}.lib" + } +} + +dependencies { +// JDA + implementation("net.dv8tion:JDA:5.0.0-alpha.3") { + shadow("net.dv8tion:JDA:5.0.0-alpha.3") { + exclude("opus-java") // exclude audio + } + // MySQL + runtimeOnly("mysql:mysql-connector-java:8.0.23") + } + + tasks { + + shadowJar { + listOf( + "net.dv8tion.jda" + ).forEach { relocate(it, "${rootProject.group}.lib.$it") } + } + + build { + dependsOn(shadowJar) + } + } + // Configurate + shadow("org.spongepowered:configurate-yaml:4.1.2") +} \ No newline at end of file diff --git a/gradlew b/gradlew new file mode 100755 index 0000000..4f906e0 --- /dev/null +++ b/gradlew @@ -0,0 +1,185 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +## +## 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='"-Xmx64m" "-Xms64m"' + +# 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 or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; 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=`expr $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 + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..107acd3 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@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 Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@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="-Xmx64m" "-Xms64m" + +@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 execute + +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 execute + +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 + +: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 %* + +: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 diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 0000000..d9c0af6 --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,19 @@ +rootProject.name = "AltitudeBot" + +dependencyResolutionManagement { + repositories { + mavenLocal() + mavenCentral() + // JDA + maven("https://m2.dv8tion.net/releases/") + // Configurate + maven("https://repo.spongepowered.org/maven") + } + repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) +} + +pluginManagement { + repositories { + gradlePluginPortal() + } +} diff --git a/src/main/java/com/alttd/AltitudeBot.java b/src/main/java/com/alttd/AltitudeBot.java new file mode 100644 index 0000000..61a588b --- /dev/null +++ b/src/main/java/com/alttd/AltitudeBot.java @@ -0,0 +1,60 @@ +package com.alttd; + +import com.alttd.commandManager.CommandManager; +import com.alttd.config.SettingsConfig; +import com.alttd.config.MessagesConfig; +import com.alttd.permissions.PermissionManager; +import com.alttd.util.Logger; +import net.dv8tion.jda.api.JDA; +import net.dv8tion.jda.api.JDABuilder; + +import javax.security.auth.login.LoginException; +import java.io.File; +import java.net.URISyntaxException; + +public class AltitudeBot { + + private JDA jda; + private PermissionManager permissionManager; + private static AltitudeBot instance; + + public static AltitudeBot getInstance() { + return instance; + } + + public void main(String args[]) { + instance = this; + Logger.info("Starting bot..."); + initConfigs(); + try { + jda = JDABuilder.createDefault(SettingsConfig.TOKEN).build(); + } catch (LoginException e) { + e.printStackTrace(); + } + initListeners(); + //TODO init permissionManager + } + + private void initListeners() { + jda.addEventListener(new CommandManager()); + } + + private void initConfigs() { + SettingsConfig.reload(); + MessagesConfig.reload(); + } + + public String getDataFolder() { + try { + return new File(AltitudeBot.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath()).getPath(); + } catch (URISyntaxException e) { + Logger.severe("Unable to retrieve config directory"); + e.printStackTrace(); + } + return (null); + } + + public PermissionManager getPermissionManager() { + return permissionManager; + } +} diff --git a/src/main/java/com/alttd/commandManager/CommandManager.java b/src/main/java/com/alttd/commandManager/CommandManager.java new file mode 100644 index 0000000..6c6ea54 --- /dev/null +++ b/src/main/java/com/alttd/commandManager/CommandManager.java @@ -0,0 +1,30 @@ +package com.alttd.commandManager; + +import net.dv8tion.jda.api.events.message.MessageReceivedEvent; +import net.dv8tion.jda.api.hooks.ListenerAdapter; +import org.jetbrains.annotations.NotNull; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; + +public class CommandManager extends ListenerAdapter { + + private final List commands; + private final HashMap commandPrefixes; + + public CommandManager() { + commands = List.of(); + commandPrefixes = null;//TODO query; + } + + @Override + public void onMessageReceived(@NotNull MessageReceivedEvent event) { + String[] s = event.getMessage().getContentRaw().split(" "); + if (s.length < 1) + return; + String command = s[0]; + String[] args = Arrays.copyOfRange(s, 1, s.length); + } + +} diff --git a/src/main/java/com/alttd/commandManager/DiscordCommand.java b/src/main/java/com/alttd/commandManager/DiscordCommand.java new file mode 100644 index 0000000..1ca468b --- /dev/null +++ b/src/main/java/com/alttd/commandManager/DiscordCommand.java @@ -0,0 +1,24 @@ +package com.alttd.commandManager; + +import net.dv8tion.jda.api.entities.Member; +import net.dv8tion.jda.api.entities.User; + +import java.util.List; + +public abstract class DiscordCommand { + + public abstract String getName(); + + public String getPermission() { + return "command." + getName(); + } + + public abstract String execute(String[] args, Member commandSource); + + public abstract String execute(String[] args, User commandSource); + + public abstract String getHelpMessage(); + + public abstract List getAlias(); + +} diff --git a/src/main/java/com/alttd/commandManager/commands/CommandActivity.java b/src/main/java/com/alttd/commandManager/commands/CommandActivity.java new file mode 100644 index 0000000..1f1683b --- /dev/null +++ b/src/main/java/com/alttd/commandManager/commands/CommandActivity.java @@ -0,0 +1,4 @@ +package com.alttd.commandManager.commands; + +public class CommandActivity { +} diff --git a/src/main/java/com/alttd/commandManager/commands/CommandBlocked.java b/src/main/java/com/alttd/commandManager/commands/CommandBlocked.java new file mode 100644 index 0000000..3d43cd4 --- /dev/null +++ b/src/main/java/com/alttd/commandManager/commands/CommandBlocked.java @@ -0,0 +1,4 @@ +package com.alttd.commandManager.commands; + +public class CommandBlocked { +} diff --git a/src/main/java/com/alttd/commandManager/commands/CommandChatHistory.java b/src/main/java/com/alttd/commandManager/commands/CommandChatHistory.java new file mode 100644 index 0000000..209b65e --- /dev/null +++ b/src/main/java/com/alttd/commandManager/commands/CommandChatHistory.java @@ -0,0 +1,4 @@ +package com.alttd.commandManager.commands; + +public class CommandChatHistory { +} diff --git a/src/main/java/com/alttd/commandManager/commands/CommandClose.java b/src/main/java/com/alttd/commandManager/commands/CommandClose.java new file mode 100644 index 0000000..065e845 --- /dev/null +++ b/src/main/java/com/alttd/commandManager/commands/CommandClose.java @@ -0,0 +1,4 @@ +package com.alttd.commandManager.commands; + +public class CommandClose { +} diff --git a/src/main/java/com/alttd/commandManager/commands/CommandCreateChat.java b/src/main/java/com/alttd/commandManager/commands/CommandCreateChat.java new file mode 100644 index 0000000..e6674e6 --- /dev/null +++ b/src/main/java/com/alttd/commandManager/commands/CommandCreateChat.java @@ -0,0 +1,4 @@ +package com.alttd.commandManager.commands; + +public class CommandCreateChat { +} diff --git a/src/main/java/com/alttd/commandManager/commands/CommandEmbed.java b/src/main/java/com/alttd/commandManager/commands/CommandEmbed.java new file mode 100644 index 0000000..378f1b9 --- /dev/null +++ b/src/main/java/com/alttd/commandManager/commands/CommandEmbed.java @@ -0,0 +1,4 @@ +package com.alttd.commandManager.commands; + +public class CommandEmbed { +} diff --git a/src/main/java/com/alttd/commandManager/commands/CommandFlag.java b/src/main/java/com/alttd/commandManager/commands/CommandFlag.java new file mode 100644 index 0000000..c085d9b --- /dev/null +++ b/src/main/java/com/alttd/commandManager/commands/CommandFlag.java @@ -0,0 +1,4 @@ +package com.alttd.commandManager.commands; + +public class CommandFlag { +} diff --git a/src/main/java/com/alttd/commandManager/commands/CommandFlagList.java b/src/main/java/com/alttd/commandManager/commands/CommandFlagList.java new file mode 100644 index 0000000..dc02b7e --- /dev/null +++ b/src/main/java/com/alttd/commandManager/commands/CommandFlagList.java @@ -0,0 +1,4 @@ +package com.alttd.commandManager.commands; + +public class CommandFlagList { +} diff --git a/src/main/java/com/alttd/commandManager/commands/CommandHelp.java b/src/main/java/com/alttd/commandManager/commands/CommandHelp.java new file mode 100644 index 0000000..52ff4b8 --- /dev/null +++ b/src/main/java/com/alttd/commandManager/commands/CommandHelp.java @@ -0,0 +1,35 @@ +package com.alttd.commandManager.commands; + +import com.alttd.commandManager.DiscordCommand; +import com.alttd.config.MessagesConfig; +import net.dv8tion.jda.api.entities.Member; +import net.dv8tion.jda.api.entities.User; + +import java.util.List; + +public class CommandHelp extends DiscordCommand { + @Override + public String getName() { + return "help"; + } + + @Override + public String execute(String[] args, Member commandSource) { + return null; + } + + @Override + public String execute(String[] args, User commandSource) { + return null; + } + + @Override + public String getHelpMessage() { + return MessagesConfig.HELP_HELP; + } + + @Override + public List getAlias() { + return null; + } +} diff --git a/src/main/java/com/alttd/commandManager/commands/CommandHistory.java b/src/main/java/com/alttd/commandManager/commands/CommandHistory.java new file mode 100644 index 0000000..d022079 --- /dev/null +++ b/src/main/java/com/alttd/commandManager/commands/CommandHistory.java @@ -0,0 +1,4 @@ +package com.alttd.commandManager.commands; + +public class CommandHistory { +} diff --git a/src/main/java/com/alttd/commandManager/commands/CommandIpHist.java b/src/main/java/com/alttd/commandManager/commands/CommandIpHist.java new file mode 100644 index 0000000..3bb873c --- /dev/null +++ b/src/main/java/com/alttd/commandManager/commands/CommandIpHist.java @@ -0,0 +1,4 @@ +package com.alttd.commandManager.commands; + +public class CommandIpHist { +} diff --git a/src/main/java/com/alttd/commandManager/commands/CommandJoinDate.java b/src/main/java/com/alttd/commandManager/commands/CommandJoinDate.java new file mode 100644 index 0000000..d449153 --- /dev/null +++ b/src/main/java/com/alttd/commandManager/commands/CommandJoinDate.java @@ -0,0 +1,4 @@ +package com.alttd.commandManager.commands; + +public class CommandJoinDate { +} diff --git a/src/main/java/com/alttd/commandManager/commands/CommandMarkTodo.java b/src/main/java/com/alttd/commandManager/commands/CommandMarkTodo.java new file mode 100644 index 0000000..58519d7 --- /dev/null +++ b/src/main/java/com/alttd/commandManager/commands/CommandMarkTodo.java @@ -0,0 +1,4 @@ +package com.alttd.commandManager.commands; + +public class CommandMarkTodo { +} diff --git a/src/main/java/com/alttd/commandManager/commands/CommandMemberCount.java b/src/main/java/com/alttd/commandManager/commands/CommandMemberCount.java new file mode 100644 index 0000000..43b2911 --- /dev/null +++ b/src/main/java/com/alttd/commandManager/commands/CommandMemberCount.java @@ -0,0 +1,4 @@ +package com.alttd.commandManager.commands; + +public class CommandMemberCount { +} diff --git a/src/main/java/com/alttd/commandManager/commands/CommandRaffle.java b/src/main/java/com/alttd/commandManager/commands/CommandRaffle.java new file mode 100644 index 0000000..4482003 --- /dev/null +++ b/src/main/java/com/alttd/commandManager/commands/CommandRaffle.java @@ -0,0 +1,4 @@ +package com.alttd.commandManager.commands; + +public class CommandRaffle { +} diff --git a/src/main/java/com/alttd/commandManager/commands/CommandRemindMe.java b/src/main/java/com/alttd/commandManager/commands/CommandRemindMe.java new file mode 100644 index 0000000..11c95cc --- /dev/null +++ b/src/main/java/com/alttd/commandManager/commands/CommandRemindMe.java @@ -0,0 +1,4 @@ +package com.alttd.commandManager.commands; + +public class CommandRemindMe { +} diff --git a/src/main/java/com/alttd/commandManager/commands/CommandStop.java b/src/main/java/com/alttd/commandManager/commands/CommandStop.java new file mode 100644 index 0000000..f6f6056 --- /dev/null +++ b/src/main/java/com/alttd/commandManager/commands/CommandStop.java @@ -0,0 +1,4 @@ +package com.alttd.commandManager.commands; + +public class CommandStop { +} diff --git a/src/main/java/com/alttd/commandManager/commands/CommandTodo.java b/src/main/java/com/alttd/commandManager/commands/CommandTodo.java new file mode 100644 index 0000000..3cccdc7 --- /dev/null +++ b/src/main/java/com/alttd/commandManager/commands/CommandTodo.java @@ -0,0 +1,4 @@ +package com.alttd.commandManager.commands; + +public class CommandTodo { +} diff --git a/src/main/java/com/alttd/commandManager/commands/CommandUnblock.java b/src/main/java/com/alttd/commandManager/commands/CommandUnblock.java new file mode 100644 index 0000000..ac070e3 --- /dev/null +++ b/src/main/java/com/alttd/commandManager/commands/CommandUnblock.java @@ -0,0 +1,4 @@ +package com.alttd.commandManager.commands; + +public class CommandUnblock { +} diff --git a/src/main/java/com/alttd/config/AbstractConfig.java b/src/main/java/com/alttd/config/AbstractConfig.java new file mode 100644 index 0000000..98d286b --- /dev/null +++ b/src/main/java/com/alttd/config/AbstractConfig.java @@ -0,0 +1,153 @@ +package com.alttd.config; + +import com.alttd.AltitudeBot; +import com.alttd.util.Logger; +import io.leangen.geantyref.TypeToken; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.spongepowered.configurate.ConfigurationNode; +import org.spongepowered.configurate.ConfigurationOptions; +import org.spongepowered.configurate.serialize.SerializationException; +import org.spongepowered.configurate.yaml.NodeStyle; +import org.spongepowered.configurate.yaml.YamlConfigurationLoader; + +import java.io.File; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.regex.Pattern; + +@SuppressWarnings({"unused", "SameParameterValue"}) +abstract class AbstractConfig { + private static final Pattern PATH_PATTERN = Pattern.compile("\\."); + private static final String HEADER = ""; + + private YamlConfigurationLoader configLoader; + private ConfigurationNode config; + + AbstractConfig(String filename) { + init(new File(AltitudeBot.getInstance().getDataFolder(), filename), filename); + } + + private void init(File file, String filename) { + configLoader = YamlConfigurationLoader.builder() + .file(file) + .nodeStyle(NodeStyle.BLOCK) + .build(); + if (!file.getParentFile().exists()) { + if(!file.getParentFile().mkdirs()) { + return; + } + } + if (!file.exists()) { + try { + if(!file.createNewFile()) { + return; + } + } catch (IOException error) { + error.printStackTrace(); + } + } + + try { + config = configLoader.load(ConfigurationOptions.defaults().header(HEADER).shouldCopyDefaults(false)); + } catch (IOException e) { + e.printStackTrace(); + } + } + + void readConfig(Class clazz, Object instance) { + for (Method method : clazz.getDeclaredMethods()) { + if (Modifier.isPrivate(method.getModifiers())) { + if (method.getParameterTypes().length == 0 && method.getReturnType() == Void.TYPE) { + try { + method.setAccessible(true); + method.invoke(instance); + } catch (InvocationTargetException ex) { + throw new RuntimeException(ex.getCause()); + } catch (Exception ex) { + Logger.severe("Error invoking %.", method.toString()); + ex.printStackTrace(); + } + } + } + } + + save(); + } + + private void save() { + try { + configLoader.save(config); + } catch (IOException ex) { + ex.printStackTrace(); + } + } + + private static Object[] splitPath(String key) { + return PATH_PATTERN.split(key); + } + + protected void set(String path, Object def) { + if(config.node(splitPath(path)).virtual()) { + try { + config.node(splitPath(path)).set(def); + } catch (SerializationException e) { + } + } + } + + protected void setString(String path, String def) { + try { + if(config.node(splitPath(path)).virtual()) + config.node(splitPath(path)).set(io.leangen.geantyref.TypeToken.get(String.class), def); + } catch(SerializationException ex) { + } + } + + protected boolean getBoolean(String path, boolean def) { + set(path, def); + return config.node(splitPath(path)).getBoolean(def); + } + + protected double getDouble(String path, double def) { + set(path, def); + return config.node(splitPath(path)).getDouble(def); + } + + protected int getInt(String path, int def) { + set(path, def); + return config.node(splitPath(path)).getInt(def); + } + + protected String getString(String path, String def) { + setString(path, def); + return config.node(splitPath(path)).getString(def); + } + + protected Long getLong(String path, Long def) { + set(path, def); + return config.node(splitPath(path)).getLong(def); + } + + protected List getList(String path, T def) { + try { + set(path, def); + return config.node(splitPath(path)).getList(TypeToken.get(String.class)); + } catch(SerializationException ex) { + } + return new ArrayList<>(); + } + + protected ConfigurationNode getNode(String path) { + if(config.node(splitPath(path)).virtual()) { + //new RegexConfig("Dummy"); + } + config.childrenMap(); + return config.node(splitPath(path)); + } +} \ No newline at end of file diff --git a/src/main/java/com/alttd/config/MessagesConfig.java b/src/main/java/com/alttd/config/MessagesConfig.java new file mode 100644 index 0000000..a1a2e75 --- /dev/null +++ b/src/main/java/com/alttd/config/MessagesConfig.java @@ -0,0 +1,24 @@ +package com.alttd.config; + +public class MessagesConfig extends AbstractConfig { + + static MessagesConfig messagesConfig; + + public MessagesConfig() { + super("messages.yml"); + } + + public static void reload() { + messagesConfig = new MessagesConfig(); + + messagesConfig.readConfig(MessagesConfig.class, null); + } + + public static String HELP_HELP = "`help`: Shows help menu"; + public static String HELP_MESSAGE_TEMPLATE = ""; + private static void loadHelp() { + HELP_HELP = messagesConfig.getString("help.help", HELP_HELP); + HELP_MESSAGE_TEMPLATE = messagesConfig.getString("help.message-template", HELP_MESSAGE_TEMPLATE); + } + +} diff --git a/src/main/java/com/alttd/config/SettingsConfig.java b/src/main/java/com/alttd/config/SettingsConfig.java new file mode 100644 index 0000000..045a013 --- /dev/null +++ b/src/main/java/com/alttd/config/SettingsConfig.java @@ -0,0 +1,22 @@ +package com.alttd.config; + +public class SettingsConfig extends AbstractConfig { + + static SettingsConfig settingsConfig; + + public SettingsConfig() { + super("settings.yml"); + } + + public static void reload() { + settingsConfig = new SettingsConfig(); + + settingsConfig.readConfig(SettingsConfig.class, null); + } + + public static String TOKEN = "token"; + private void loadSettings() { + TOKEN = settingsConfig.getString("settings.token", TOKEN); + } + +} diff --git a/src/main/java/com/alttd/permissions/PermissionManager.java b/src/main/java/com/alttd/permissions/PermissionManager.java new file mode 100644 index 0000000..d3678a3 --- /dev/null +++ b/src/main/java/com/alttd/permissions/PermissionManager.java @@ -0,0 +1,75 @@ +package com.alttd.permissions; + +import com.alttd.util.Logger; +import net.dv8tion.jda.api.entities.*; + +import java.util.HashMap; +import java.util.List; +import java.util.stream.Collectors; + +public class PermissionManager { + + HashMap> userPermissions; + HashMap> groupPermissions; + HashMap> channelEnabledCommands; + List privateEnabledCommands; + + public PermissionManager(HashMap> userPermissions, + HashMap> groupPermissions, + HashMap> channelEnabledCommands, + List privateEnabledCommands) { + this.userPermissions = userPermissions; + this.groupPermissions = groupPermissions; + this.channelEnabledCommands = channelEnabledCommands; + this.privateEnabledCommands = privateEnabledCommands; + } + + public boolean hasPermission(TextChannel textChannel, User user, String permission) { + permission = permission.toLowerCase(); + if (textChannel instanceof PrivateChannel) { + if (isDisabled(privateEnabledCommands, permission)) + return false; + return hasPermission(user.getIdLong(), null, permission); + } else { + Logger.warning("Using user for Guild channel % ", textChannel.getAsMention()); + return false; + } + } + + public boolean hasPermission(TextChannel textChannel, Member member, String permission) { + permission = permission.toLowerCase(); + if (isDisabled(channelEnabledCommands.get(textChannel.getIdLong()), permission.toLowerCase())) + return false; + return hasPermission( + member.getIdLong(), + member.getRoles().stream() + .map(Role::getIdLong) + .collect(Collectors.toList()), + permission); + } + + private boolean isDisabled(List enabledCommandList, String permission) { + if (enabledCommandList == null || enabledCommandList.isEmpty()) + return false; + return !enabledCommandList.contains(permission); + } + + private boolean hasPermission(long userId, List groupIds, String permission) { + if (hasPermission(userPermissions.get(userId), permission)) + return true; + if (groupIds == null || groupIds.isEmpty()) + return false; + for (long groupId : groupIds) { + if (hasPermission(groupPermissions.get(groupId), permission)) + return true; + } + return false; + } + + private boolean hasPermission(List permissions, String permission) { + if (permission == null || permission.isEmpty()) + return false; + return permissions.contains(permission); + } + +} diff --git a/src/main/java/com/alttd/templates/Parser.java b/src/main/java/com/alttd/templates/Parser.java new file mode 100644 index 0000000..88c0d2d --- /dev/null +++ b/src/main/java/com/alttd/templates/Parser.java @@ -0,0 +1,10 @@ +package com.alttd.templates; + +public class Parser { + public static String parse(String message, Template... templates) { + for (Template template : templates) { + message = template.apply(message); + } + return message; + } +} diff --git a/src/main/java/com/alttd/templates/Template.java b/src/main/java/com/alttd/templates/Template.java new file mode 100644 index 0000000..24753d3 --- /dev/null +++ b/src/main/java/com/alttd/templates/Template.java @@ -0,0 +1,20 @@ +package com.alttd.templates; + +public class Template { + + private final String key; + private final String replacement; + + private Template(String key, String replacement) { + this.key = key; + this.replacement = replacement; + } + + public static Template of(String key, String replacement) { + return new Template("<" + key + ">", replacement); + } + + protected String apply(String string) { + return string.replaceAll(key, replacement); + } +} diff --git a/src/main/java/com/alttd/util/Logger.java b/src/main/java/com/alttd/util/Logger.java new file mode 100644 index 0000000..998702b --- /dev/null +++ b/src/main/java/com/alttd/util/Logger.java @@ -0,0 +1,35 @@ +package com.alttd.util; + +public class Logger { //TODO make this log to a file + + private static final java.util.logging.Logger logger; + + static { + logger = java.util.logging.Logger.getLogger("DiscordBot"); + } + + public static void info(String message, String... replacements) { + message = replace(message, replacements); + logger.info(message); + } + + public static void warning(String message, String... replacements) { + message = replace(message, replacements); + logger.warning(message); + } + + public static void severe(String message, String... replacements) { + message = replace(message, replacements); + logger.severe(message); + } + + private static String replace(String message, String... replacements) { + if (replacements == null) + return message; + for (String replacement : replacements) { + message = message.replaceFirst("%", replacement); + } + return message; + } + +}