parent
4527ce1314
commit
c5c00705ff
|
@ -0,0 +1,22 @@
|
|||
# eclipse
|
||||
bin
|
||||
*.launch
|
||||
.settings
|
||||
.metadata
|
||||
.classpath
|
||||
.project
|
||||
|
||||
# idea
|
||||
out
|
||||
*.ipr
|
||||
*.iws
|
||||
*.iml
|
||||
.idea
|
||||
|
||||
# gradle
|
||||
build
|
||||
.gradle
|
||||
|
||||
# other
|
||||
eclipse
|
||||
run
|
|
@ -0,0 +1,139 @@
|
|||
buildscript {
|
||||
repositories {
|
||||
jcenter()
|
||||
maven {
|
||||
name = "forge"
|
||||
url = "http://files.minecraftforge.net/maven"
|
||||
}
|
||||
}
|
||||
dependencies {
|
||||
classpath 'net.minecraftforge.gradle:ForgeGradle:2.1-SNAPSHOT'
|
||||
}
|
||||
}
|
||||
|
||||
plugins {
|
||||
id "com.github.johnrengelman.shadow" version "1.2.2"
|
||||
}
|
||||
|
||||
repositories {
|
||||
ivy {
|
||||
name "CurseForge"
|
||||
artifactPattern 'http://addons-origin.cursecdn.com/files/[organisation]/[module]-[revision].[ext]'
|
||||
}
|
||||
flatDir {
|
||||
dirs "libs"
|
||||
}
|
||||
}
|
||||
|
||||
apply plugin: 'net.minecraftforge.gradle.forge'
|
||||
|
||||
def mcVersion = '1.8.9'
|
||||
def forgeVersion = '11.15.1.1722'
|
||||
|
||||
version = "0.1.0"
|
||||
group = "chikachi.discord"
|
||||
archivesBaseName = "ChikachiDiscord"
|
||||
|
||||
sourceCompatibility = 1.8
|
||||
targetCompatibility = 1.8
|
||||
|
||||
minecraft {
|
||||
version = mcVersion + '-' + forgeVersion
|
||||
|
||||
if (file('../run').exists()) {
|
||||
runDir = '../run'
|
||||
} else {
|
||||
runDir = 'run'
|
||||
}
|
||||
|
||||
mappings = "stable_22"
|
||||
}
|
||||
|
||||
def printDebug(message) {
|
||||
println '[' + archivesBaseName + '] ' + message
|
||||
}
|
||||
|
||||
class CurseForgeDependencyInfo {
|
||||
public String module, version, ext;
|
||||
private String fileid;
|
||||
|
||||
public CurseForgeDependencyInfo(String module, String version, String ext, String fileid) {
|
||||
this.module = module;
|
||||
this.version = version;
|
||||
this.ext = ext;
|
||||
this.fileid = fileid;
|
||||
}
|
||||
|
||||
public String GetFileId() {
|
||||
return Integer.parseInt(fileid.substring(0, 4)) + "/" + Integer.parseInt(fileid.substring(4));
|
||||
}
|
||||
}
|
||||
|
||||
// Dependencies on CurseForge
|
||||
List<CurseForgeDependencyInfo> curseForgeDependencies = new ArrayList<CurseForgeDependencyInfo>();
|
||||
|
||||
dependencies {
|
||||
compile 'net.dv8tion:JDA:2.0.0_242:withDependencies'
|
||||
|
||||
for (CurseForgeDependencyInfo dependency : curseForgeDependencies) {
|
||||
if (file('../' + dependency.module).exists()) {
|
||||
printDebug 'Using local ' + dependency.module + ' project'
|
||||
compile project(':' + dependency.module)
|
||||
continue;
|
||||
}
|
||||
if (file('./' + dependency.module + '.jar').exists()) {
|
||||
printDebug 'Using local ' + dependency.module + ' compiled jar'
|
||||
compile files('./' + dependency.module + '.jar')
|
||||
continue;
|
||||
}
|
||||
compile group: dependency.GetFileId(), name: dependency.module, version: dependency.version, ext: dependency.ext
|
||||
}
|
||||
}
|
||||
|
||||
shadowJar {
|
||||
classifier = ""
|
||||
relocate "com.mashape.unirest", "chikachi.discord.repack.com.mashape.unirest"
|
||||
relocate "com.neovisionaries.ws.client", "chikachi.discord.repack.com.neovisionaries.ws.client"
|
||||
relocate "com.sun.jna", "chikachi.discord.repack.com.sun.jna"
|
||||
relocate "javax.sound", "chikachi.discord.repack.javax.sound"
|
||||
relocate "javazoom", "chikachi.discord.repack.javazoom"
|
||||
relocate "net.dv8tion.jda", "chikachi.discord.repack.net.dv8tion.jda"
|
||||
relocate "net.sourceforge.jaad", "chikachi.discord.repack.net.sourceforge.jaad"
|
||||
relocate "org.apache.commons.codec", "chikachi.discord.repack.org.apache.commons.codec"
|
||||
relocate "org.apache.commons.lang3", "chikachi.discord.repack.org.apache.commons.lang3"
|
||||
relocate "org.json", "chikachi.discord.repack.org.json"
|
||||
relocate "org.kc7bfi.jflac", "chikachi.discord.repack.orgkc7bfi.jflac"
|
||||
relocate "org.tritonus", "chikachi.discord.repack.org.tritonus"
|
||||
relocate "tomp2p.opuswrapper", "chikachi.discord.repack.tomp2p.opuswrapper"
|
||||
|
||||
relocate "org.apache.http", "chikachi.discord.repack.org.apache.http"
|
||||
relocate "org.apache.commons.logging", "chikachi.discord.repack.org.apache.commons.logging"
|
||||
|
||||
dependencies {
|
||||
include(dependency('net.dv8tion:JDA:2.0.0_242:withDependencies'))
|
||||
}
|
||||
}
|
||||
|
||||
processResources {
|
||||
// this will ensure that this task is redone when the versions change.
|
||||
inputs.property "version", project.version
|
||||
inputs.property "mcversion", project.minecraft.version
|
||||
|
||||
// replace stuff in mcmod.info, nothing else
|
||||
from(sourceSets.main.resources.srcDirs) {
|
||||
include 'mcmod.info'
|
||||
|
||||
// replace version and mcversion
|
||||
expand 'version': project.version, 'mcversion': project.minecraft.version
|
||||
}
|
||||
|
||||
// copy everything else, thats not the mcmod.info
|
||||
from(sourceSets.main.resources.srcDirs) {
|
||||
exclude 'mcmod.info'
|
||||
}
|
||||
}
|
||||
|
||||
reobf { shadowJar { mappingType = "SEARGE" } }
|
||||
tasks.reobfShadowJar.mustRunAfter shadowJar
|
||||
|
||||
idea { module { inheritOutputDirs = true } }
|
Binary file not shown.
|
@ -0,0 +1,6 @@
|
|||
#Mon Sep 14 12:28:28 PDT 2015
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-2.7-bin.zip
|
|
@ -0,0 +1,164 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
##############################################################################
|
||||
##
|
||||
## Gradle start up script for UN*X
|
||||
##
|
||||
##############################################################################
|
||||
|
||||
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||
DEFAULT_JVM_OPTS=""
|
||||
|
||||
APP_NAME="Gradle"
|
||||
APP_BASE_NAME=`basename "$0"`
|
||||
|
||||
# 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
|
||||
case "`uname`" in
|
||||
CYGWIN* )
|
||||
cygwin=true
|
||||
;;
|
||||
Darwin* )
|
||||
darwin=true
|
||||
;;
|
||||
MINGW* )
|
||||
msys=true
|
||||
;;
|
||||
esac
|
||||
|
||||
# For Cygwin, ensure paths are in UNIX format before anything is touched.
|
||||
if $cygwin ; then
|
||||
[ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
|
||||
fi
|
||||
|
||||
# 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\"`/" >&-
|
||||
APP_HOME="`pwd -P`"
|
||||
cd "$SAVED" >&-
|
||||
|
||||
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" ] ; 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"`
|
||||
|
||||
# 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 "$@"
|
|
@ -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
|
||||
|
||||
@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=
|
||||
|
||||
set DIRNAME=%~dp0
|
||||
if "%DIRNAME%" == "" set DIRNAME=.
|
||||
set APP_BASE_NAME=%~n0
|
||||
set APP_HOME=%DIRNAME%
|
||||
|
||||
@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 Windowz 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
|
Binary file not shown.
|
@ -0,0 +1,52 @@
|
|||
package chikachi.discord;
|
||||
|
||||
import net.minecraftforge.fml.common.Mod;
|
||||
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
|
||||
import net.minecraftforge.fml.common.event.FMLServerStartedEvent;
|
||||
import net.minecraftforge.fml.common.event.FMLServerStartingEvent;
|
||||
import net.minecraftforge.fml.common.event.FMLServerStoppingEvent;
|
||||
import org.apache.logging.log4j.Level;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
|
||||
@SuppressWarnings("WeakerAccess")
|
||||
@Mod(modid = Constants.MODID, name = Constants.MODNAME, version = Constants.VERSION, serverSideOnly = true, acceptableRemoteVersions = "*")
|
||||
public class ChikachiDiscord {
|
||||
private static Proxy proxy = new Proxy();
|
||||
|
||||
private static final Logger logger = LogManager.getLogger(Constants.MODID);
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
@Mod.EventHandler
|
||||
public void onPreInit(FMLPreInitializationEvent event) {
|
||||
proxy.onPreInit(event);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
@Mod.EventHandler
|
||||
public void onServerStarting(FMLServerStartingEvent event) {
|
||||
proxy.onServerStarting(event);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
@Mod.EventHandler
|
||||
public void onServerStarted(FMLServerStartedEvent event) {
|
||||
proxy.onServerStarted(event);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
@Mod.EventHandler
|
||||
public void onServerShutdown(FMLServerStoppingEvent event) {
|
||||
proxy.onServerShutdown(event);
|
||||
|
||||
}
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
public static void Log(String message) {
|
||||
Log(message, false);
|
||||
}
|
||||
|
||||
static void Log(String message, boolean warning) {
|
||||
logger.log(warning ? Level.WARN : Level.INFO, String.format("[%s] %s", Constants.VERSION, message));
|
||||
}
|
||||
}
|
|
@ -0,0 +1,260 @@
|
|||
package chikachi.discord;
|
||||
|
||||
import com.google.gson.stream.JsonReader;
|
||||
import com.google.gson.stream.JsonWriter;
|
||||
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileReader;
|
||||
import java.io.FileWriter;
|
||||
import java.io.IOException;
|
||||
|
||||
class Configuration {
|
||||
private static File config;
|
||||
private static String token = "";
|
||||
private static String channel = "";
|
||||
|
||||
private static boolean commandOnline = false;
|
||||
|
||||
private static EnableMessageTuple discordChat = new EnableMessageTuple(true, "<__%s__> %s");
|
||||
private static EnableMessageTuple discordDeath = new EnableMessageTuple(true, "__%s__ %s");
|
||||
private static EnableMessageTuple discordAchievement = new EnableMessageTuple(true, "Congrats to __%s__ for earning the achievement **[%s]**");
|
||||
private static EnableMessageTuple discordJoin = new EnableMessageTuple(true, "__%s__ has joined the LoveClan server! We hope you enjoy your stay :)");
|
||||
private static EnableMessageTuple discordLeave = new EnableMessageTuple(true, "__%s__ left the LoveClan server! We hope to see you back again soon!");
|
||||
private static EnableMessageTuple discordStartup = new EnableMessageTuple(false, "**Server started**");
|
||||
private static EnableMessageTuple discordShutdown = new EnableMessageTuple(false, "**Server shutdown**");
|
||||
|
||||
private static EnableMessageTuple minecraftChat = new EnableMessageTuple(true, "<__%s__> %s");
|
||||
|
||||
static void onPreInit(FMLPreInitializationEvent event) {
|
||||
File directory = new File(event.getModConfigurationDirectory().getAbsolutePath() + File.separator + "Chikachi");
|
||||
//noinspection ResultOfMethodCallIgnored
|
||||
directory.mkdirs();
|
||||
|
||||
config = new File(directory, Constants.MODID + ".json");
|
||||
|
||||
load();
|
||||
}
|
||||
|
||||
private static EnableMessageTuple readEnableMessageCombo(JsonReader reader) throws IOException {
|
||||
String name;
|
||||
|
||||
boolean enabled = false;
|
||||
String message = "";
|
||||
|
||||
reader.beginObject();
|
||||
while (reader.hasNext()) {
|
||||
name = reader.nextName();
|
||||
if (name.equalsIgnoreCase("enabled")) {
|
||||
enabled = reader.nextBoolean();
|
||||
} else if (name.equalsIgnoreCase("message")) {
|
||||
message = reader.nextString();
|
||||
} else {
|
||||
reader.skipValue();
|
||||
}
|
||||
}
|
||||
reader.endObject();
|
||||
|
||||
return new EnableMessageTuple(enabled, message);
|
||||
}
|
||||
|
||||
private static void writeEnableMessageCombo(JsonWriter writer, String key, String message) throws IOException {
|
||||
writeEnableMessageCombo(writer, key, message, true);
|
||||
}
|
||||
|
||||
private static void writeEnableMessageCombo(JsonWriter writer, String key, String message, boolean enabled) throws IOException {
|
||||
writer.name(key);
|
||||
writer.beginObject();
|
||||
writer.name("enabled");
|
||||
writer.value(enabled);
|
||||
writer.name("message");
|
||||
writer.value(message);
|
||||
writer.endObject();
|
||||
}
|
||||
|
||||
private static void load() {
|
||||
if (config == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!config.exists()) {
|
||||
try {
|
||||
JsonWriter writer = new JsonWriter(new FileWriter(config));
|
||||
|
||||
writer.beginObject();
|
||||
|
||||
writer.name("discord");
|
||||
|
||||
writer.beginObject();
|
||||
writer.name("token");
|
||||
writer.value("");
|
||||
writer.name("channel");
|
||||
writer.value("");
|
||||
|
||||
writer.name("commands");
|
||||
|
||||
writer.beginObject();
|
||||
writer.name("online");
|
||||
writer.value(true);
|
||||
writer.endObject();
|
||||
writer.endObject();
|
||||
|
||||
writer.name("messages");
|
||||
|
||||
writer.beginObject();
|
||||
writer.name("discord");
|
||||
|
||||
writer.beginObject();
|
||||
writeEnableMessageCombo(writer, "chat", "<__%s__> %s");
|
||||
writeEnableMessageCombo(writer, "death", "__%s__ %s");
|
||||
writeEnableMessageCombo(writer, "achievement", "__%s__ have gotten the achievement **[%s]**");
|
||||
writeEnableMessageCombo(writer, "join", "__%s__ joined the server!");
|
||||
writeEnableMessageCombo(writer, "leave", "__%s__ left the server!");
|
||||
writeEnableMessageCombo(writer, "startup", "**Server started**", false);
|
||||
writeEnableMessageCombo(writer, "shutdown", "**Server shutdown**", false);
|
||||
writer.endObject();
|
||||
|
||||
writer.name("minecraft");
|
||||
|
||||
writer.beginObject();
|
||||
writeEnableMessageCombo(writer, "chat", "<%s> %s");
|
||||
writer.endObject();
|
||||
writer.endObject();
|
||||
|
||||
writer.endObject();
|
||||
|
||||
writer.close();
|
||||
} catch (IOException e) {
|
||||
ChikachiDiscord.Log("Error generating default config file", true);
|
||||
e.printStackTrace();
|
||||
}
|
||||
} else {
|
||||
try {
|
||||
JsonReader reader = new JsonReader(new FileReader(config));
|
||||
String name;
|
||||
|
||||
reader.beginObject();
|
||||
while (reader.hasNext()) {
|
||||
name = reader.nextName();
|
||||
if (name.equalsIgnoreCase("discord")) {
|
||||
reader.beginObject();
|
||||
while (reader.hasNext()) {
|
||||
name = reader.nextName();
|
||||
if (name.equalsIgnoreCase("token")) {
|
||||
token = reader.nextString();
|
||||
} else if (name.equalsIgnoreCase("channel")) {
|
||||
channel = reader.nextString();
|
||||
} else if (name.equalsIgnoreCase("commands")) {
|
||||
reader.beginObject();
|
||||
while (reader.hasNext()) {
|
||||
name = reader.nextName();
|
||||
if (name.equalsIgnoreCase("online")) {
|
||||
commandOnline = reader.nextBoolean();
|
||||
} else {
|
||||
reader.skipValue();
|
||||
}
|
||||
}
|
||||
reader.endObject();
|
||||
} else {
|
||||
reader.skipValue();
|
||||
}
|
||||
}
|
||||
reader.endObject();
|
||||
} else if (name.equalsIgnoreCase("messages")) {
|
||||
reader.beginObject();
|
||||
while (reader.hasNext()) {
|
||||
name = reader.nextName();
|
||||
if (name.equalsIgnoreCase("discord")) {
|
||||
reader.beginObject();
|
||||
while (reader.hasNext()) {
|
||||
name = reader.nextName();
|
||||
if (name.equalsIgnoreCase("chat")) {
|
||||
discordChat = readEnableMessageCombo(reader);
|
||||
} else if (name.equalsIgnoreCase("death")) {
|
||||
discordDeath = readEnableMessageCombo(reader);
|
||||
} else if (name.equalsIgnoreCase("achievement")) {
|
||||
discordAchievement = readEnableMessageCombo(reader);
|
||||
} else if (name.equalsIgnoreCase("join")) {
|
||||
discordJoin = readEnableMessageCombo(reader);
|
||||
} else if (name.equalsIgnoreCase("leave")) {
|
||||
discordLeave = readEnableMessageCombo(reader);
|
||||
} else if (name.equalsIgnoreCase("startup")) {
|
||||
discordStartup = readEnableMessageCombo(reader);
|
||||
} else if (name.equalsIgnoreCase("shutdown")) {
|
||||
discordShutdown = readEnableMessageCombo(reader);
|
||||
} else {
|
||||
reader.skipValue();
|
||||
}
|
||||
}
|
||||
reader.endObject();
|
||||
} else if (name.equalsIgnoreCase("minecraft")) {
|
||||
reader.beginObject();
|
||||
while (reader.hasNext()) {
|
||||
name = reader.nextName();
|
||||
if (name.equalsIgnoreCase("chat")) {
|
||||
minecraftChat = readEnableMessageCombo(reader);
|
||||
} else {
|
||||
reader.skipValue();
|
||||
}
|
||||
}
|
||||
reader.endObject();
|
||||
} else {
|
||||
reader.skipValue();
|
||||
}
|
||||
}
|
||||
reader.endObject();
|
||||
} else {
|
||||
reader.skipValue();
|
||||
}
|
||||
}
|
||||
reader.endObject();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static String getToken() {
|
||||
return token;
|
||||
}
|
||||
|
||||
static String getChannel() {
|
||||
return channel;
|
||||
}
|
||||
|
||||
static boolean isCommandOnlineEnabled() {
|
||||
return commandOnline;
|
||||
}
|
||||
|
||||
static EnableMessageTuple getDiscordChat() {
|
||||
return discordChat;
|
||||
}
|
||||
|
||||
static EnableMessageTuple getDiscordDeath() {
|
||||
return discordDeath;
|
||||
}
|
||||
|
||||
static EnableMessageTuple getDiscordAchievement() {
|
||||
return discordAchievement;
|
||||
}
|
||||
|
||||
static EnableMessageTuple getDiscordJoin() {
|
||||
return discordJoin;
|
||||
}
|
||||
|
||||
static EnableMessageTuple getDiscordLeave() {
|
||||
return discordLeave;
|
||||
}
|
||||
|
||||
static EnableMessageTuple getDiscordStartup() {
|
||||
return discordStartup;
|
||||
}
|
||||
|
||||
static EnableMessageTuple getDiscordShutdown() {
|
||||
return discordShutdown;
|
||||
}
|
||||
|
||||
static EnableMessageTuple getMinecraftChat() {
|
||||
return minecraftChat;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,7 @@
|
|||
package chikachi.discord;
|
||||
|
||||
public class Constants {
|
||||
static final String MODID = "ChikachiDiscord";
|
||||
static final String MODNAME = "Chikachi's Discord";
|
||||
static final String VERSION = "0.1";
|
||||
}
|
|
@ -0,0 +1,74 @@
|
|||
package chikachi.discord;
|
||||
|
||||
import net.dv8tion.jda.JDA;
|
||||
import net.dv8tion.jda.JDABuilder;
|
||||
import net.dv8tion.jda.entities.TextChannel;
|
||||
import net.dv8tion.jda.entities.User;
|
||||
|
||||
import javax.security.auth.login.LoginException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
class DiscordClient {
|
||||
private static DiscordClient instance;
|
||||
private JDA jda;
|
||||
private DiscordListener listener = new DiscordListener();
|
||||
TextChannel channel;
|
||||
List<String> queue = new ArrayList<>();
|
||||
|
||||
static DiscordClient getInstance() {
|
||||
if (instance == null) {
|
||||
instance = new DiscordClient();
|
||||
}
|
||||
|
||||
return instance;
|
||||
}
|
||||
|
||||
private DiscordClient() {
|
||||
|
||||
}
|
||||
|
||||
void connect() {
|
||||
String token = Configuration.getToken();
|
||||
|
||||
if (token.isEmpty()) {
|
||||
ChikachiDiscord.Log("Missing token", true);
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
this.jda = new JDABuilder().setBotToken(token).addListener(this.listener).buildAsync();
|
||||
} catch (LoginException e) {
|
||||
ChikachiDiscord.Log("Failed to connect to Discord", true);
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
boolean sendMessage(String message) {
|
||||
if (this.jda == null) {
|
||||
this.queue.add(message);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (this.channel == null) {
|
||||
this.channel = this.jda.getTextChannelById(Configuration.getChannel());
|
||||
if (this.channel == null) {
|
||||
ChikachiDiscord.Log("Failed to find channel", true);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (message.contains("@")) {
|
||||
List<User> users = this.channel.getGuild().getUsers();
|
||||
|
||||
for (User user : users) {
|
||||
if (message.contains("@" + user.getUsername())) {
|
||||
message = message.replace("@" + user.getUsername(), user.getAsMention());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
this.channel.sendMessage(message);
|
||||
return true;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,58 @@
|
|||
package chikachi.discord;
|
||||
|
||||
import net.minecraft.entity.player.EntityPlayerMP;
|
||||
import net.minecraft.network.NetHandlerPlayServer;
|
||||
import net.minecraft.network.NetworkManager;
|
||||
import net.minecraft.network.Packet;
|
||||
import net.minecraft.network.play.client.*;
|
||||
import net.minecraft.server.MinecraftServer;
|
||||
|
||||
class DiscordFakeNetServerHandler extends NetHandlerPlayServer {
|
||||
DiscordFakeNetServerHandler(NetworkManager networkManagerIn, EntityPlayerMP playerIn) {
|
||||
super(null, networkManagerIn, playerIn);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void sendPacket(Packet packetIn) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void kickPlayerFromServer(String reason) {
|
||||
MinecraftServer.getServer().getConfigurationManager().playerEntityList.remove(playerEntity);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void processKeepAlive(C00PacketKeepAlive packetIn) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public NetworkManager getNetworkManager() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handleResourcePackStatus(C19PacketResourcePackStatus packetIn) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void processClickWindow(C0EPacketClickWindow packetIn) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void processPlayerBlockPlacement(C08PacketPlayerBlockPlacement packetIn) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void processVanilla250Packet(C17PacketCustomPayload packetIn) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
package chikachi.discord;
|
||||
|
||||
import com.mojang.authlib.GameProfile;
|
||||
import net.dv8tion.jda.entities.User;
|
||||
import net.minecraft.network.EnumPacketDirection;
|
||||
import net.minecraft.network.NetworkManager;
|
||||
import net.minecraft.server.MinecraftServer;
|
||||
import net.minecraftforge.common.util.FakePlayer;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
class DiscordFakePlayer extends FakePlayer {
|
||||
DiscordFakePlayer(User user) {
|
||||
super(MinecraftServer.getServer().worldServers[0], new GameProfile(UUID.randomUUID(), "@" + user.getUsername()));
|
||||
|
||||
this.dimension = Integer.MIN_VALUE;
|
||||
this.playerNetServerHandler = new DiscordFakeNetServerHandler(new NetworkManager(EnumPacketDirection.SERVERBOUND), this);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,144 @@
|
|||
package chikachi.discord;
|
||||
|
||||
import com.google.common.base.Joiner;
|
||||
import com.mojang.authlib.GameProfile;
|
||||
import net.dv8tion.jda.OnlineStatus;
|
||||
import net.dv8tion.jda.entities.TextChannel;
|
||||
import net.dv8tion.jda.entities.User;
|
||||
import net.dv8tion.jda.events.ReadyEvent;
|
||||
import net.dv8tion.jda.events.message.MessageReceivedEvent;
|
||||
import net.dv8tion.jda.events.user.UserOnlineStatusUpdateEvent;
|
||||
import net.dv8tion.jda.hooks.ListenerAdapter;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.entity.player.EntityPlayerMP;
|
||||
import net.minecraft.server.MinecraftServer;
|
||||
import net.minecraft.util.IChatComponent;
|
||||
import net.minecraftforge.common.ForgeHooks;
|
||||
import net.minecraftforge.common.util.FakePlayer;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
class DiscordListener extends ListenerAdapter {
|
||||
private HashMap<String, FakePlayer> fakePlayers = new HashMap<>();
|
||||
private MinecraftServer minecraftServer;
|
||||
|
||||
private void userOnline(User user) {
|
||||
if (user == null) return;
|
||||
if (user.getOnlineStatus() == OnlineStatus.OFFLINE) return;
|
||||
|
||||
DiscordFakePlayer discordFakePlayer = new DiscordFakePlayer(user);
|
||||
|
||||
minecraftServer.getConfigurationManager().playerEntityList.add(discordFakePlayer);
|
||||
|
||||
fakePlayers.put(user.getUsername(), discordFakePlayer);
|
||||
}
|
||||
|
||||
private void userOffline(User user) {
|
||||
if (user == null) return;
|
||||
if (user.getOnlineStatus() != OnlineStatus.OFFLINE) return;
|
||||
|
||||
if (fakePlayers.containsKey(user.getUsername())) {
|
||||
FakePlayer fakePlayer = fakePlayers.get(user.getUsername());
|
||||
if (fakePlayer != null) {
|
||||
minecraftServer.getConfigurationManager().playerEntityList.remove(fakePlayer);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onReady(ReadyEvent event) {
|
||||
DiscordClient client = DiscordClient.getInstance();
|
||||
List<String> queue = client.queue;
|
||||
queue.forEach(client::sendMessage);
|
||||
client.queue.clear();
|
||||
|
||||
minecraftServer = MinecraftServer.getServer();
|
||||
|
||||
List<User> users = client.channel.getUsers();
|
||||
users.forEach(this::userOnline);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onUserOnlineStatusUpdate(UserOnlineStatusUpdateEvent event) {
|
||||
User user = event.getUser();
|
||||
OnlineStatus before = event.getPreviousOnlineStatus();
|
||||
OnlineStatus now = user.getOnlineStatus();
|
||||
|
||||
if (before == OnlineStatus.OFFLINE && now != OnlineStatus.OFFLINE) {
|
||||
userOnline(user);
|
||||
} else if (before != OnlineStatus.OFFLINE && now == OnlineStatus.OFFLINE) {
|
||||
userOffline(user);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onMessageReceived(MessageReceivedEvent event) {
|
||||
// Ignore bots
|
||||
if (event.getAuthor().isBot()) return;
|
||||
// Ignore private messages
|
||||
if (!(event.getChannel() instanceof TextChannel)) return;
|
||||
// Ignore other channels
|
||||
if (!event.getMessage().getChannelId().equals(Configuration.getChannel())) return;
|
||||
|
||||
String content = event.getMessage().getContent().trim();
|
||||
|
||||
if (content.startsWith("!")) {
|
||||
List<String> args = new ArrayList<>(Arrays.asList(content.substring(1).split(" ")));
|
||||
String cmd = args.remove(0);
|
||||
if (Configuration.isCommandOnlineEnabled() && cmd.equalsIgnoreCase("online")) {
|
||||
List<String> playerNames = new ArrayList<>();
|
||||
|
||||
List<EntityPlayerMP> players = MinecraftServer.getServer().getConfigurationManager().getPlayerList();
|
||||
int playersOnline = players.size();
|
||||
if (playersOnline == 0) {
|
||||
DiscordClient.getInstance().sendMessage("No players online");
|
||||
return;
|
||||
}
|
||||
|
||||
playerNames.addAll(players.stream().map(EntityPlayerMP::getDisplayNameString).collect(Collectors.toList()));
|
||||
|
||||
if (playersOnline == 1) {
|
||||
DiscordClient.getInstance().sendMessage(
|
||||
String.format(
|
||||
"Current player online: %s",
|
||||
Joiner.on(", ").join(playerNames)
|
||||
)
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
DiscordClient.getInstance().sendMessage(
|
||||
String.format(
|
||||
"Current players online (%d): %s",
|
||||
playersOnline,
|
||||
Joiner.on(", ").join(playerNames)
|
||||
)
|
||||
);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
EnableMessageTuple setting = Configuration.getMinecraftChat();
|
||||
if (!setting.isEnabled()) return;
|
||||
|
||||
String messageText = String.format(
|
||||
setting.getMessage(),
|
||||
event.getAuthor().getUsername(),
|
||||
content
|
||||
);
|
||||
|
||||
IChatComponent chatComponent = ForgeHooks.newChatWithLinks(messageText, false);
|
||||
|
||||
if (MinecraftServer.getServer() != null && MinecraftServer.getServer().getConfigurationManager() != null && !MinecraftServer.getServer().isSinglePlayer()) {
|
||||
MinecraftServer.getServer().getConfigurationManager().sendChatMsg(chatComponent);
|
||||
} else {
|
||||
if (Minecraft.getMinecraft().thePlayer != null) {
|
||||
Minecraft.getMinecraft().thePlayer.addChatMessage(chatComponent);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
package chikachi.discord;
|
||||
|
||||
class EnableMessageTuple {
|
||||
private boolean enabled;
|
||||
private String message;
|
||||
|
||||
EnableMessageTuple(boolean enabled, String message) {
|
||||
this.enabled = enabled;
|
||||
this.message = message;
|
||||
}
|
||||
|
||||
boolean isEnabled() {
|
||||
return enabled;
|
||||
}
|
||||
|
||||
String getMessage() {
|
||||
return message;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,109 @@
|
|||
package chikachi.discord;
|
||||
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.entity.player.EntityPlayerMP;
|
||||
import net.minecraft.stats.StatisticsFile;
|
||||
import net.minecraftforge.event.ServerChatEvent;
|
||||
import net.minecraftforge.event.entity.living.LivingDeathEvent;
|
||||
import net.minecraftforge.event.entity.player.AchievementEvent;
|
||||
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
|
||||
import net.minecraftforge.fml.common.gameevent.PlayerEvent;
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
class MinecraftListener {
|
||||
@SubscribeEvent
|
||||
public void onChatMessage(ServerChatEvent event) {
|
||||
if (event.player == null) return;
|
||||
|
||||
EnableMessageTuple setting = Configuration.getDiscordChat();
|
||||
|
||||
if (!setting.isEnabled()) return;
|
||||
|
||||
DiscordClient.getInstance().sendMessage(
|
||||
String.format(
|
||||
setting.getMessage(),
|
||||
event.username,
|
||||
event.message
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public void onPlayerDeath(LivingDeathEvent event) {
|
||||
if (event.entityLiving == null) return;
|
||||
|
||||
if (event.entityLiving instanceof EntityPlayer) {
|
||||
EntityPlayer entityPlayer = (EntityPlayer) event.entityLiving;
|
||||
|
||||
EnableMessageTuple setting = Configuration.getDiscordDeath();
|
||||
|
||||
if (!setting.isEnabled()) return;
|
||||
|
||||
DiscordClient.getInstance().sendMessage(
|
||||
String.format(
|
||||
setting.getMessage(),
|
||||
entityPlayer.getDisplayNameString(),
|
||||
entityPlayer.getCombatTracker().getDeathMessage().getUnformattedText().replace(entityPlayer.getDisplayNameString(), "").trim()
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public void onPlayerAchievement(AchievementEvent event) {
|
||||
if (event.entityPlayer == null) return;
|
||||
|
||||
if (event.entityPlayer instanceof EntityPlayerMP) {
|
||||
StatisticsFile playerStats = ((EntityPlayerMP) event.entityPlayer).getStatFile();
|
||||
|
||||
if (playerStats.hasAchievementUnlocked(event.achievement) || !playerStats.canUnlockAchievement(event.achievement)) {
|
||||
return;
|
||||
}
|
||||
|
||||
EnableMessageTuple setting = Configuration.getDiscordAchievement();
|
||||
|
||||
if (!setting.isEnabled()) return;
|
||||
|
||||
|
||||
DiscordClient.getInstance().sendMessage(
|
||||
String.format(
|
||||
setting.getMessage(),
|
||||
event.entityPlayer.getDisplayNameString(),
|
||||
event.achievement.getStatName().getUnformattedText()
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public void onPlayerJoin(PlayerEvent.PlayerLoggedInEvent event) {
|
||||
if (event.player == null) return;
|
||||
|
||||
EnableMessageTuple setting = Configuration.getDiscordJoin();
|
||||
|
||||
if (!setting.isEnabled()) return;
|
||||
|
||||
DiscordClient.getInstance().sendMessage(
|
||||
String.format(
|
||||
setting.getMessage(),
|
||||
event.player.getDisplayNameString()
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public void onPlayerLeave(PlayerEvent.PlayerLoggedOutEvent event) {
|
||||
if (event.player == null) return;
|
||||
|
||||
EnableMessageTuple setting = Configuration.getDiscordLeave();
|
||||
|
||||
if (!setting.isEnabled()) return;
|
||||
|
||||
DiscordClient.getInstance().sendMessage(
|
||||
String.format(
|
||||
setting.getMessage(),
|
||||
event.player.getDisplayNameString()
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,36 @@
|
|||
package chikachi.discord;
|
||||
|
||||
import net.minecraftforge.common.MinecraftForge;
|
||||
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
|
||||
import net.minecraftforge.fml.common.event.FMLServerStartedEvent;
|
||||
import net.minecraftforge.fml.common.event.FMLServerStartingEvent;
|
||||
import net.minecraftforge.fml.common.event.FMLServerStoppingEvent;
|
||||
|
||||
@SuppressWarnings("UnusedParameters")
|
||||
class Proxy {
|
||||
void onPreInit(FMLPreInitializationEvent event) {
|
||||
Configuration.onPreInit(event);
|
||||
|
||||
MinecraftForge.EVENT_BUS.register(new MinecraftListener());
|
||||
}
|
||||
|
||||
void onServerStarting(FMLServerStartingEvent event) {
|
||||
DiscordClient.getInstance().connect();
|
||||
}
|
||||
|
||||
void onServerStarted(FMLServerStartedEvent event) {
|
||||
EnableMessageTuple setting = Configuration.getDiscordStartup();
|
||||
|
||||
if (setting.isEnabled()) {
|
||||
DiscordClient.getInstance().queue.add(setting.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
void onServerShutdown(FMLServerStoppingEvent event) {
|
||||
EnableMessageTuple setting = Configuration.getDiscordShutdown();
|
||||
|
||||
if (setting.isEnabled()) {
|
||||
DiscordClient.getInstance().sendMessage(setting.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,16 @@
|
|||
[
|
||||
{
|
||||
"modid": "ChikachiDiscord",
|
||||
"name": "Chikachi's Discord Mod",
|
||||
"description": "MC <=> Discord communication",
|
||||
"version": "${version}",
|
||||
"mcversion": "${mcversion}",
|
||||
"url": "",
|
||||
"updateUrl": "",
|
||||
"authorList": ["Chikachi"],
|
||||
"credits": "",
|
||||
"logoFile": "",
|
||||
"screenshots": [],
|
||||
"dependencies": []
|
||||
}
|
||||
]
|
Loading…
Reference in New Issue