Minor updates #4

Merged
jolheiser merged 2 commits from hello-darkness into main 2022-02-11 17:18:59 +00:00
40 changed files with 595 additions and 922 deletions

2
.gitignore vendored
View File

@ -1,4 +1,6 @@
.idea/
*.iml
target/
build/
.gradle/
dependency-reduced-pom.xml

27
.woodpecker.yml 100644
View File

@ -0,0 +1,27 @@
clone:
git:
image: "woodpeckerci/plugin-git:next"
pipeline:
compliance:
commands:
- "gradle build"
- "gradle test"
image: "gradle:7.4-jdk17"
when:
event: pull_request
build:
commands:
- "gradle shadowJar"
image: "gradle:7.4-jdk17"
when:
branch: main
release:
image: jolheiser/drone-gitea-main:latest
settings:
token:
from_secret: gitea_token
base: https://git.jojodev.com
files:
- "build/libs/*.jar"
when:
branch: main

100
README.md 100644
View File

@ -0,0 +1,100 @@
# Minecraft Manager
The Minecraft Manager plugin was created as a partner piece of the [Minecraft Manager Web App](https://git.jojodev.com/Minecraft/minecraft_manager/).
[Example config](src/main/resources/config.yml)
## Commands
### Minecraft Manager
`/minecraftmanager <sub-command> <arg1> <arg2> ...`
`/mcm <sub-command> <arg1> <arg2> ...`
#### Sub-Commands
`help` - Show the help message.
`port` - Shows the port that MCM is listening on.
`register` - Allows a player to register for the web app.
`report` - Runs a report on all entities in the world, for use with the MCM online report.
### Application
`/application <sub-command> <arg1>`
`/app <sub-command> <arg1>`
#### Sub-Commands
`search` - Searches for matching applications. You can use partial names to search. If only one application is found, this command acts as though you are using `info`.
`info` - Gets specific information for a given application. Can be given a name or application ID.
- `accept` and `deny` only work with IDs. This is to verify the correct application is being acted on.
`accept` - Accepts an application by ID.
`deny` - Denies an application by ID.
`clear` - Clears a denied application's status. This is to ensure that players cannot spam applications once denied.
### Apply
`/apply` - Initiates the application process. A user must run `/rules` before they can apply.
### Rules
`/rules` - Shows the current rules defined in the plugin's config.yml
### Ticket
`/ticket <message>` - Used to send in a help ticket.
### Warning
`/warning <player> [<severity>] <message>` - Gives a warning to a player. If \[<severity>] is not one of "L", "M", or "H" it will be automatically set to "L".
## Permissions
### Basic
`minecraftmanager.use` - Allows the use of `/mcm port` and `/mcm reload`.
`minecraftmanager.guest` - This is how MCM figures out who is a "guest". This is used in the event that a player is accepted but isn't online, so all commands are ran next time they come online.
- :exclamation: `minecraftmanager.guest` **must** be removed (negated) once a player is member, otherwise the commands will execute each time they log in.
`minecraftmanager.apply` - Allows the use of `/apply`.
- :exclamation: `minecraftmanager.apply` should probably be revoked once the player has been accepted.
Otherwise, the player could continue to re-apply. (Even though it would never register again)
`minecraftmanager.ticket` - Allows the use of `/ticket`.
----
### Staff
`minecraftmanager.application.search` - Allows the use of `/application search`.
`minecraftmanager.application.action` - Allows the use of `/application accept` and `/application deny`.
- `minecraftmanager.application.*` will give both of the above nodes.
`minecraftmanager.staff` - Allows a player to use Staff Chat (if enabled) and receive Staff messages from MCM.
`minecraftmanager.register` - Allows the use of `/mcm register` to register for the web application.
`minecraftmanager.*` - All permissions for MCM.
- `minecraftmanager.*` also gives the `minecraftmanager.apply` node, which should probably be revoked in normal use cases.
## License
[MIT](LICENSE)

46
build.gradle 100644
View File

@ -0,0 +1,46 @@
plugins {
id 'java'
id 'com.github.johnrengelman.shadow' version '6.0.0'
}
repositories {
mavenLocal()
maven {
url = uri('https://hub.spigotmc.org/nexus/content/groups/public/')
}
maven {
url = uri('https://mvn.jojodev.com/releases')
}
maven {
url = uri('https://jitpack.io')
}
maven {
url = uri('https://repo.maven.apache.org/maven2/')
}
}
dependencies {
implementation 'commons-lang:commons-lang:2.6'
implementation 'log4j:log4j:1.2.17'
implementation 'xyz.etztech:plugin-api:1.0.7'
compileOnly 'org.spigotmc:spigot-api:1.18.1-R0.1-SNAPSHOT'
}
group = 'xyz.etztech'
version = '1.7'
description = 'MinecraftManager'
java.sourceCompatibility = JavaVersion.VERSION_1_8
joeyahines marked this conversation as resolved

Not sure this matters, but should this match the java version in the .woodpecker.yml config?

Not sure this matters, but should this match the java version in the .woodpecker.yml config?
shadowJar {
project.configurations.implementation.canBeResolved = true
configurations = [project.configurations.implementation]
relocate 'xyz.etztech', 'shadow.xyz.etztech'
archiveClassifier.set('')
}
tasks.withType(JavaCompile) {
options.encoding = 'UTF-8'
}

6
docs/.gitignore vendored
View File

@ -1,6 +0,0 @@
.idea/
*.iml
target/
dependency-reduced-pom.xml
build/
source/.doctrees/

View File

@ -1,20 +0,0 @@
# Minimal makefile for Sphinx documentation
#
# You can set these variables from the command line.
SPHINXOPTS =
SPHINXBUILD = sphinx-build
SPHINXPROJ = JavaDocs
SOURCEDIR = source
BUILDDIR = build
# Put it first so that "make" without argument is like "make help".
help:
@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
.PHONY: help Makefile
# Catch-all target: route all unknown targets to Sphinx using the new
# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
%: Makefile
@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)

View File

@ -1,42 +0,0 @@
@ECHO OFF
pushd %~dp0
REM Command file for Sphinx documentation
if "%SPHINXBUILD%" == "" (
set SPHINXBUILD=sphinx-build
)
set SOURCEDIR=source
set BUILDDIR=build
set SPHINXPROJ=JavaDocs
if "%1" == "" goto help
if "%1" == "html" goto clean
:build
%SPHINXBUILD% >NUL 2>NUL
if errorlevel 9009 (
echo.
echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
echo.installed, then set the SPHINXBUILD environment variable to point
echo.to the full path of the 'sphinx-build' executable. Alternatively you
echo.may add the Sphinx directory to PATH.
echo.
echo.If you don't have Sphinx installed, grab it from
echo.http://sphinx-doc.org/
exit /b 1
)
%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS%
goto end
:help
%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS%
:clean
%SPHINXBUILD% -M clean %SOURCEDIR% %BUILDDIR% %SPHINXOPTS%
goto build
:end
popd

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

View File

@ -1,13 +0,0 @@
.. include:: ../common.rst
.. _minecraftmanager_changelogs:
Changelogs
==========
.. toctree::
:maxdepth: 1
v1.4 <v1.4>
v1.5 <v1.5>
v1.6 <v1.6>

View File

@ -1,17 +0,0 @@
.. include:: ../common.rst
.. _minecraftmanager_v1.4:
MinecraftManager v1.4
=====================
Additions
---------
* Updates to EtzCore
Bug Fixes
---------
* `In-game staff chat bug`_- Second line of in-game staff chat is white when the message is sent from MCM.
.. _In-game staff chat bug: https://git.etztech.xyz/Etzelia/MinecraftManagerPlugin/issues/1

View File

@ -1,22 +0,0 @@
.. include:: ../common.rst
.. _minecraftmanager_v1.5:
MinecraftManager v1.5
=====================
Additions
---------
* `Demote action for plugin listener`_- Adds a demote action to the plugin listener, for demoting staff (or other players).
* `Move MCM Tag`_- Moves the [MCM] tag to a hover event based on config option.
* `Guests must read /rules`_- New users must run ``/rules`` before doing ``/apply``
.. _Demote action for plugin listener: https://git.etztech.xyz/Etzelia/MinecraftManagerPlugin/issues/5
.. _Move MCM Tag: https://git.etztech.xyz/Etzelia/MinecraftManagerPlugin/issues/3
.. _Guests must read /rules: https://git.etztech.xyz/Etzelia/MinecraftManagerPlugin/issues/4
Bug Fixes
---------
* None

View File

@ -1,20 +0,0 @@
.. include:: ../common.rst
.. _minecraftmanager_v1.6:
MinecraftManager v1.6
=====================
Additions
---------
* `Log Rotation`_- Global/Staff logs now rotate.
* `Native OreAlert`_- OreAlert is now provided as a plugin service instead of a bot.
.. _Log Rotation: https://git.etztech.xyz/Etzelia/MinecraftManagerPlugin/issues/11
.. _Native OreAlert: https://git.etztech.xyz/Etzelia/MinecraftManagerPlugin/issues/8
Bug Fixes
---------
* None

View File

@ -1,66 +0,0 @@
.. include:: common.rst
.. _minecraftmanager_commands:
Commands
========
Minecraft Manager
-----------------
``/minecraftmanager <sub-command> <arg1> <arg2> ...``
``/mcm <sub-command> <arg1> <arg2> ...``
Sub-Commands
~~~~~~~~~~~~
``help`` - Show the help message.
``port`` - Shows the port that MCM is listening on.
``register`` - Allows a player to register for the web app.
``report`` - Runs a report on all entities in the world, for use with the MCM online report.
Application
-----------
``/application <sub-command> <arg1>``
``/app <sub-command> <arg1>``
Sub-Commands
~~~~~~~~~~~~
``search`` - Searches for matching applications. You can use partial names to search. If only one application is found, this command acts as though you are using ``info``.
``info`` - Gets specific information for a given application. Can be given a name or application ID.
.. note::
``accept`` and ``deny`` only work with IDs. This is to verify the correct application is being acted on.
``accept`` - Accepts an application by ID.
``deny`` - Denies an application by ID.
``clear`` - Clears a denied application's status. This is to ensure that players cannot spam applications once denied.
Apply
-----
``/apply`` - Initiates the application process. A user must run ``/rules`` before they can apply.
Rules
-----
``/rules`` - Shows the current rules defined in the plugin's config.yml
Ticket
------
``/ticket <message>`` - Used to send in a help ticket.
Warning
-------
``/warning <player> [<severity>] <message>`` - Gives a warning to a player. If [<severity>] is not one of "L", "M", or "H" it will be automatically set to "L".

View File

@ -1,3 +0,0 @@
.. |br| raw:: html
<br>

View File

@ -1,170 +0,0 @@
# -*- coding: utf-8 -*-
#
# Configuration file for the Sphinx documentation builder.
#
# This file does only contain a selection of the most common options. For a
# full list see the documentation:
# http://www.sphinx-doc.org/en/master/config
# -- Path setup --------------------------------------------------------------
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
#
# -- Project information -----------------------------------------------------
project = 'Minecraft Manager Plugin'
copyright = '2018, Etzelia'
author = 'Etzelia'
# The short X.Y version
version = '1.0'
# The full version, including alpha/beta/rc tags
release = '1.0'
# -- General configuration ---------------------------------------------------
# If your documentation needs a minimal Sphinx version, state it here.
#
# needs_sphinx = '1.0'
# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones.
extensions = [
'sphinx.ext.doctest',
'sphinx.ext.todo',
'sphinx.ext.coverage',
'sphinx.ext.ifconfig',
'sphinx.ext.autodoc',
]
# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']
# The suffix(es) of source filenames.
# You can specify multiple suffix as a list of string:
#
# source_suffix = ['.rst', '.md']
source_suffix = '.rst'
html_show_sourcelink = False
# The master toctree document.
master_doc = 'index'
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
#
# This is also used if you do content translation via gettext catalogs.
# Usually you set "language" from the command line for these cases.
language = None
# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
# This pattern also affects html_static_path and html_extra_path .
exclude_patterns = ['common.rst', 'template.rst']
# The name of the Pygments (syntax highlighting) style to use.
pygments_style = 'sphinx'
# -- Options for HTML output -------------------------------------------------
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
#
html_theme = 'sphinx_rtd_theme'
# Path to the favicon
html_favicon = '_static/favicon.png'
# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the
# documentation.
#
# html_theme_options = {}
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = []
# Custom sidebar templates, must be a dictionary that maps document names
# to template names.
#
# The default sidebars (for documents that don't match any pattern) are
# defined by theme itself. Builtin themes are using these templates by
# default: ``['localtoc.html', 'relations.html', 'sourcelink.html',
# 'searchbox.html']``.
#
# html_sidebars = {}
# -- Options for HTMLHelp output ---------------------------------------------
# Output file base name for HTML help builder.
htmlhelp_basename = 'JavaDocsdoc'
# -- Options for LaTeX output ------------------------------------------------
latex_elements = {
# The paper size ('letterpaper' or 'a4paper').
#
# 'papersize': 'letterpaper',
# The font size ('10pt', '11pt' or '12pt').
#
# 'pointsize': '10pt',
# Additional stuff for the LaTeX preamble.
#
# 'preamble': '',
# Latex figure (float) alignment
#
# 'figure_align': 'htbp',
}
# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title,
# author, documentclass [howto, manual, or own class]).
latex_documents = [
(master_doc, 'JavaDocs.tex', 'Java Plugin Documentation',
'Etzelia', 'manual'),
]
# -- Options for manual page output ------------------------------------------
# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
man_pages = [
(master_doc, 'javadocs', 'Java Plugin Documentation',
[author], 1)
]
# -- Options for Texinfo output ----------------------------------------------
# Grouping the document tree into Texinfo files. List of tuples
# (source start file, target name, title, author,
# dir menu entry, description, category)
texinfo_documents = [
(master_doc, 'JavaDocs', 'Java Plugin Documentation',
author, 'JavaDocs', 'One line description of project.',
'Miscellaneous'),
]
# -- Extension configuration -------------------------------------------------
# -- Options for todo extension ----------------------------------------------
# If true, `todo` and `todoList` produce output, else they produce nothing.
todo_include_todos = True

View File

@ -1,17 +0,0 @@
.. include:: common.rst
Minecraft Manager
=================
The Minecraft Manager plugin was created as a partner piece of the Minecraft Manager Web App. |br|
Documentation for the Django app can be found `here <http://docs.etztech.xyz/minecraftmanager/>`_.
:download:`Example Config </../../src/main/resources/config.yml>`
.. toctree::
:maxdepth: 1
:titlesonly:
changelog/index
commands
permissions

View File

@ -1,48 +0,0 @@
.. include:: common.rst
.. _minecraftmanager_permissions:
Permissions
===========
Basic
-----
``minecraftmanager.use`` - Allows the use of ``/mcm port`` and ``/mcm reload``.
``minecraftmanager.guest`` - This is how MCM figures out who is a "guest". This is used in the event that a player is accepted but isn't online, so all commands are ran next time they come online.
.. warning::
``minecraftmanager.guest`` **must** be removed (negated) once a player is member, otherwise the commands will execute each time they log in.
``minecraftmanager.apply`` - Allows the use of ``/apply``.
.. warning::
``minecraftmanager.apply`` should probably be revoked once the player has been accepted. |br|
Otherwise, the player could continue to re-apply. (Even though it would never register again)
``minecraftmanager.ticket`` - Allows the use of ``/ticket``.
----
Staff
-----
``minecraftmanager.application.search`` - Allows the use of ``/application search``.
``minecraftmanager.application.action`` - Allows the use of ``/application accept`` and ``/application deny``.
.. note::
``minecraftmanager.application.*`` will give both of the above nodes.
``minecraftmanager.staff`` - Allows a player to use Staff Chat (if enabled) and receive Staff messages from MCM.
``minecraftmanager.register`` - Allows the use of ``/mcm register`` to register for the web application.
``minecraftmanager.*`` - All permissions for MCM.
.. note::
``minecraftmanager.*`` also gives the ``minecraftmanager.apply`` node, which should probably be revoked in normal use cases.

BIN
gradle/wrapper/gradle-wrapper.jar vendored 100644

Binary file not shown.

View File

@ -0,0 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

234
gradlew vendored 100755
View File

@ -0,0 +1,234 @@
#!/bin/sh
#
# Copyright © 2015-2021 the original 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 POSIX generated by Gradle.
#
# Important for running:
#
# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
# noncompliant, but you have some other compliant shell such as ksh or
# bash, then to run this script, type that shell name before the whole
# command line, like:
#
# ksh Gradle
#
# Busybox and similar reduced shells will NOT work, because this script
# requires all of these POSIX shell features:
# * functions;
# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
# * compound commands having a testable exit status, especially «case»;
# * various built-in commands including «command», «set», and «ulimit».
#
# Important for patching:
#
# (2) This script targets any POSIX shell, so it avoids extensions provided
# by Bash, Ksh, etc; in particular arrays are avoided.
#
# The "traditional" practice of packing multiple parameters into a
# space-separated string is a well documented source of bugs and security
# problems, so this is (mostly) avoided, by progressively accumulating
# options in "$@", and eventually passing that to Java.
#
# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
# see the in-line comments for details.
#
# There are tweaks for specific operating systems such as AIX, CygWin,
# Darwin, MinGW, and NonStop.
#
# (3) This script is generated from the Groovy template
# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project.
#
# You can find Gradle at https://github.com/gradle/gradle/.
#
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
app_path=$0
# Need this for daisy-chained symlinks.
while
APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
[ -h "$app_path" ]
do
ls=$( ls -ld "$app_path" )
link=${ls#*' -> '}
case $link in #(
/*) app_path=$link ;; #(
*) app_path=$APP_HOME$link ;;
esac
done
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
APP_NAME="Gradle"
APP_BASE_NAME=${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 "$*"
} >&2
die () {
echo
echo "$*"
echo
exit 1
} >&2
# 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 ;; #(
MSYS* | 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" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #(
max*)
MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit"
esac
case $MAX_FD in #(
'' | soft) :;; #(
*)
ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD"
esac
fi
# Collect all arguments for the java command, stacking in reverse order:
# * args from the command line
# * the main class name
# * -classpath
# * -D...appname settings
# * --module-path (only if needed)
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
# For Cygwin or MSYS, switch paths to Windows format before running java
if "$cygwin" || "$msys" ; then
APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
JAVACMD=$( cygpath --unix "$JAVACMD" )
# Now convert the arguments - kludge to limit ourselves to /bin/sh
for arg do
if
case $arg in #(
-*) false ;; # don't mess with options #(
/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
[ -e "$t" ] ;; #(
*) false ;;
esac
then
arg=$( cygpath --path --ignore --mixed "$arg" )
fi
# Roll the args list around exactly as many times as the number of
# args, so each arg winds up back in the position where it started, but
# possibly modified.
#
# NB: a `for` loop captures its iteration list before it begins, so
# changing the positional parameters here affects neither the number of
# iterations, nor the values presented in `arg`.
shift # remove old arg
set -- "$@" "$arg" # push replacement arg
done
fi
# Collect all arguments for the java command;
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
# shell script including quotes and variable substitutions, so put them in
# double quotes to make sure that they get re-expanded; and
# * put everything else in single quotes, so that it's not re-expanded.
set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \
-classpath "$CLASSPATH" \
org.gradle.wrapper.GradleWrapperMain \
"$@"
# Use "xargs" to parse quoted args.
#
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
#
# In Bash we could simply go:
#
# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
# set -- "${ARGS[@]}" "$@"
#
# but POSIX shell has neither arrays nor command substitution, so instead we
# post-process each arg (as a line of input to sed) to backslash-escape any
# character that might be a shell metacharacter, then use eval to reverse
# that process (while maintaining the separation between arguments), and wrap
# the whole thing up as a single "set" statement.
#
# This will of course break if any of these variables contains a newline or
# an unmatched quote.
#
eval "set -- $(
printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
xargs -n1 |
sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
tr '\n' ' '
)" '"$@"'
exec "$JAVACMD" "$@"

89
gradlew.bat vendored 100644
View File

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

149
pom.xml
View File

@ -1,149 +0,0 @@
<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>xyz.etztech</groupId>
<artifactId>MinecraftManager</artifactId>
<!-- Version is used in plugin.yml -->
<version>1.6</version>
<packaging>jar</packaging>
<!-- Plugin Information -->
<!-- Name, Description, and URL are used in plugin.yml -->
<name>MinecraftManager</name>
<description>A plugin used alongside the MinecraftManager Django project.</description>
<url>http://docs.etztech.xyz/minecraftmanagerplugin/</url>
<developers>
<developer>
<name>EtzTech</name>
<url>http://www.etztech.xyz</url>
</developer>
</developers>
<properties>
<!-- Author and MainClass are used in plugin.yml -->
<author>EtzTech</author>
<mainClass>xyz.etztech.minecraftmanager.MinecraftManager</mainClass>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
<version>1.16.1-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>xyz.etztech</groupId>
<artifactId>EtzCore</artifactId>
<version>1.0.5</version>
</dependency>
</dependencies>
<repositories>
<repository>
<id>spigot-repo</id>
<url>https://hub.spigotmc.org/nexus/content/groups/public/</url>
</repository>
<repository>
<id>mvn-repo</id>
<url>https://mvnrepository.com/artifact/</url>
</repository>
<repository>
<id>etztech-repo</id>
<url>http://repo.etztech.xyz</url>
</repository>
<repository> <!-- This repo fixes issues with transitive dependencies -->
<id>jcenter</id>
<url>http://jcenter.bintray.com</url>
</repository>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
<build>
<sourceDirectory>src/main/java</sourceDirectory>
<defaultGoal>clean install</defaultGoal>
<resources>
<resource>
<directory>src/main/resources</directory>
<!-- Keeping filtering at true here reduces plugin.yml redundancy! -->
<filtering>true</filtering>
<includes>
<include>plugin.yml</include>
<include>config.yml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<!-- Keep filtering at false for other resources to prevent bad magic -->
<filtering>false</filtering>
<excludes>
<exclude>**/*.java</exclude>
<exclude>plugin.yml</exclude>
</excludes>
</resource>
</resources>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
<plugin>
<!-- Build an executable JAR -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>xyz.etztech.minecraftmanager.MinecraftManager</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.1.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>

5
settings.gradle 100644
View File

@ -0,0 +1,5 @@
/*
* This file was generated by the Gradle 'init' task.
*/
rootProject.name = 'MinecraftManager'

View File

@ -10,7 +10,7 @@ import org.apache.log4j.Logger;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import xyz.etztech.core.web.CoreWeb;
import xyz.etztech.core.web.Http;
import xyz.etztech.minecraftmanager.objects.ModelResponse;
import java.util.Map;
@ -106,7 +106,7 @@ public class MCMUtil {
try {
Map<String, String> filters = MCMAPI.setup();
filters.put("username__iexact", playerName);
ModelResponse response = new ModelResponse(CoreWeb.HTTP(MCMAPI.getModelUrl("player"), CoreWeb.HttpMethod.GET,
ModelResponse response = new ModelResponse(Http.HTTP(MCMAPI.getModelUrl("player"), Http.Method.GET,
filters));
JsonArray players = response.getResults();
if (players.size() == 1) {

View File

@ -60,21 +60,15 @@ public class MinecraftManager extends JavaPlugin implements IMinecraftManager {
// Add Commands
CommandMain cmdMain = new CommandMain(this);
this.getCommand("minecraftmanager").setExecutor(cmdMain);
cmdMain.startThread();
CommandApplication cmdApplication = new CommandApplication(this);
this.getCommand("application").setExecutor(cmdApplication);
CommandApply cmdApply = new CommandApply(this);
this.getCommand("apply").setExecutor(cmdApply);
CommandTicket cmdTicket = new CommandTicket(this);
this.getCommand("ticket").setExecutor(cmdTicket);
CommandWarning cmdWarning = new CommandWarning(this);
this.getCommand("warn").setExecutor(cmdWarning);
new CommandApplication(this);
new CommandApply(this);
new CommandTicket(this);
new CommandWarning(this);
// Rules is optional
if (getConfig().getBoolean("rules.enabled")) {
cmdRules = new CommandRules(this);
this.getCommand("rules").setExecutor(cmdRules);
}
// Add Listeners

View File

@ -1,8 +1,8 @@
package xyz.etztech.minecraftmanager.command;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import net.md_5.bungee.api.chat.ClickEvent;
import net.md_5.bungee.api.chat.ComponentBuilder;
import net.md_5.bungee.api.chat.HoverEvent;
@ -13,9 +13,10 @@ import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import xyz.etztech.core.web.CoreWeb;
import xyz.etztech.core.web.Http;
import xyz.etztech.core.web.ICallback;
import xyz.etztech.minecraftmanager.*;
import xyz.etztech.minecraftmanager.MCMAPI;
import xyz.etztech.minecraftmanager.MinecraftManager;
import xyz.etztech.minecraftmanager.objects.MCMResponse;
import xyz.etztech.minecraftmanager.objects.ModelResponse;
@ -28,6 +29,7 @@ public class CommandApplication implements CommandExecutor {
public CommandApplication(MinecraftManager plugin) {
this.plugin = plugin;
plugin.getCommand("application").setExecutor(this);
}
@Override
@ -99,7 +101,7 @@ public class CommandApplication implements CommandExecutor {
if (sender.hasPermission("minecraftmanager.application.search")) {
Map<String, String> filter = MCMAPI.setup();
filter.put("username__icontains", name);
CoreWeb.asyncGetCallback(plugin, MCMAPI.getModelUrl("application"), filter, new SearchCallback(sender));
Http.asyncGetCallback(plugin, MCMAPI.getModelUrl("application"), filter, new SearchCallback(sender));
} else {
sender.sendMessage(ChatColor.RED + "You do not have permission to search applications.");
}
@ -183,7 +185,7 @@ public class CommandApplication implements CommandExecutor {
} else {
filter.put("username__iexact", key);
}
CoreWeb.asyncGetCallback(plugin, MCMAPI.getModelUrl("application"), filter, new InfoCallback(sender));
Http.asyncGetCallback(plugin, MCMAPI.getModelUrl("application"), filter, new InfoCallback(sender));
} else {
sender.sendMessage(ChatColor.RED + "You do not have permission to search applications.");
}
@ -217,7 +219,7 @@ public class CommandApplication implements CommandExecutor {
data.put("application_id", id);
data.put("action", accepted ? "True" : "False");
data.put("username", username);
CoreWeb.asyncPostCallback(plugin, djangoUrl, data, new ActionCallback(sender));
Http.asyncPostCallback(plugin, djangoUrl, data, new ActionCallback(sender));
} else {
sender.sendMessage(ChatColor.RED + "You must use an application ID to ensure accuracy.");
}
@ -246,7 +248,7 @@ public class CommandApplication implements CommandExecutor {
String djangoUrl = MCMAPI.getDjangoUrl() + "plugin/application_clear/";
Map<String, String> data = MCMAPI.setup();
data.put("application_id", id);
CoreWeb.asyncPostCallback(plugin, djangoUrl, data, new ClearCallback(sender));
Http.asyncPostCallback(plugin, djangoUrl, data, new ClearCallback(sender));
} else {
sender.sendMessage(ChatColor.RED + "You must use an application ID to ensure accuracy.");
}

View File

@ -13,6 +13,7 @@ public class CommandApply implements CommandExecutor {
public CommandApply(MinecraftManager plugin) {
this.plugin = plugin;
plugin.getCommand("apply").setExecutor(this);
}
@Override

View File

@ -8,11 +8,11 @@ import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import xyz.etztech.core.web.CoreWeb;
import xyz.etztech.core.web.Http;
import xyz.etztech.core.web.ICallback;
import xyz.etztech.minecraftmanager.MCMAPI;
import xyz.etztech.minecraftmanager.objects.MCMResponse;
import xyz.etztech.minecraftmanager.MinecraftManager;
import xyz.etztech.minecraftmanager.objects.MCMResponse;
import xyz.etztech.minecraftmanager.objects.MinecraftManagerThread;
import xyz.etztech.minecraftmanager.tasks.ReportRunnable;
@ -30,6 +30,7 @@ public class CommandMain implements CommandExecutor {
public CommandMain(MinecraftManager plugin) {
this.plugin = plugin;
this.cmdThread = new MinecraftManagerThread(plugin);
plugin.getCommand("minecraftmanager").setExecutor(this);
}
@Override
@ -140,10 +141,7 @@ public class CommandMain implements CommandExecutor {
Map<String, String> data = MCMAPI.setup();
data.put("uuid", player.getUniqueId().toString());
CoreWeb.asyncPostCallback(plugin, djangoUrl, data, new RegisterCallback(player));
Http.asyncPostCallback(plugin, djangoUrl, data, new RegisterCallback(player));
}
private void report(CommandSender sender) {

View File

@ -12,6 +12,7 @@ public class CommandRules implements CommandExecutor {
public CommandRules(MinecraftManager plugin) {
this.plugin = plugin;
plugin.getCommand("rules").setExecutor(this);
}

View File

@ -1,8 +1,6 @@
package xyz.etztech.minecraftmanager.command;
import com.google.gson.JsonObject;
import net.md_5.bungee.api.chat.ClickEvent;
import net.md_5.bungee.api.chat.TextComponent;
import org.apache.commons.lang.StringUtils;
import org.bukkit.ChatColor;
import org.bukkit.Location;
@ -11,12 +9,11 @@ import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import xyz.etztech.core.web.CoreWeb;
import xyz.etztech.core.web.Http;
import xyz.etztech.core.web.ICallback;
import xyz.etztech.minecraftmanager.MCMAPI;
import xyz.etztech.minecraftmanager.MCMUtil;
import xyz.etztech.minecraftmanager.objects.MCMResponse;
import xyz.etztech.minecraftmanager.MinecraftManager;
import xyz.etztech.minecraftmanager.objects.MCMResponse;
import xyz.etztech.minecraftmanager.objects.MinecraftManagerThread;
import java.util.Map;
@ -27,6 +24,7 @@ public class CommandTicket implements CommandExecutor {
public CommandTicket(MinecraftManager plugin) {
this.plugin = plugin;
plugin.getCommand("ticket").setExecutor(this);
}
private class TicketCallback implements ICallback {
@ -81,7 +79,7 @@ public class CommandTicket implements CommandExecutor {
data.put("z", z);
data.put("world", world);
CoreWeb.asyncPostCallback(plugin, djangoUrl, data, new TicketCallback(player));
Http.asyncPostCallback(plugin, djangoUrl, data, new TicketCallback(player));
} else {
sender.sendMessage(ChatColor.RED + "You do not have permission to submit a ticket.");
sender.sendMessage(ChatColor.RED + "If you were submitting a ticket about not being able to submit a ticket, that's called irony.");

View File

@ -6,12 +6,12 @@ import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import xyz.etztech.core.web.CoreWeb;
import xyz.etztech.core.web.Http;
import xyz.etztech.core.web.ICallback;
import xyz.etztech.minecraftmanager.MCMAPI;
import xyz.etztech.minecraftmanager.objects.MCMResponse;
import xyz.etztech.minecraftmanager.MCMUtil;
import xyz.etztech.minecraftmanager.MinecraftManager;
import xyz.etztech.minecraftmanager.objects.MCMResponse;
import java.util.Arrays;
import java.util.Map;
@ -22,6 +22,7 @@ public class CommandWarning implements CommandExecutor {
public CommandWarning(MinecraftManager plugin) {
this.plugin = plugin;
plugin.getCommand("warning").setExecutor(this);
}
private class WarningCallback implements ICallback {
@ -65,7 +66,7 @@ public class CommandWarning implements CommandExecutor {
data.put("severity", getSeverity(args[1]));
data.put("message", StringUtils.join(Arrays.copyOfRange(args, 2, args.length), " "));
CoreWeb.asyncPostCallback(plugin, djangoUrl, data, new WarningCallback(staff));
Http.asyncPostCallback(plugin, djangoUrl, data, new WarningCallback(staff));
} else {
sender.sendMessage(ChatColor.RED + "You do not have permission to issue a warning.");
}

View File

@ -10,9 +10,11 @@ import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.AsyncPlayerChatEvent;
import xyz.etztech.core.web.CoreWeb;
import xyz.etztech.core.web.Http;
import xyz.etztech.core.web.ICallback;
import xyz.etztech.minecraftmanager.*;
import xyz.etztech.minecraftmanager.MCMAPI;
import xyz.etztech.minecraftmanager.MCMUtil;
import xyz.etztech.minecraftmanager.MinecraftManager;
import xyz.etztech.minecraftmanager.objects.Application;
import xyz.etztech.minecraftmanager.objects.MCMResponse;
import xyz.etztech.minecraftmanager.objects.MinecraftManagerThread;
@ -121,7 +123,7 @@ public class AsyncPlayerChatListener implements Listener {
Map<String, String> data = MCMAPI.setup();
data.putAll(app.getForm());
CoreWeb.asyncPostCallback(plugin, djangoUrl, data, new ApplicationCallback(sender));
Http.asyncPostCallback(plugin, djangoUrl, data, new ApplicationCallback(sender));
} else {
sender.sendMessage(ChatColor.GREEN + nextQuestion.getQuestion());
}

View File

@ -1,15 +1,14 @@
package xyz.etztech.minecraftmanager.listeners;
import org.apache.commons.lang.StringUtils;
import net.md_5.bungee.api.chat.TextComponent;
import org.apache.commons.lang.StringUtils;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
import xyz.etztech.core.web.CoreWeb;
import xyz.etztech.core.web.Http;
import xyz.etztech.minecraftmanager.MCMAPI;
import xyz.etztech.minecraftmanager.MCMUtil;
import xyz.etztech.minecraftmanager.MinecraftManager;
@ -69,7 +68,7 @@ public class CommandPreprocessListener implements Listener {
data.put("staff", sender.getUniqueId().toString());
data.put("severity", "H");
data.put("message", message);
CoreWeb.asyncPost(plugin, djangoUrl, data);
Http.asyncPost(plugin, djangoUrl, data);
}
}
}

View File

@ -8,9 +8,11 @@ import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerLoginEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import xyz.etztech.core.web.CoreWeb;
import xyz.etztech.core.web.Http;
import xyz.etztech.core.web.ICallback;
import xyz.etztech.minecraftmanager.*;
import xyz.etztech.minecraftmanager.MCMAPI;
import xyz.etztech.minecraftmanager.MCMUtil;
import xyz.etztech.minecraftmanager.MinecraftManager;
import xyz.etztech.minecraftmanager.objects.MinecraftManagerThread;
import xyz.etztech.minecraftmanager.objects.ModelResponse;
@ -32,7 +34,7 @@ public class SessionListener implements Listener {
data.put("username", player.getName());
data.put("uuid", player.getUniqueId().toString());
data.put("ip", event.getAddress().getHostAddress());
CoreWeb.asyncPost(plugin, djangoUrl, data);
Http.asyncPost(plugin, djangoUrl, data);
}
@EventHandler
@ -44,7 +46,7 @@ public class SessionListener implements Listener {
if (player.hasPermission("minecraftmanager.guest")) {
Map<String, String> filters = MCMAPI.setup();
filters.put("username__iexact", player.getName());
CoreWeb.asyncGetCallback(plugin, MCMAPI.getModelUrl("application"), filters, new JoinCallback(player.getName()));
Http.asyncGetCallback(plugin, MCMAPI.getModelUrl("application"), filters, new JoinCallback(player.getName()));
}
}

View File

@ -96,7 +96,7 @@ public class Application {
}
public String getFormatted() {
StringBuffer msg = new StringBuffer();
StringBuilder msg = new StringBuilder();
msg.append("Username: " + getUsername() + "\n");
msg.append("Age: " + getAge() + "\n");
msg.append("Player Type: " + getPlayerType() + "\n");

View File

@ -3,13 +3,9 @@ package xyz.etztech.minecraftmanager.objects;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import org.bukkit.ChatColor;
import xyz.etztech.core.web.CoreResponse;
import xyz.etztech.core.web.Response;
import java.util.logging.Logger;
public class MCMResponse extends CoreResponse {
public class MCMResponse extends Response {
private JsonElement extra;
public MCMResponse(JsonArray httpResponse) {

View File

@ -66,12 +66,6 @@ public class MinecraftManagerThread extends Thread {
case "deny":
action(args.get(0), false);
break;
case "global":
globalChat(args);
break;
case "staff":
staffChat(args);
break;
case "demote":
demote(args.get(0));
break;
@ -155,31 +149,6 @@ public class MinecraftManagerThread extends Thread {
});
}
private void globalChat(ArrayList<String> args) {
String name = args.get(0);
args.remove(0);
String tag = plugin.getConfig().getBoolean("tag", true) ? "[MCM] " : "";
ComponentBuilder builder = new ComponentBuilder(tag + name + " > ")
.append(StringUtils.join(args, " "));
TextComponent message = new TextComponent(builder.create());
message.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder("MCM Global Chat").create()));
MCMUtil.globalMessage(message);
}
private void staffChat(ArrayList<String> args) {
String name = args.get(0);
args.remove(0);
String tag = plugin.getConfig().getBoolean("tag", true) ? "[MCM] " : "";
ComponentBuilder builder = new ComponentBuilder(tag + name + " > ")
.color(ChatColor.GOLD)
.append(StringUtils.join(args, " "), ComponentBuilder.FormatRetention.NONE)
.color(ChatColor.GREEN);
TextComponent message = new TextComponent(builder.create());
message.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder("MCM Staff Chat").create()));
MCMUtil.staffMessage(message);
}
private void demote(String username) {
String engine = MinecraftManager.config.getString("permissions.engine");
String promote = MinecraftManager.config.getString("permissions.promote");

View File

@ -8,7 +8,7 @@ public enum Question {
TWO("How do you typically enjoy playing Minecraft?", "Your answer must be under 300 characters long."),
THREE1("Have you ever been banned? Please answer just 'yes' or 'no'.", "Your answer must be just 'yes' or 'no'."),
THREE2("Oof. That's okay, it's happened to plenty of people. Do you mind letting us know why?", "Your answer must be under 300 characters long."),
FOUR("How did you find out about our server?", "Your answer must be under 50 characters long."),
FOUR("Who referred you to the server?", "Your answer must be under 50 characters long."),
FIVE("Last question! Have you read the rules thoroughly?", "Your answer must be under 10 characters long."),
COMPLETE("All done! Staff should be reviewing your application any second now!", "");
@ -32,50 +32,53 @@ public enum Question {
}
public static Question last(Question question) {
if (question == TWO) {
return ONE;
} else if (question == THREE1) {
return TWO;
} else if (question == THREE2) {
return THREE1;
} else if (question == FOUR) {
return THREE2;
} else {
return FOUR;
switch (question) {
case TWO:
return ONE;
case THREE1:
return TWO;
case THREE2:
return THREE1;
case FOUR:
return THREE2;
default:
return FOUR;
}
}
public static Question next(Question question, String answer) {
if (question == ONE) {
return TWO;
} else if (question == TWO) {
return THREE1;
} else if (question == THREE1) {
return answer.equalsIgnoreCase("yes") ? THREE2 : FOUR;
} else if (question == THREE2) {
return FOUR;
} else if (question == FOUR) {
return FIVE;
} else {
return COMPLETE;
switch (question) {
case ONE:
return TWO;
case TWO:
return THREE1;
case THREE1:
return answer.equalsIgnoreCase("yes") ? THREE2 : FOUR;
case THREE2:
return FOUR;
case FOUR:
return FIVE;
default:
return COMPLETE;
}
}
public static boolean validate(Question question, String answer) {
if (question == ONE) {
return StringUtils.isNumeric(answer);
} else if (question == TWO) {
return answer.length() <= 300;
} else if (question == THREE1) {
return answer.equalsIgnoreCase("yes") || answer.equalsIgnoreCase("no");
} else if (question == THREE2) {
return answer.length() <= 300;
} else if (question == FOUR) {
return answer.length() <= 50;
} else if (question == FIVE) {
return answer.length() <= 10;
switch (question) {
case ONE:
return StringUtils.isNumeric(answer);
case TWO:
case THREE2:
return answer.length() <= 300;
case THREE1:
return answer.equalsIgnoreCase("yes") || answer.equalsIgnoreCase("no");
case FOUR:
return answer.length() <= 50;
case FIVE:
return answer.length() <= 10;
default:
return false;
}
return false;
}

View File

@ -1,205 +0,0 @@
package xyz.etztech.minecraftmanager.test;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import org.apache.commons.lang.StringUtils;
import xyz.etztech.core.web.CoreWeb;
import xyz.etztech.core.web.ICallback;
import xyz.etztech.minecraftmanager.objects.Application;
import xyz.etztech.minecraftmanager.MCMAPI;
import xyz.etztech.minecraftmanager.objects.MCMResponse;
import xyz.etztech.minecraftmanager.objects.ModelResponse;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Test {
public static void main(String[] args) throws Exception {
String testUrl = "http://127.0.0.1:8000/api/";
String testApi = "Testing1";
try {
testUrl = args[0];
testApi = args[1];
} catch (Exception ex) {
System.out.println("Using default test URL and password");
}
System.out.println("URL: " + testUrl);
System.out.println("Password: " + testApi);
MCMAPI.test(testUrl, testApi);
int option = 0;
while (option != 99) {
System.out.println("===== Test Util =====");
System.out.println("1. Test Model Query - Search for applications with a username containing the number 1.");
System.out.println("2. Test Application Posting - Post two applications");
System.out.println("3. Test Application Action - Accept Testing1 application");
System.out.println("4. Test Application Action - Deny Testing2 application");
System.out.println("5. Test Application Clear - Clear Testing2 application");
System.out.println("6. Test Login - Spoof a login of user Etzelia with IP 127.0.0.1");
System.out.println("7. Test Ticket - Send a test ticket");
System.out.println("8. Test Warning - Send a test warning, medium importance, issued to Etzelia");
System.out.println("99. Exit");
System.out.print("Select Option: ");
Scanner scanner = new Scanner(System.in);
String input = scanner.next();
int choice = StringUtils.isNumeric(input) ? Integer.parseInt(input) : 0;
switch (choice) {
case 1:
option = 1;
break;
case 2:
option = 2;
break;
case 3:
option = 3;
break;
case 4:
option = 4;
break;
case 5:
option = 5;
break;
case 6:
option = 6;
break;
case 7:
option = 7;
break;
case 8:
option = 8;
break;
case 99:
option = 99;
break;
default:
break;
}
Map<String, String> data = MCMAPI.setup();
if (option == 1) {
// Query Model
data.put("username__icontains", "1");
ModelResponse response = new ModelResponse(CoreWeb.HTTP(MCMAPI.getModelUrl("application"),
CoreWeb.HttpMethod.GET, data));
JsonArray results = response.getResults();
System.out.println(results.size());
for (JsonElement jsonElement : results) {
System.out.println("Raw JSON: " + jsonElement.toString());
System.out.println("Username: " + jsonElement.getAsJsonObject().get("username").getAsString());
System.out.println("Ever Banned: " + jsonElement.getAsJsonObject().get("ever_banned").getAsBoolean());
}
} else if (option == 2) {
// Post two applications
Application app1 = new Application();
app1.setUsername("Testing1");
app1.setAge("20");
app1.setPlayerType("First test application.");
app1.setEverBanned("no");
app1.setEverBannedExplanation("");
app1.setReference("reddit");
app1.setReadRules("24karrot");
String djangoUrl = MCMAPI.getDjangoUrl() + "plugin/application/";
data.putAll(app1.getForm());
MCMResponse response1 = new MCMResponse(CoreWeb.HTTP(djangoUrl, CoreWeb.HttpMethod.POST,
data));
System.out.println("===== App 1 =====");
System.out.println("Status: " + response1.getStatus());
System.out.println("Message: " + response1.getMessage());
Application app2 = new Application();
app2.setUsername("Testing2");
app2.setAge("20");
app2.setPlayerType("Second test application.");
app2.setEverBanned("yes");
app2.setEverBannedExplanation("Griefing");
app2.setReference("planet minecraft");
app2.setReadRules("24karrot");
data = MCMAPI.setup();
data.putAll(app2.getForm());
MCMResponse response2 = new MCMResponse(CoreWeb.HTTP(djangoUrl, CoreWeb.HttpMethod.POST,
data));
System.out.println("===== App 2 =====");
System.out.println("Status: " + response2.getStatus());
System.out.println("Message: " + response2.getMessage());
} else if (option == 3 || option == 4) {
boolean accept = option == 3;
String username = option == 3 ? "Testing1" : "Testing2";
data.put("username__exact", username);
ModelResponse response = new ModelResponse(CoreWeb.HTTP(MCMAPI.getModelUrl("application"),
CoreWeb.HttpMethod.GET, data));
JsonArray array = response.getResults();
if (array.size() != 1) {
System.out.println("Couldn't find the application for " + username + ". Does it exist?");
} else {
String id = array.get(0).getAsJsonObject().get("id").getAsString();
String djangoUrl = MCMAPI.getDjangoUrl() + "plugin/application_action/";
data.put("application_id", id);
data.put("action", accept ? "True" : "False");
data.put("username", "Plugin Test");
MCMResponse mcmResponse = new MCMResponse(CoreWeb.HTTP(djangoUrl, CoreWeb.HttpMethod.POST,
data));
System.out.println("===== " + username + " =====");
System.out.println("Status: " + mcmResponse.getStatus());
System.out.println("Message: " + mcmResponse.getMessage());
}
} else if (option == 5) {
data.put("username__exact", "Testing2");
ModelResponse response = new ModelResponse(CoreWeb.HTTP(MCMAPI.getModelUrl("application"),
CoreWeb.HttpMethod.GET, data));
JsonArray array = response.getResults();
if (array.size() != 1) {
System.out.println("Couldn't find the application for Testing2. Does it exist?");
} else {
String id = array.get(0).getAsJsonObject().get("id").getAsString();
String djangoUrl = MCMAPI.getDjangoUrl() + "plugin/application_clear/";
data.put("application_id", id);
MCMResponse mcmResponse = new MCMResponse(CoreWeb.HTTP(djangoUrl, CoreWeb.HttpMethod.POST,
data));
System.out.println("===== Testing2 =====");
System.out.println("Status: " + mcmResponse.getStatus());
System.out.println("Message: " + mcmResponse.getMessage());
}
} else if (option == 6) {
String djangoUrl = MCMAPI.getDjangoUrl() + "plugin/login/";
data.put("uuid", "bf0446a8-9695-4c41-aa4c-7ff45bfd1171");
data.put("username", "Etzelia");
data.put("ip", "127.0.0.1");
MCMResponse response = new MCMResponse(CoreWeb.HTTP(djangoUrl, CoreWeb.HttpMethod.POST,
data));
System.out.println("===== Login =====");
System.out.println("Status: " + response.getStatus());
System.out.println("Message: " + response.getMessage());
} else if (option == 7) {
String djangoUrl = MCMAPI.getDjangoUrl() + "plugin/ticket/";
data.put("uuid", "bf0446a8-9695-4c41-aa4c-7ff45bfd1171");
data.put("message", "Test Ticket");
data.put("x", "1");
data.put("y", "2");
data.put("z", "3");
data.put("world", "O");
MCMResponse response = new MCMResponse(CoreWeb.HTTP(djangoUrl, CoreWeb.HttpMethod.POST,
data));
System.out.println("===== Ticket =====");
System.out.println("Status: " + response.getStatus());
System.out.println("Message: " + response.getMessage());
} else if (option == 8) {
String djangoUrl = MCMAPI.getDjangoUrl() + "plugin/warning/";
data.put("player", "bf0446a8-9695-4c41-aa4c-7ff45bfd1171");
data.put("staff", "bf0446a8-9695-4c41-aa4c-7ff45bfd1171");
data.put("severity", "H");
data.put("message", "Test Warning");
MCMResponse response = new MCMResponse(CoreWeb.HTTP(djangoUrl, CoreWeb.HttpMethod.POST,
data));
System.out.println("===== Warning =====");
System.out.println("Status: " + response.getStatus());
System.out.println("Message: " + response.getMessage());
}
}
}
}

View File

@ -8,9 +8,6 @@ staff-chat:
prefix:
- "#"
# If true, chat is prefixed with an [MCM] tag. When false, the tag is moved to a hover event.
tag: true
# Override rules
# A '*' before a rule will show as a sub-rule
rules:
@ -32,7 +29,7 @@ rules:
- "Every person who has their application denied will be auto-muted in game. Mute evasion will get you banned. Repeated mutes may lead to a ban."
application:
validate: true
answer: "24karrot"
answer: "penguin"
# Ban options
# Bans can auto-generate a warning (High severity)
@ -49,7 +46,7 @@ ban:
permissions:
# Can be PermissionsEX or LuckPerms
engine: "PermissionsEX"
engine: "LuckPerms"
# The name of the group to promote to if accepted
promote: "member"