My old friend

Signed-off-by: jolheiser <john.olheiser@gmail.com>
pull/4/head
jolheiser 2022-02-07 22:33:59 -06:00
parent 49577ecd85
commit fa883570f0
Signed by: jolheiser
GPG Key ID: B853ADA5DA7BBF7A
32 changed files with 194 additions and 784 deletions

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)

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.

18
pom.xml
View File

@ -3,14 +3,14 @@
<groupId>xyz.etztech</groupId>
<artifactId>MinecraftManager</artifactId>
<!-- Version is used in plugin.yml -->
<version>1.6</version>
<version>1.7</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>
<url>https://git.jojodev.com/Minecraft/minecraftmanagerplugin</url>
<developers>
@ -46,8 +46,8 @@
</dependency>
<dependency>
<groupId>xyz.etztech</groupId>
<artifactId>EtzCore</artifactId>
<version>1.0.5</version>
<artifactId>plugin-api</artifactId>
<version>1.0.7</version>
</dependency>
@ -59,16 +59,12 @@
<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>
<id>jojodev</id>
<url>https://mvn.jojodev.com/releases</url>
</repository>
<repository> <!-- This repo fixes issues with transitive dependencies -->
<id>jcenter</id>
<url>http://jcenter.bintray.com</url>
<url>https://jcenter.bintray.com</url>
</repository>
<repository>
<id>jitpack.io</id>

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"