src
This commit is contained in:
parent
babceff944
commit
8e8870043d
1
.idea/.name
Normal file
1
.idea/.name
Normal file
@ -0,0 +1 @@
|
||||
Zoot-1.0-SNAPSHOT
|
17
.idea/artifacts/zoot_jar.xml
Normal file
17
.idea/artifacts/zoot_jar.xml
Normal file
@ -0,0 +1,17 @@
|
||||
<component name="ArtifactManager">
|
||||
<artifact type="jar" name="zoot:jar">
|
||||
<output-path>$PROJECT_DIR$/out/artifacts/zoot_jar</output-path>
|
||||
<root id="archive" name="zoot.jar">
|
||||
<element id="module-output" name="zoot" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/libs/honcho-1.0-SNAPSHOT.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/apache/commons/commons-pool2/2.4.2/commons-pool2-2.4.2.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/mongodb/mongo-java-driver/3.8.2/mongo-java-driver-3.8.2.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/lombok-1.18.6.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/lib/VaultAPI-1.7.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/libs/PermissionsEx-1.23.4.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/com/google/code/gson/gson/2.8.5/gson-2.8.5.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/redis/clients/jedis/2.9.0/jedis-2.9.0.jar" path-in-jar="/" />
|
||||
<element id="extracted-dir" path="$PROJECT_DIR$/libs/phoenix-lang-1.0-SNAPSHOT.jar" path-in-jar="/" />
|
||||
</root>
|
||||
</artifact>
|
||||
</component>
|
36
.idea/compiler.xml
Normal file
36
.idea/compiler.xml
Normal file
@ -0,0 +1,36 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="CompilerConfiguration">
|
||||
<annotationProcessing>
|
||||
<profile default="true" name="Default" enabled="true" />
|
||||
<profile name="Maven default annotation processors profile" enabled="true">
|
||||
<sourceOutputDir name="target/generated-sources/annotations" />
|
||||
<sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
|
||||
<outputRelativeToContentRoot value="true" />
|
||||
<module name="Proton" />
|
||||
<module name="proton" />
|
||||
<module name="zoot" />
|
||||
</profile>
|
||||
</annotationProcessing>
|
||||
<bytecodeTargetLevel>
|
||||
<module name="api" target="1.8" />
|
||||
<module name="bootstrap" target="1.8" />
|
||||
<module name="chat" target="1.8" />
|
||||
<module name="game" target="1.8" />
|
||||
<module name="messaging" target="1.8" />
|
||||
<module name="Proton" target="1.8" />
|
||||
<module name="proton" target="1.8" />
|
||||
<module name="proxy" target="1.8" />
|
||||
<module name="punishments" target="1.8" />
|
||||
<module name="ranks" target="1.8" />
|
||||
<module name="zoot" target="1.8" />
|
||||
<module name="Zoot-1.0-SNAPSHOT" target="1.8" />
|
||||
</bytecodeTargetLevel>
|
||||
</component>
|
||||
<component name="JavacSettings">
|
||||
<option name="ADDITIONAL_OPTIONS_OVERRIDE">
|
||||
<module name="Zoot-1.0-SNAPSHOT" options="-parameters" />
|
||||
<module name="zoot" options="-parameters" />
|
||||
</option>
|
||||
</component>
|
||||
</project>
|
35
.idea/dictionaries/skruf.xml
Normal file
35
.idea/dictionaries/skruf.xml
Normal file
@ -0,0 +1,35 @@
|
||||
<component name="ProjectDictionaryState">
|
||||
<dictionary name="skruf">
|
||||
<words>
|
||||
<w>addperm</w>
|
||||
<w>addpermission</w>
|
||||
<w>clearinv</w>
|
||||
<w>deletepermission</w>
|
||||
<w>delperm</w>
|
||||
<w>deserialized</w>
|
||||
<w>gamemode</w>
|
||||
<w>gson</w>
|
||||
<w>hideplayer</w>
|
||||
<w>listpermissions</w>
|
||||
<w>listperms</w>
|
||||
<w>mojang</w>
|
||||
<w>setcolor</w>
|
||||
<w>setmaxslots</w>
|
||||
<w>setprefix</w>
|
||||
<w>setslots</w>
|
||||
<w>setspawn</w>
|
||||
<w>setsuffix</w>
|
||||
<w>setweight</w>
|
||||
<w>setworldspawn</w>
|
||||
<w>showplayer</w>
|
||||
<w>teleported</w>
|
||||
<w>unblacklisted</w>
|
||||
<w>uninherit</w>
|
||||
<w>uninherited</w>
|
||||
<w>unmuted</w>
|
||||
<w>uuids</w>
|
||||
<w>worldspawn</w>
|
||||
<w>zoot</w>
|
||||
</words>
|
||||
</dictionary>
|
||||
</component>
|
13
.idea/encodings.xml
Normal file
13
.idea/encodings.xml
Normal file
@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="Encoding">
|
||||
<file url="file://$PROJECT_DIR$" charset="UTF-8" />
|
||||
<file url="file://$PROJECT_DIR$/api" charset="UTF-8" />
|
||||
<file url="file://$PROJECT_DIR$/bootstrap" charset="UTF-8" />
|
||||
<file url="file://$PROJECT_DIR$/chat" charset="UTF-8" />
|
||||
<file url="file://$PROJECT_DIR$/game" charset="UTF-8" />
|
||||
<file url="file://$PROJECT_DIR$/messaging" charset="UTF-8" />
|
||||
<file url="file://$PROJECT_DIR$/punishments" charset="UTF-8" />
|
||||
<file url="file://$PROJECT_DIR$/ranks" charset="UTF-8" />
|
||||
</component>
|
||||
</project>
|
13
.idea/libraries/Maven__com_google_code_gson_gson_2_8_5.xml
Normal file
13
.idea/libraries/Maven__com_google_code_gson_gson_2_8_5.xml
Normal file
@ -0,0 +1,13 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Maven: com.google.code.gson:gson:2.8.5">
|
||||
<CLASSES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/com/google/code/gson/gson/2.8.5/gson-2.8.5.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/com/google/code/gson/gson/2.8.5/gson-2.8.5-javadoc.jar!/" />
|
||||
</JAVADOC>
|
||||
<SOURCES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/com/google/code/gson/gson/2.8.5/gson-2.8.5-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
@ -0,0 +1,13 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Maven: org.apache.commons:commons-pool2:2.4.2">
|
||||
<CLASSES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/org/apache/commons/commons-pool2/2.4.2/commons-pool2-2.4.2.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/org/apache/commons/commons-pool2/2.4.2/commons-pool2-2.4.2-javadoc.jar!/" />
|
||||
</JAVADOC>
|
||||
<SOURCES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/org/apache/commons/commons-pool2/2.4.2/commons-pool2-2.4.2-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
@ -0,0 +1,13 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Maven: org.mongodb:mongo-java-driver:3.8.2">
|
||||
<CLASSES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/org/mongodb/mongo-java-driver/3.8.2/mongo-java-driver-3.8.2.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/org/mongodb/mongo-java-driver/3.8.2/mongo-java-driver-3.8.2-javadoc.jar!/" />
|
||||
</JAVADOC>
|
||||
<SOURCES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/org/mongodb/mongo-java-driver/3.8.2/mongo-java-driver-3.8.2-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
13
.idea/libraries/Maven__redis_clients_jedis_2_9_0.xml
Normal file
13
.idea/libraries/Maven__redis_clients_jedis_2_9_0.xml
Normal file
@ -0,0 +1,13 @@
|
||||
<component name="libraryTable">
|
||||
<library name="Maven: redis.clients:jedis:2.9.0">
|
||||
<CLASSES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/redis/clients/jedis/2.9.0/jedis-2.9.0.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/redis/clients/jedis/2.9.0/jedis-2.9.0-javadoc.jar!/" />
|
||||
</JAVADOC>
|
||||
<SOURCES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/redis/clients/jedis/2.9.0/jedis-2.9.0-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
</component>
|
18
.idea/misc.xml
Normal file
18
.idea/misc.xml
Normal file
@ -0,0 +1,18 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="MavenProjectsManager">
|
||||
<option name="originalFiles">
|
||||
<list>
|
||||
<option value="$PROJECT_DIR$/pom.xml" />
|
||||
</list>
|
||||
</option>
|
||||
<option name="ignoredFiles">
|
||||
<set>
|
||||
<option value="$PROJECT_DIR$/proxy/pom.xml" />
|
||||
</set>
|
||||
</option>
|
||||
</component>
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="false" project-jdk-name="1.8" project-jdk-type="JavaSDK">
|
||||
<output url="file://$PROJECT_DIR$/out" />
|
||||
</component>
|
||||
</project>
|
8
.idea/modules.xml
Normal file
8
.idea/modules.xml
Normal file
@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectModuleManager">
|
||||
<modules>
|
||||
<module fileurl="file://$PROJECT_DIR$/zoot.iml" filepath="$PROJECT_DIR$/zoot.iml" />
|
||||
</modules>
|
||||
</component>
|
||||
</project>
|
124
.idea/uiDesigner.xml
Normal file
124
.idea/uiDesigner.xml
Normal file
@ -0,0 +1,124 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="Palette2">
|
||||
<group name="Swing">
|
||||
<item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.png" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||
<default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" />
|
||||
</item>
|
||||
<item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.png" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||
<default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" />
|
||||
</item>
|
||||
<item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.png" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" />
|
||||
</item>
|
||||
<item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.png" removable="false" auto-create-binding="false" can-attach-label="true">
|
||||
<default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" />
|
||||
</item>
|
||||
<item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.png" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" />
|
||||
<initial-values>
|
||||
<property name="text" value="Button" />
|
||||
</initial-values>
|
||||
</item>
|
||||
<item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.png" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
|
||||
<initial-values>
|
||||
<property name="text" value="RadioButton" />
|
||||
</initial-values>
|
||||
</item>
|
||||
<item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.png" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
|
||||
<initial-values>
|
||||
<property name="text" value="CheckBox" />
|
||||
</initial-values>
|
||||
</item>
|
||||
<item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.png" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||
<default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" />
|
||||
<initial-values>
|
||||
<property name="text" value="Label" />
|
||||
</initial-values>
|
||||
</item>
|
||||
<item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.png" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
|
||||
<preferred-size width="150" height="-1" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.png" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
|
||||
<preferred-size width="150" height="-1" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.png" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
|
||||
<preferred-size width="150" height="-1" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.png" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
|
||||
<preferred-size width="150" height="50" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.png" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
|
||||
<preferred-size width="150" height="50" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.png" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
|
||||
<preferred-size width="150" height="50" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.png" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||
<default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" />
|
||||
</item>
|
||||
<item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.png" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
|
||||
<preferred-size width="150" height="50" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.png" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3">
|
||||
<preferred-size width="150" height="50" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.png" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
|
||||
<preferred-size width="150" height="50" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.png" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
|
||||
<preferred-size width="200" height="200" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.png" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
|
||||
<preferred-size width="200" height="200" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.png" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
|
||||
</item>
|
||||
<item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.png" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
|
||||
</item>
|
||||
<item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.png" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" />
|
||||
</item>
|
||||
<item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.png" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" />
|
||||
</item>
|
||||
<item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.png" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1">
|
||||
<preferred-size width="-1" height="20" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.png" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||
<default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" />
|
||||
</item>
|
||||
<item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.png" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" />
|
||||
</item>
|
||||
</group>
|
||||
</component>
|
||||
</project>
|
1050
.idea/workspace.xml
Normal file
1050
.idea/workspace.xml
Normal file
File diff suppressed because it is too large
Load Diff
32
README.md
32
README.md
@ -1 +1,31 @@
|
||||
# zoot
|
||||
zoot.admin.broadcast
|
||||
zoot.staff.clearinv
|
||||
zoot.staff.gamemode
|
||||
zoot.admin.heal
|
||||
zoot.admin.hideplayer
|
||||
zoot.staff.more
|
||||
zoot.staff.rename
|
||||
zoot.staff.setslots
|
||||
zoot.staff.setspawn
|
||||
zoot.admin.showplayer
|
||||
zoot.staff.spawn
|
||||
zoot.staff.alts
|
||||
zoot.staff.ban
|
||||
zoot.staff.check
|
||||
zoot.staff.kick
|
||||
zoot.staff.mute
|
||||
zoot.staff.unban
|
||||
zoot.staff.unmute
|
||||
zoot.staff.warn
|
||||
zoot.staff.grant
|
||||
zoot.staff.grant
|
||||
zoot.staff
|
||||
zoot.staff
|
||||
zoot.staff.mutechat
|
||||
zoot.admin.rank
|
||||
zoot.admin.rank
|
||||
zoot.admin.rank
|
||||
zoot.admin.rank
|
||||
zoot.admin.rank
|
||||
zoot.admin.rank
|
||||
zoot.admin.rank
|
71
Zoot-1.0-SNAPSHOT.iml
Normal file
71
Zoot-1.0-SNAPSHOT.iml
Normal file
@ -0,0 +1,71 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
|
||||
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
|
||||
<output url="file://$MODULE_DIR$/target/classes" />
|
||||
<output-test url="file://$MODULE_DIR$/target/test-classes" />
|
||||
<content url="file://$MODULE_DIR$">
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
|
||||
<excludeFolder url="file://$MODULE_DIR$/target" />
|
||||
</content>
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
<orderEntry type="module-library">
|
||||
<library name="Maven: org.spigotmc:spigot-api:1.8.8-R0.1-SNAPSHOT">
|
||||
<CLASSES>
|
||||
<root url="jar://$MODULE_DIR$/libs/ragespigot-1.8.8-R0.1-SNAPSHOT.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES />
|
||||
</library>
|
||||
</orderEntry>
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: org.projectlombok:lombok:1.18.4" level="project" />
|
||||
<orderEntry type="library" name="Maven: com.google.code.gson:gson:2.8.5" level="project" />
|
||||
<orderEntry type="library" name="Maven: org.mongodb:mongo-java-driver:3.8.2" level="project" />
|
||||
<orderEntry type="module-library">
|
||||
<library name="Maven: com.qrakn:honcho:1.0-SNAPSHOT">
|
||||
<CLASSES>
|
||||
<root url="jar://$MODULE_DIR$/libs/honcho-1.0-SNAPSHOT.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES />
|
||||
</library>
|
||||
</orderEntry>
|
||||
<orderEntry type="module-library">
|
||||
<library name="Maven: com.qrakn:phoenix-lang:1.0-SNAPSHOT">
|
||||
<CLASSES>
|
||||
<root url="jar://$MODULE_DIR$/libs/phoenix-lang-1.0-SNAPSHOT.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES />
|
||||
</library>
|
||||
</orderEntry>
|
||||
<orderEntry type="module-library">
|
||||
<library name="Maven: com.minexd:pidgin:1.0-SNAPSHOT">
|
||||
<CLASSES>
|
||||
<root url="jar://$MODULE_DIR$/libs/pidgin-1.0-SNAPSHOT.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES />
|
||||
</library>
|
||||
</orderEntry>
|
||||
<orderEntry type="module-library">
|
||||
<library name="Maven: ru.tehkode:PermissionsEx:1.0-SNAPSHOT">
|
||||
<CLASSES>
|
||||
<root url="jar://$MODULE_DIR$/libs/PermissionsEx-1.23.4.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC />
|
||||
<SOURCES />
|
||||
</library>
|
||||
</orderEntry>
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: net.milkbowl.vault:VaultAPI:1.7" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: org.bukkit:bukkit:1.13.1-R0.1-SNAPSHOT" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: commons-lang:commons-lang:2.6" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: com.googlecode.json-simple:json-simple:1.1.1" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: junit:junit:4.10" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: org.hamcrest:hamcrest-core:1.1" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: com.google.guava:guava:21.0" level="project" />
|
||||
<orderEntry type="library" scope="PROVIDED" name="Maven: org.yaml:snakeyaml:1.21" level="project" />
|
||||
</component>
|
||||
</module>
|
94
dependency-reduced-pom.xml
Normal file
94
dependency-reduced-pom.xml
Normal file
@ -0,0 +1,94 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>com.minexd</groupId>
|
||||
<artifactId>zoot</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
<build>
|
||||
<resources>
|
||||
<resource>
|
||||
<filtering>true</filtering>
|
||||
<directory>src/main/resources</directory>
|
||||
<includes>
|
||||
<include>plugin.yml</include>
|
||||
</includes>
|
||||
</resource>
|
||||
<resource>
|
||||
<directory>src/main/resources</directory>
|
||||
<excludes>
|
||||
<exclude>plugin.yml</exclude>
|
||||
</excludes>
|
||||
</resource>
|
||||
</resources>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<configuration>
|
||||
<source>1.8</source>
|
||||
<target>1.8</target>
|
||||
<compilerArgument>-parameters</compilerArgument>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<artifactId>maven-shade-plugin</artifactId>
|
||||
<version>2.4.3</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<phase>package</phase>
|
||||
<goals>
|
||||
<goal>shade</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.spigotmc</groupId>
|
||||
<artifactId>spigot-api</artifactId>
|
||||
<version>1.8.8-R0.1-SNAPSHOT</version>
|
||||
<scope>system</scope>
|
||||
<systemPath>${project.basedir}/libs/solexspigot-1.8.8-R0.1-SNAPSHOT.jar</systemPath>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
<version>LATEST</version>
|
||||
<scope>system</scope>
|
||||
<systemPath>${project.basedir}/lib/lombok-1.18.6.jar</systemPath>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.qrakn</groupId>
|
||||
<artifactId>honcho</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
<scope>system</scope>
|
||||
<systemPath>${project.basedir}/libs/honcho-1.0-SNAPSHOT.jar</systemPath>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.qrakn</groupId>
|
||||
<artifactId>phoenix</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
<scope>system</scope>
|
||||
<systemPath>${project.basedir}/libs/phoenix-lang-1.0-SNAPSHOT.jar</systemPath>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>ru.tehkode</groupId>
|
||||
<artifactId>PermissionsEx</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
<scope>system</scope>
|
||||
<systemPath>${project.basedir}/libs/PermissionsEx-1.23.4.jar</systemPath>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>net.milkbowl.vault</groupId>
|
||||
<artifactId>VaultAPI</artifactId>
|
||||
<version>1.7</version>
|
||||
<scope>system</scope>
|
||||
<systemPath>${project.basedir}/lib/VaultAPI-1.7.jar</systemPath>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
<properties>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
</properties>
|
||||
</project>
|
||||
|
BIN
lib/PermissionsEx-1.23.4.jar
Normal file
BIN
lib/PermissionsEx-1.23.4.jar
Normal file
Binary file not shown.
BIN
lib/VaultAPI-1.7.jar
Normal file
BIN
lib/VaultAPI-1.7.jar
Normal file
Binary file not shown.
BIN
lib/honcho-1.0-SNAPSHOT.jar
Normal file
BIN
lib/honcho-1.0-SNAPSHOT.jar
Normal file
Binary file not shown.
BIN
lib/lombok-1.18.6.jar
Normal file
BIN
lib/lombok-1.18.6.jar
Normal file
Binary file not shown.
BIN
lib/phoenix-lang-1.0-SNAPSHOT.jar
Normal file
BIN
lib/phoenix-lang-1.0-SNAPSHOT.jar
Normal file
Binary file not shown.
BIN
lib/ragespigot-1.8.8-R0.1-SNAPSHOT.jar
Normal file
BIN
lib/ragespigot-1.8.8-R0.1-SNAPSHOT.jar
Normal file
Binary file not shown.
BIN
libs/PermissionsEx-1.23.4.jar
Normal file
BIN
libs/PermissionsEx-1.23.4.jar
Normal file
Binary file not shown.
BIN
libs/honcho-1.0-SNAPSHOT.jar
Normal file
BIN
libs/honcho-1.0-SNAPSHOT.jar
Normal file
Binary file not shown.
BIN
libs/phoenix-lang-1.0-SNAPSHOT.jar
Normal file
BIN
libs/phoenix-lang-1.0-SNAPSHOT.jar
Normal file
Binary file not shown.
BIN
libs/ragespigot-1.8.8-R0.1-SNAPSHOT.jar
Normal file
BIN
libs/ragespigot-1.8.8-R0.1-SNAPSHOT.jar
Normal file
Binary file not shown.
BIN
libs/solexspigot-1.8.8-R0.1-SNAPSHOT.jar
Normal file
BIN
libs/solexspigot-1.8.8-R0.1-SNAPSHOT.jar
Normal file
Binary file not shown.
BIN
out/artifacts/zoot_jar/zoot.jar
Normal file
BIN
out/artifacts/zoot_jar/zoot.jar
Normal file
Binary file not shown.
122
pom.xml
Normal file
122
pom.xml
Normal file
@ -0,0 +1,122 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<groupId>com.minexd</groupId>
|
||||
<artifactId>zoot</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
|
||||
<properties>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
</properties>
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<configuration>
|
||||
<source>1.8</source>
|
||||
<target>1.8</target>
|
||||
<compilerArgument>-parameters</compilerArgument>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-shade-plugin</artifactId>
|
||||
<version>2.4.3</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<phase>package</phase>
|
||||
<goals>
|
||||
<goal>shade</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
<resources>
|
||||
<resource>
|
||||
<directory>src/main/resources</directory>
|
||||
<filtering>true</filtering>
|
||||
<includes>
|
||||
<include>plugin.yml</include>
|
||||
</includes>
|
||||
</resource>
|
||||
<resource>
|
||||
<directory>src/main/resources</directory>
|
||||
<filtering>false</filtering>
|
||||
<excludes>
|
||||
<exclude>plugin.yml</exclude>
|
||||
</excludes>
|
||||
</resource>
|
||||
</resources>
|
||||
</build>
|
||||
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.spigotmc</groupId>
|
||||
<artifactId>spigot-api</artifactId>
|
||||
<version>1.8.8-R0.1-SNAPSHOT</version>
|
||||
<scope>system</scope>
|
||||
<systemPath>${project.basedir}/libs/solexspigot-1.8.8-R0.1-SNAPSHOT.jar</systemPath>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
<version>LATEST</version>
|
||||
<scope>system</scope>
|
||||
<systemPath>${project.basedir}/lib/lombok-1.18.6.jar</systemPath>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.google.code.gson</groupId>
|
||||
<artifactId>gson</artifactId>
|
||||
<version>LATEST</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.mongodb</groupId>
|
||||
<artifactId>mongo-java-driver</artifactId>
|
||||
<version>3.8.2</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>redis.clients</groupId>
|
||||
<artifactId>jedis</artifactId>
|
||||
<version>2.9.0</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.qrakn</groupId>
|
||||
<artifactId>honcho</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
<scope>system</scope>
|
||||
<systemPath>${project.basedir}/libs/honcho-1.0-SNAPSHOT.jar</systemPath>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.qrakn</groupId>
|
||||
<artifactId>phoenix</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
<scope>system</scope>
|
||||
<systemPath>${project.basedir}/libs/phoenix-lang-1.0-SNAPSHOT.jar</systemPath>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>ru.tehkode</groupId>
|
||||
<artifactId>PermissionsEx</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
<scope>system</scope>
|
||||
<systemPath>${project.basedir}/libs/PermissionsEx-1.23.4.jar</systemPath>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>net.milkbowl.vault</groupId>
|
||||
<artifactId>VaultAPI</artifactId>
|
||||
<version>1.7</version>
|
||||
<scope>system</scope>
|
||||
<systemPath>${project.basedir}/lib/VaultAPI-1.7.jar</systemPath>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
</project>
|
53
src/main/java/com/minexd/zoot/Locale.java
Normal file
53
src/main/java/com/minexd/zoot/Locale.java
Normal file
@ -0,0 +1,53 @@
|
||||
package com.minexd.zoot;
|
||||
|
||||
import java.text.MessageFormat;
|
||||
import lombok.AllArgsConstructor;
|
||||
import org.bukkit.ChatColor;
|
||||
|
||||
@AllArgsConstructor
|
||||
public enum Locale {
|
||||
|
||||
FAILED_TO_LOAD_PROFILE("COMMON_ERRORS.FAILED_TO_LOAD_PROFILE"),
|
||||
COULD_NOT_RESOLVE_PLAYER("COMMON_ERRORS.COULD_NOT_RESOLVE_PLAYER"),
|
||||
PLAYER_NOT_FOUND("COMMON_ERRORS.PLAYER_NOT_FOUND"),
|
||||
RANK_NOT_FOUND("COMMON_ERRORS.RANK_NOT_FOUND"),
|
||||
STAFF_CHAT("STAFF.CHAT"),
|
||||
STAFF_BROADCAST_PREFIX("STAFF.BROADCAST_PREFIX"),
|
||||
STAFF_JOIN_NETWORK("STAFF.JOIN_NETWORK"),
|
||||
STAFF_SWITCH_SERVER("STAFF.SWITCH_SERVER"),
|
||||
STAFF_LEAVE_NETWORK("STAFF.LEAVE_NETWORK"),
|
||||
CLEAR_CHAT_BROADCAST("CHAT.CLEAR_CHAT_BROADCAST"),
|
||||
MUTE_CHAT_BROADCAST("CHAT.MUTE_CHAT_BROADCAST"),
|
||||
DELAY_CHAT_ENABLED_BROADCAST("CHAT.DELAY_CHAT_ENABLED_BROADCAST"),
|
||||
DELAY_CHAT_DISABLED_BROADCAST("CHAT.DELAY_CHAT_DISABLED_BROADCAST"),
|
||||
CHAT_DELAYED("CHAT.CHAT_DELAYED"),
|
||||
NETWORK_BROADCAST_PREFIX("NETWORK.BROADCAST_PREFIX"),
|
||||
NETWORK_RANK_REFRESHED("NETWORK.RANK_REFRESH"),
|
||||
NETWORK_RANK_DELETED("NETWORK.RANK_DELETE"),
|
||||
CONVERSATION_SEND_MESSAGE("CONVERSATION.SEND_MESSAGE"),
|
||||
CONVERSATION_RECEIVE_MESSAGE("CONVERSATION.RECEIVE_MESSAGE"),
|
||||
OPTIONS_PRIVATE_MESSAGES_ENABLED("OPTIONS.PRIVATE_MESSAGES_ENABLED"),
|
||||
OPTIONS_PRIVATE_MESSAGES_DISABLED("OPTIONS.PRIVATE_MESSAGES_DISABLED"),
|
||||
OPTIONS_PRIVATE_MESSAGE_SOUND_ENABLED("OPTIONS.PRIVATE_MESSAGE_SOUNDS_ENABLED"),
|
||||
OPTIONS_PRIVATE_MESSAGE_SOUND_DISABLED("OPTIONS.PRIVATE_MESSAGE_SOUNDS_DISABLED"),
|
||||
OPTIONS_GLOBAL_CHAT_ENABLED("OPTIONS.GLOBAL_CHAT_ENABLED"),
|
||||
OPTIONS_GLOBAL_CHAT_DISABLED("OPTIONS.GLOBAL_CHAT_DISABLED");
|
||||
|
||||
private String path;
|
||||
|
||||
public String format(Object... objects) {
|
||||
return new MessageFormat(ChatColor.translateAlternateColorCodes('&',
|
||||
Zoot.get().getMainConfig().getString(path))).format(objects);
|
||||
}
|
||||
|
||||
// public static final String PUBLIC_CHAT_MUTE_APPLIED = "&bThe public chat has been muted by {actor}";
|
||||
// public static final String PUBLIC_CHAT_DELAY_APPLIED = "&bThe public chat has been delayed by {actor}";
|
||||
// public static final String CHAT_ATTEMPT_FILTERED = "&cYour message was filtered.";
|
||||
// public static final String CHAT_ATTEMPT_PLAYER_MUTED = "&cYou are currently muted for another {time-remaining}.";
|
||||
// public static final String CHAT_ATTEMPT_PUBLIC_CHAT_MUTED = "&cThe public chat is currently muted.";
|
||||
// public static final String CHAT_ATTEMPT_PUBLIC_CHAT_DELAYED = "&cYou may chat again in {time-remaining}.";
|
||||
// public static final String OPTIONS_GLOBAL_CHAT_DISABLED = "&cYou have your public chat disabled.";
|
||||
// public static final String OPTIONS_PRIVATE_CHAT_DISABLED = "&cYou have your private messages disabled.";
|
||||
// public static final String PTIONS_PRIVATE_CHAT_DISABLED_OTHER = "&cThat player has their private messages disabled.";
|
||||
|
||||
}
|
316
src/main/java/com/minexd/zoot/Zoot.java
Normal file
316
src/main/java/com/minexd/zoot/Zoot.java
Normal file
@ -0,0 +1,316 @@
|
||||
package com.minexd.zoot;
|
||||
|
||||
import com.google.gson.Gson;
|
||||
import com.google.gson.reflect.TypeToken;
|
||||
import com.minexd.zoot.chat.Chat;
|
||||
import com.minexd.zoot.chat.command.ClearChatCommand;
|
||||
import com.minexd.zoot.chat.command.MuteChatCommand;
|
||||
import com.minexd.zoot.chat.ChatListener;
|
||||
import com.minexd.zoot.chat.command.SlowChatCommand;
|
||||
import com.minexd.zoot.config.ConfigValidation;
|
||||
import com.minexd.zoot.essentials.Essentials;
|
||||
import com.minexd.zoot.essentials.command.*;
|
||||
import com.minexd.zoot.essentials.EssentialsListener;
|
||||
import com.minexd.zoot.network.NetworkPacketListener;
|
||||
import com.minexd.zoot.network.packet.PacketAddGrant;
|
||||
import com.minexd.zoot.network.packet.PacketBroadcastPunishment;
|
||||
import com.minexd.zoot.network.packet.PacketDeleteGrant;
|
||||
import com.minexd.zoot.network.packet.PacketDeleteRank;
|
||||
import com.minexd.zoot.network.packet.PacketRefreshRank;
|
||||
import com.minexd.zoot.network.packet.PacketStaffChat;
|
||||
import com.minexd.zoot.network.packet.PacketStaffJoinNetwork;
|
||||
import com.minexd.zoot.network.packet.PacketStaffLeaveNetwork;
|
||||
import com.minexd.zoot.network.packet.PacketStaffSwitchServer;
|
||||
import com.minexd.zoot.pidgin.Pidgin;
|
||||
import com.minexd.zoot.profile.Profile;
|
||||
import com.minexd.zoot.profile.ProfileTypeAdapter;
|
||||
import com.minexd.zoot.profile.option.command.OptionsCommand;
|
||||
import com.minexd.zoot.profile.conversation.command.MessageCommand;
|
||||
import com.minexd.zoot.profile.conversation.command.ReplyCommand;
|
||||
import com.minexd.zoot.profile.grant.command.GrantCommand;
|
||||
import com.minexd.zoot.profile.grant.command.GrantsCommand;
|
||||
import com.minexd.zoot.profile.grant.GrantListener;
|
||||
import com.minexd.zoot.profile.ProfileListener;
|
||||
import com.minexd.zoot.profile.option.command.ToggleGlobalChatCommand;
|
||||
import com.minexd.zoot.profile.option.command.TogglePrivateMessagesCommand;
|
||||
import com.minexd.zoot.profile.option.command.ToggleSoundsCommand;
|
||||
import com.minexd.zoot.profile.punishment.command.BanCommand;
|
||||
import com.minexd.zoot.profile.punishment.command.CheckCommand;
|
||||
import com.minexd.zoot.profile.punishment.command.KickCommand;
|
||||
import com.minexd.zoot.profile.punishment.command.MuteCommand;
|
||||
import com.minexd.zoot.profile.punishment.command.UnbanCommand;
|
||||
import com.minexd.zoot.profile.punishment.command.UnmuteCommand;
|
||||
import com.minexd.zoot.profile.punishment.command.WarnCommand;
|
||||
import com.minexd.zoot.profile.staff.command.AltsCommand;
|
||||
import com.minexd.zoot.profile.punishment.listener.PunishmentListener;
|
||||
import com.minexd.zoot.profile.staff.command.StaffModeCommand;
|
||||
import com.minexd.zoot.rank.Rank;
|
||||
import com.minexd.zoot.rank.RankTypeAdapter;
|
||||
import com.minexd.zoot.profile.staff.command.StaffChatCommand;
|
||||
import com.minexd.zoot.rank.command.RankAddPermissionCommand;
|
||||
import com.minexd.zoot.rank.command.RankCreateCommand;
|
||||
import com.minexd.zoot.rank.command.RankDeleteCommand;
|
||||
import com.minexd.zoot.rank.command.RankHelpCommand;
|
||||
import com.minexd.zoot.rank.command.RankInfoCommand;
|
||||
import com.minexd.zoot.rank.command.RankInheritCommand;
|
||||
import com.minexd.zoot.rank.command.RankRemovePermissionCommand;
|
||||
import com.minexd.zoot.rank.command.RankSetColorCommand;
|
||||
import com.minexd.zoot.rank.command.RankSetPrefixCommand;
|
||||
import com.minexd.zoot.rank.command.RankSetSuffixCommand;
|
||||
import com.minexd.zoot.rank.command.RankSetWeightCommand;
|
||||
import com.minexd.zoot.rank.command.RankUninheritCommand;
|
||||
import com.minexd.zoot.rank.command.RanksCommand;
|
||||
import com.minexd.zoot.util.CC;
|
||||
import com.minexd.zoot.util.adapter.ChatColorTypeAdapter;
|
||||
import com.minexd.zoot.util.duration.Duration;
|
||||
import com.minexd.zoot.util.duration.DurationTypeAdapter;
|
||||
import com.minexd.zoot.util.menu.MenuListener;
|
||||
import com.minexd.zoot.cache.RedisCache;
|
||||
import com.mongodb.MongoClient;
|
||||
import com.mongodb.MongoClientOptions;
|
||||
import com.mongodb.MongoCredential;
|
||||
import com.mongodb.ServerAddress;
|
||||
import com.mongodb.client.MongoDatabase;
|
||||
import com.qrakn.honcho.Honcho;
|
||||
import com.qrakn.phoenix.lang.file.type.BasicConfigurationFile;
|
||||
import java.lang.reflect.Type;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.logging.Level;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
import org.bukkit.scheduler.BukkitRunnable;
|
||||
import redis.clients.jedis.Jedis;
|
||||
import redis.clients.jedis.JedisPool;
|
||||
|
||||
public class Zoot extends JavaPlugin {
|
||||
|
||||
public static final Gson GSON = new Gson();
|
||||
public static final Type LIST_STRING_TYPE = new TypeToken<List<String>>() {}.getType();
|
||||
|
||||
private static Zoot zoot;
|
||||
|
||||
@Getter private BasicConfigurationFile mainConfig;
|
||||
|
||||
@Getter private Honcho honcho;
|
||||
@Getter private Pidgin pidgin;
|
||||
|
||||
@Getter private MongoDatabase mongoDatabase;
|
||||
@Getter private JedisPool jedisPool;
|
||||
@Getter private RedisCache redisCache;
|
||||
|
||||
@Getter private Essentials essentials;
|
||||
@Getter private Chat chat;
|
||||
|
||||
@Getter @Setter private boolean debug;
|
||||
|
||||
@Override
|
||||
public void onEnable() {
|
||||
zoot = this;
|
||||
|
||||
mainConfig = new BasicConfigurationFile(this, "config");
|
||||
|
||||
new ConfigValidation(mainConfig.getFile(), mainConfig.getConfiguration(), 3).check();
|
||||
|
||||
loadMongo();
|
||||
loadRedis();
|
||||
|
||||
redisCache = new RedisCache(this);
|
||||
essentials = new Essentials(this);
|
||||
chat = new Chat(this);
|
||||
|
||||
honcho = new Honcho(this);
|
||||
|
||||
Arrays.asList(
|
||||
new BroadcastCommand(),
|
||||
new ClearCommand(),
|
||||
new DayCommand(),
|
||||
new GameModeCommand(),
|
||||
new HealCommand(),
|
||||
new HidePlayerCommand(),
|
||||
new LocationCommand(),
|
||||
new MoreCommand(),
|
||||
new NightCommand(),
|
||||
new RenameCommand(),
|
||||
new SetSlotsCommand(),
|
||||
new SetSpawnCommand(),
|
||||
new ShowPlayerCommand(),
|
||||
new SpawnCommand(),
|
||||
new SunsetCommand(),
|
||||
new ClearChatCommand(),
|
||||
new SlowChatCommand(),
|
||||
new AltsCommand(),
|
||||
new BanCommand(),
|
||||
new CheckCommand(),
|
||||
new KickCommand(),
|
||||
new MuteCommand(),
|
||||
new UnbanCommand(),
|
||||
new UnmuteCommand(),
|
||||
new WarnCommand(),
|
||||
new GrantCommand(),
|
||||
new GrantsCommand(),
|
||||
new StaffChatCommand(),
|
||||
new StaffModeCommand(),
|
||||
new MuteChatCommand(),
|
||||
new OptionsCommand(),
|
||||
new RankAddPermissionCommand(),
|
||||
new RankCreateCommand(),
|
||||
new RankDeleteCommand(),
|
||||
new RankHelpCommand(),
|
||||
new RankInfoCommand(),
|
||||
new RankInheritCommand(),
|
||||
new RankRemovePermissionCommand(),
|
||||
new RanksCommand(),
|
||||
new RankSetColorCommand(),
|
||||
new RankSetPrefixCommand(),
|
||||
new RankSetSuffixCommand(),
|
||||
new RankSetWeightCommand(),
|
||||
new RankUninheritCommand(),
|
||||
new ZootDebugCommand(),
|
||||
new TeleportWorldCommand(),
|
||||
new MessageCommand(),
|
||||
new ReplyCommand(),
|
||||
new ToggleGlobalChatCommand(),
|
||||
new TogglePrivateMessagesCommand(),
|
||||
new ToggleSoundsCommand(),
|
||||
new PingCommand(),
|
||||
new ListCommand()
|
||||
).forEach(honcho::registerCommand);
|
||||
|
||||
honcho.registerTypeAdapter(Rank.class, new RankTypeAdapter());
|
||||
honcho.registerTypeAdapter(Profile.class, new ProfileTypeAdapter());
|
||||
honcho.registerTypeAdapter(Duration.class, new DurationTypeAdapter());
|
||||
honcho.registerTypeAdapter(ChatColor.class, new ChatColorTypeAdapter());
|
||||
|
||||
pidgin = new Pidgin("zoot",
|
||||
mainConfig.getString("REDIS.HOST"),
|
||||
mainConfig.getInteger("REDIS.PORT"),
|
||||
mainConfig.getBoolean("REDIS.AUTHENTICATION.ENABLED") ?
|
||||
mainConfig.getString("REDIS.AUTHENTICATION.PASSWORD") : null
|
||||
);
|
||||
|
||||
Arrays.asList(
|
||||
PacketAddGrant.class,
|
||||
PacketBroadcastPunishment.class,
|
||||
PacketDeleteGrant.class,
|
||||
PacketDeleteRank.class,
|
||||
PacketRefreshRank.class,
|
||||
PacketStaffChat.class,
|
||||
PacketStaffJoinNetwork.class,
|
||||
PacketStaffLeaveNetwork.class,
|
||||
PacketStaffSwitchServer.class
|
||||
).forEach(pidgin::registerPacket);
|
||||
|
||||
pidgin.registerListener(new NetworkPacketListener(this));
|
||||
|
||||
Arrays.asList(
|
||||
new ProfileListener(this),
|
||||
new MenuListener(this),
|
||||
new EssentialsListener(this),
|
||||
new ChatListener(this),
|
||||
new GrantListener(this),
|
||||
new PunishmentListener(this)
|
||||
).forEach(listener -> getServer().getPluginManager().registerEvents(listener, this));
|
||||
|
||||
Rank.init();
|
||||
Profile.init();
|
||||
|
||||
new BukkitRunnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
for (Profile profile : Profile.getProfiles().values()) {
|
||||
profile.checkGrants();
|
||||
}
|
||||
}
|
||||
}.runTaskTimerAsynchronously(this, 20L, 20L);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDisable() {
|
||||
try {
|
||||
jedisPool.close();
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Prints a message and exception to console. If the server is not in debug mode, the messages will be suppressed.
|
||||
*
|
||||
* @param level The log level.
|
||||
* @param message The message.
|
||||
* @param exception The thrown exception.
|
||||
*/
|
||||
public void debug(Level level, String message, Exception exception) {
|
||||
getLogger().log(level, message);
|
||||
exception.printStackTrace();
|
||||
}
|
||||
|
||||
/**
|
||||
* Prints a message to console and server operators.
|
||||
*
|
||||
* @param message The message.
|
||||
*/
|
||||
public void debug(String message) {
|
||||
if (debug) {
|
||||
broadcastOps(CC.translate("&e(Debug) &r" + message));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Prints a message triggered by an action a player performed to console and server operators.
|
||||
*
|
||||
* @param player The player that triggered this log.
|
||||
* @param message The message.
|
||||
*/
|
||||
public void debug(Player player, String message) {
|
||||
if (debug) {
|
||||
broadcastOps(CC.translate("&e(Debug) &r" + player.getDisplayName() + ": " + message));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Broadcasts a message to all server operators.
|
||||
*
|
||||
* @param message The message.
|
||||
*/
|
||||
public static void broadcastOps(String message) {
|
||||
Bukkit.getOnlinePlayers().stream().filter(Player::isOp).forEach(op -> op.sendMessage(message));
|
||||
}
|
||||
|
||||
private void loadMongo() {
|
||||
if (mainConfig.getBoolean("MONGO.AUTHENTICATION.ENABLED")) {
|
||||
ServerAddress serverAddress = new ServerAddress(mainConfig.getString("MONGO.HOST"),
|
||||
mainConfig.getInteger("MONGO.PORT"));
|
||||
|
||||
MongoCredential credential = MongoCredential.createCredential(
|
||||
mainConfig.getString("MONGO.AUTHENTICATION.USERNAME"), "admin",
|
||||
mainConfig.getString("MONGO.AUTHENTICATION.PASSWORD").toCharArray());
|
||||
|
||||
mongoDatabase = new MongoClient(serverAddress, credential, MongoClientOptions.builder().build())
|
||||
.getDatabase("zoot");
|
||||
} else {
|
||||
mongoDatabase = new MongoClient(mainConfig.getString("MONGO.HOST"),
|
||||
mainConfig.getInteger("MONGO.PORT")).getDatabase("zoot");
|
||||
}
|
||||
}
|
||||
|
||||
private void loadRedis() {
|
||||
jedisPool = new JedisPool(mainConfig.getString("REDIS.HOST"), mainConfig.getInteger("REDIS.PORT"));
|
||||
|
||||
if (mainConfig.getBoolean("REDIS.AUTHENTICATION.ENABLED")) {
|
||||
try (Jedis jedis = jedisPool.getResource()) {
|
||||
jedis.auth(mainConfig.getString("REDIS.AUTHENTICATION.PASSWORD"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static Zoot get() {
|
||||
return zoot;
|
||||
}
|
||||
|
||||
}
|
30
src/main/java/com/minexd/zoot/ZootAPI.java
Normal file
30
src/main/java/com/minexd/zoot/ZootAPI.java
Normal file
@ -0,0 +1,30 @@
|
||||
package com.minexd.zoot;
|
||||
|
||||
import com.minexd.zoot.profile.Profile;
|
||||
import com.minexd.zoot.rank.Rank;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public class ZootAPI {
|
||||
|
||||
public static ChatColor getColorOfPlayer(Player player) {
|
||||
Profile profile = Profile.getProfiles().get(player.getUniqueId());
|
||||
return profile == null ? ChatColor.WHITE : ChatColor.getByChar(profile.getActiveRank().getColor());
|
||||
}
|
||||
|
||||
public static String getColoredName(Player player) {
|
||||
Profile profile = Profile.getProfiles().get(player.getUniqueId());
|
||||
return (profile == null ? ChatColor.WHITE : profile.getActiveRank().getColor()) + player.getName();
|
||||
}
|
||||
|
||||
public static Rank getRankOfPlayer(Player player) {
|
||||
Profile profile = Profile.getProfiles().get(player.getUniqueId());
|
||||
return profile == null ? Rank.getDefaultRank() : profile.getActiveRank();
|
||||
}
|
||||
|
||||
public static boolean isInStaffMode(Player player) {
|
||||
Profile profile = Profile.getProfiles().get(player.getUniqueId());
|
||||
return profile != null && player.hasPermission("zoot.staff") && profile.getStaffOptions().staffModeEnabled();
|
||||
}
|
||||
|
||||
}
|
15
src/main/java/com/minexd/zoot/bootstrap/Bootstrapped.java
Normal file
15
src/main/java/com/minexd/zoot/bootstrap/Bootstrapped.java
Normal file
@ -0,0 +1,15 @@
|
||||
package com.minexd.zoot.bootstrap;
|
||||
|
||||
import com.minexd.zoot.Zoot;
|
||||
import lombok.Getter;
|
||||
|
||||
@Getter
|
||||
public class Bootstrapped {
|
||||
|
||||
protected final Zoot zoot;
|
||||
|
||||
public Bootstrapped(Zoot zoot) {
|
||||
this.zoot = zoot;
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,12 @@
|
||||
package com.minexd.zoot.bootstrap;
|
||||
|
||||
import com.minexd.zoot.Zoot;
|
||||
import org.bukkit.event.Listener;
|
||||
|
||||
public class BootstrappedListener extends Bootstrapped implements Listener {
|
||||
|
||||
public BootstrappedListener(Zoot zoot) {
|
||||
super(zoot);
|
||||
}
|
||||
|
||||
}
|
114
src/main/java/com/minexd/zoot/cache/RedisCache.java
vendored
Normal file
114
src/main/java/com/minexd/zoot/cache/RedisCache.java
vendored
Normal file
@ -0,0 +1,114 @@
|
||||
package com.minexd.zoot.cache;
|
||||
|
||||
import com.google.gson.JsonObject;
|
||||
import com.google.gson.JsonParser;
|
||||
import com.minexd.zoot.Zoot;
|
||||
import com.minexd.zoot.bootstrap.Bootstrapped;
|
||||
import java.io.BufferedReader;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
import java.net.URL;
|
||||
import java.net.URLConnection;
|
||||
import java.util.UUID;
|
||||
import java.util.logging.Level;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.json.simple.parser.ParseException;
|
||||
import redis.clients.jedis.Jedis;
|
||||
|
||||
public class RedisCache extends Bootstrapped {
|
||||
|
||||
public RedisCache(Zoot zoot) {
|
||||
super(zoot);
|
||||
}
|
||||
|
||||
public UUID getUuid(String name) {
|
||||
if (zoot.getServer().isPrimaryThread()) {
|
||||
throw new IllegalStateException("Cannot query on main thread (Redis profile cache)");
|
||||
}
|
||||
|
||||
try (Jedis jedis = zoot.getJedisPool().getResource()) {
|
||||
String uuid = jedis.hget("uuid-cache:name-to-uuid", name.toLowerCase());
|
||||
|
||||
if (uuid != null) {
|
||||
return UUID.fromString(uuid);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
zoot.debug(Level.WARNING, "Could not connect to redis", e);
|
||||
}
|
||||
|
||||
try {
|
||||
UUID uuid = getFromMojang(name);
|
||||
|
||||
if (uuid != null) {
|
||||
updateNameAndUUID(name, uuid);
|
||||
return uuid;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
zoot.debug(Level.WARNING, "Could not fetch from Mojang API", e);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public void updateNameAndUUID(String name, UUID uuid) {
|
||||
if (Bukkit.isPrimaryThread()) {
|
||||
throw new IllegalStateException("Cannot query redis on main thread!");
|
||||
}
|
||||
|
||||
try (Jedis jedis = zoot.getJedisPool().getResource()) {
|
||||
jedis.hset("uuid-cache:name-to-uuid", name.toLowerCase(), uuid.toString());
|
||||
jedis.hset("uuid-cache:uuid-to-name", uuid.toString(), name);
|
||||
}
|
||||
}
|
||||
|
||||
public RedisPlayerData getPlayerData(UUID uuid) {
|
||||
if (Bukkit.isPrimaryThread()) {
|
||||
throw new IllegalStateException("Cannot query redis on main thread!");
|
||||
}
|
||||
|
||||
try (Jedis jedis = zoot.getJedisPool().getResource()) {
|
||||
String data = jedis.hget("player-data", uuid.toString());
|
||||
|
||||
if (data == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
JsonObject dataJson = new JsonParser().parse(data).getAsJsonObject();
|
||||
return new RedisPlayerData(dataJson);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public void updatePlayerData(RedisPlayerData playerData) {
|
||||
try (Jedis jedis = zoot.getJedisPool().getResource()) {
|
||||
jedis.hset("player-data", playerData.getUuid().toString(), playerData.getJson().toString());
|
||||
}
|
||||
}
|
||||
|
||||
private static UUID getFromMojang(String name) throws IOException, ParseException {
|
||||
URL url = new URL("https://api.mojang.com/users/profiles/minecraft/" + name);
|
||||
URLConnection conn = url.openConnection();
|
||||
conn.setDoOutput(true);
|
||||
|
||||
BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
|
||||
String line = reader.readLine();
|
||||
|
||||
if (line == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
String[] id = line.split(",");
|
||||
|
||||
String part = id[0];
|
||||
part = part.substring(7, 39);
|
||||
|
||||
return UUID.fromString(String.valueOf(part).replaceAll("(\\w{8})(\\w{4})(\\w{4})(\\w{4})(\\w{12})",
|
||||
"$1-$2-$3-$4-$5"));
|
||||
}
|
||||
|
||||
}
|
50
src/main/java/com/minexd/zoot/cache/RedisPlayerData.java
vendored
Normal file
50
src/main/java/com/minexd/zoot/cache/RedisPlayerData.java
vendored
Normal file
@ -0,0 +1,50 @@
|
||||
package com.minexd.zoot.cache;
|
||||
|
||||
import com.google.gson.JsonObject;
|
||||
import com.minexd.zoot.util.TimeUtil;
|
||||
import com.minexd.zoot.util.json.JsonChain;
|
||||
import java.util.UUID;
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class RedisPlayerData {
|
||||
|
||||
private UUID uuid;
|
||||
private String username;
|
||||
private LastAction lastAction;
|
||||
private String lastSeenServer;
|
||||
private long lastSeenAt;
|
||||
|
||||
public RedisPlayerData(JsonObject object) {
|
||||
this.uuid = UUID.fromString(object.get("uuid").getAsString());
|
||||
this.username = object.get("username").getAsString();
|
||||
this.lastAction = LastAction.valueOf(object.get("lastAction").getAsString());
|
||||
this.lastSeenServer = object.get("lastSeenServer").getAsString();
|
||||
this.lastSeenAt = object.get("lastSeenAt").getAsLong();
|
||||
}
|
||||
|
||||
public RedisPlayerData(UUID uuid, String username) {
|
||||
this.uuid = uuid;
|
||||
this.username = username;
|
||||
}
|
||||
|
||||
public JsonObject getJson() {
|
||||
return new JsonChain()
|
||||
.addProperty("uuid", uuid.toString())
|
||||
.addProperty("username", username)
|
||||
.addProperty("lastAction", lastAction.name())
|
||||
.addProperty("lastSeenServer", lastSeenServer)
|
||||
.addProperty("lastSeenAt", lastSeenAt)
|
||||
.get();
|
||||
}
|
||||
|
||||
public String getTimeAgo() {
|
||||
return TimeUtil.millisToRoundedTime(System.currentTimeMillis() - lastSeenAt) + " ago";
|
||||
}
|
||||
|
||||
public enum LastAction {
|
||||
LEAVING_SERVER,
|
||||
JOINING_SERVER
|
||||
}
|
||||
|
||||
}
|
80
src/main/java/com/minexd/zoot/chat/Chat.java
Normal file
80
src/main/java/com/minexd/zoot/chat/Chat.java
Normal file
@ -0,0 +1,80 @@
|
||||
package com.minexd.zoot.chat;
|
||||
|
||||
import com.minexd.zoot.Zoot;
|
||||
import com.minexd.zoot.bootstrap.Bootstrapped;
|
||||
import com.minexd.zoot.chat.filter.ChatFilter;
|
||||
import com.minexd.zoot.profile.Profile;
|
||||
import com.minexd.zoot.profile.punishment.PunishmentType;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import com.minexd.zoot.util.Cooldown;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public class Chat extends Bootstrapped {
|
||||
|
||||
public Chat(Zoot zoot) {
|
||||
super(zoot);
|
||||
}
|
||||
|
||||
@Getter @Setter private int delayTime = 3;
|
||||
@Getter private boolean publicChatMuted = false;
|
||||
@Getter private boolean publicChatDelayed = false;
|
||||
@Getter private final List<ChatFilter> filters = new ArrayList<>();
|
||||
@Getter private List<String> filteredPhrases = new ArrayList<>();
|
||||
@Getter private List<String> linkWhitelist = new ArrayList<>();
|
||||
|
||||
public void togglePublicChatMute() {
|
||||
publicChatMuted = !publicChatMuted;
|
||||
}
|
||||
|
||||
public void togglePublicChatDelay() {
|
||||
publicChatDelayed = !publicChatDelayed;
|
||||
}
|
||||
|
||||
public ChatAttempt attemptChatMessage(Player player, String message) {
|
||||
Profile profile = Profile.getProfiles().get(player.getUniqueId());
|
||||
|
||||
if (profile.getActivePunishmentByType(PunishmentType.MUTE) != null) {
|
||||
return new ChatAttempt(ChatAttempt.Response.PLAYER_MUTED, profile.getActivePunishmentByType(PunishmentType.MUTE));
|
||||
}
|
||||
|
||||
if (publicChatMuted && !player.hasPermission("zoot.staff")) {
|
||||
return new ChatAttempt(ChatAttempt.Response.CHAT_MUTED);
|
||||
}
|
||||
|
||||
if (publicChatDelayed && !profile.getChatCooldown().hasExpired() && !player.hasPermission("zoot.staff")) {
|
||||
ChatAttempt attempt = new ChatAttempt(ChatAttempt.Response.CHAT_DELAYED);
|
||||
attempt.setValue(profile.getChatCooldown().getRemaining());
|
||||
return attempt;
|
||||
}
|
||||
|
||||
String msg = message.toLowerCase()
|
||||
.replace("3", "e")
|
||||
.replace("1", "i")
|
||||
.replace("!", "i")
|
||||
.replace("@", "a")
|
||||
.replace("7", "t")
|
||||
.replace("0", "o")
|
||||
.replace("5", "s")
|
||||
.replace("8", "b")
|
||||
.replaceAll("\\p{Punct}|\\d", "").trim();
|
||||
|
||||
String[] words = msg.trim().split(" ");
|
||||
|
||||
for (ChatFilter chatFilter : filters) {
|
||||
if (chatFilter.isFiltered(msg, words)) {
|
||||
return new ChatAttempt(ChatAttempt.Response.MESSAGE_FILTERED);
|
||||
}
|
||||
}
|
||||
|
||||
if (publicChatDelayed) {
|
||||
profile.setChatCooldown(new Cooldown(delayTime * 1000L));
|
||||
}
|
||||
|
||||
return new ChatAttempt(ChatAttempt.Response.ALLOWED);
|
||||
}
|
||||
|
||||
}
|
39
src/main/java/com/minexd/zoot/chat/ChatAttempt.java
Normal file
39
src/main/java/com/minexd/zoot/chat/ChatAttempt.java
Normal file
@ -0,0 +1,39 @@
|
||||
package com.minexd.zoot.chat;
|
||||
|
||||
import com.minexd.zoot.chat.filter.ChatFilter;
|
||||
import com.minexd.zoot.profile.punishment.Punishment;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
public class ChatAttempt {
|
||||
|
||||
private Response response;
|
||||
private ChatFilter filterFlagged;
|
||||
private Punishment punishment;
|
||||
private Object value;
|
||||
|
||||
public ChatAttempt(Response response) {
|
||||
this.response = response;
|
||||
}
|
||||
|
||||
public ChatAttempt(Response response, ChatFilter filterFlagged) {
|
||||
this.response = response;
|
||||
this.filterFlagged = filterFlagged;
|
||||
}
|
||||
|
||||
public ChatAttempt(Response response, Punishment punishment) {
|
||||
this.response = response;
|
||||
this.punishment = punishment;
|
||||
}
|
||||
|
||||
public enum Response {
|
||||
ALLOWED,
|
||||
MESSAGE_FILTERED,
|
||||
PLAYER_MUTED,
|
||||
CHAT_MUTED,
|
||||
CHAT_DELAYED
|
||||
}
|
||||
|
||||
}
|
63
src/main/java/com/minexd/zoot/chat/ChatListener.java
Normal file
63
src/main/java/com/minexd/zoot/chat/ChatListener.java
Normal file
@ -0,0 +1,63 @@
|
||||
package com.minexd.zoot.chat;
|
||||
|
||||
import com.minexd.zoot.Locale;
|
||||
import com.minexd.zoot.Zoot;
|
||||
import com.minexd.zoot.bootstrap.BootstrappedListener;
|
||||
import com.minexd.zoot.chat.event.ChatAttemptEvent;
|
||||
import com.minexd.zoot.util.CC;
|
||||
import com.minexd.zoot.util.TimeUtil;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.player.AsyncPlayerChatEvent;
|
||||
|
||||
public class ChatListener extends BootstrappedListener {
|
||||
|
||||
public ChatListener(Zoot zoot) {
|
||||
super(zoot);
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true)
|
||||
public void onAsyncPlayerChatEvent(AsyncPlayerChatEvent event) {
|
||||
ChatAttempt chatAttempt = zoot.getChat().attemptChatMessage(event.getPlayer(), event.getMessage());
|
||||
ChatAttemptEvent chatAttemptEvent = new ChatAttemptEvent(event.getPlayer(), chatAttempt, event.getMessage());
|
||||
|
||||
zoot.getServer().getPluginManager().callEvent(chatAttemptEvent);
|
||||
|
||||
if (!chatAttemptEvent.isCancelled()) {
|
||||
switch (chatAttempt.getResponse()) {
|
||||
case ALLOWED: {
|
||||
event.setFormat("%1$s" + CC.RESET + ": %2$s");
|
||||
}
|
||||
break;
|
||||
case MESSAGE_FILTERED: {
|
||||
event.setCancelled(true);
|
||||
chatAttempt.getFilterFlagged().punish(event.getPlayer());
|
||||
}
|
||||
break;
|
||||
case PLAYER_MUTED: {
|
||||
event.setCancelled(true);
|
||||
|
||||
if (chatAttempt.getPunishment().isPermanent()) {
|
||||
event.getPlayer().sendMessage(CC.RED + "You are muted for forever.");
|
||||
} else {
|
||||
event.getPlayer().sendMessage(CC.RED + "You are muted for another " +
|
||||
chatAttempt.getPunishment().getTimeRemaining() + ".");
|
||||
}
|
||||
}
|
||||
break;
|
||||
case CHAT_MUTED: {
|
||||
event.setCancelled(true);
|
||||
event.getPlayer().sendMessage(CC.RED + "The public chat is currently muted.");
|
||||
}
|
||||
break;
|
||||
case CHAT_DELAYED: {
|
||||
event.setCancelled(true);
|
||||
event.getPlayer().sendMessage(Locale.CHAT_DELAYED.format(
|
||||
TimeUtil.millisToSeconds((int) chatAttempt.getValue())) + " seconds");
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,40 @@
|
||||
package com.minexd.zoot.chat.command;
|
||||
|
||||
import com.minexd.zoot.Locale;
|
||||
import com.minexd.zoot.Zoot;
|
||||
import com.minexd.zoot.profile.Profile;
|
||||
import com.qrakn.honcho.command.CommandMeta;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@CommandMeta(label = { "clearchat", "cc" }, permission = "zoot.staff.clearchat")
|
||||
public class ClearChatCommand {
|
||||
|
||||
public void execute(CommandSender sender) {
|
||||
String[] strings = new String[101];
|
||||
|
||||
for (Player player : Bukkit.getOnlinePlayers()) {
|
||||
if (player.hasPermission("zoot.staff")) {
|
||||
if (Zoot.get().getMainConfig().getBoolean("CHAT.CLEAR_CHAT_FOR_STAFF")) {
|
||||
player.sendMessage(strings);
|
||||
}
|
||||
} else {
|
||||
player.sendMessage(strings);
|
||||
}
|
||||
}
|
||||
|
||||
String senderName;
|
||||
|
||||
if (sender instanceof Player) {
|
||||
Profile profile = Profile.getProfiles().get(((Player) sender).getUniqueId());
|
||||
senderName = profile.getActiveRank().getColor() + sender.getName();
|
||||
} else {
|
||||
senderName = ChatColor.DARK_RED + "Console";
|
||||
}
|
||||
|
||||
Bukkit.broadcastMessage(Locale.CLEAR_CHAT_BROADCAST.format(senderName));
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,32 @@
|
||||
package com.minexd.zoot.chat.command;
|
||||
|
||||
import com.minexd.zoot.Locale;
|
||||
import com.minexd.zoot.Zoot;
|
||||
import com.minexd.zoot.profile.Profile;
|
||||
import com.qrakn.honcho.command.CommandMeta;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@CommandMeta(label = "mutechat", permission = "zoot.staff.mutechat")
|
||||
public class MuteChatCommand {
|
||||
|
||||
public void execute(CommandSender sender) {
|
||||
Zoot.get().getChat().togglePublicChatMute();
|
||||
|
||||
String senderName;
|
||||
|
||||
if (sender instanceof Player) {
|
||||
Profile profile = Profile.getProfiles().get(((Player) sender).getUniqueId());
|
||||
senderName = profile.getActiveRank().getColor() + sender.getName();
|
||||
} else {
|
||||
senderName = ChatColor.DARK_RED + "Console";
|
||||
}
|
||||
|
||||
String context = Zoot.get().getChat().isPublicChatMuted() ? "muted" : "unmuted";
|
||||
|
||||
Bukkit.broadcastMessage(Locale.MUTE_CHAT_BROADCAST.format(context, senderName));
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,48 @@
|
||||
package com.minexd.zoot.chat.command;
|
||||
|
||||
import com.minexd.zoot.Locale;
|
||||
import com.minexd.zoot.Zoot;
|
||||
import com.minexd.zoot.ZootAPI;
|
||||
import com.qrakn.honcho.command.CommandMeta;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@CommandMeta(label = "slowchat", permission = "zoot.staff.slowchat")
|
||||
public class SlowChatCommand {
|
||||
|
||||
public void execute(CommandSender sender) {
|
||||
Zoot.get().getChat().togglePublicChatDelay();
|
||||
|
||||
String senderName;
|
||||
|
||||
if (sender instanceof Player) {
|
||||
senderName = ZootAPI.getColoredName((Player) sender);
|
||||
} else {
|
||||
senderName = ChatColor.DARK_RED + "Console";
|
||||
}
|
||||
|
||||
String context = Zoot.get().getChat().getDelayTime() == 1 ? "" : "s";
|
||||
|
||||
if (Zoot.get().getChat().isPublicChatDelayed()) {
|
||||
Bukkit.broadcastMessage(Locale.DELAY_CHAT_ENABLED_BROADCAST.format(senderName,
|
||||
Zoot.get().getChat().getDelayTime(), context));
|
||||
} else {
|
||||
Bukkit.broadcastMessage(Locale.DELAY_CHAT_DISABLED_BROADCAST.format(senderName));
|
||||
}
|
||||
}
|
||||
|
||||
public void execute(CommandSender sender, Integer seconds) {
|
||||
if (seconds < 0 || seconds > 60) {
|
||||
sender.sendMessage(ChatColor.RED + "A delay can only be between 1-60 seconds.");
|
||||
return;
|
||||
}
|
||||
|
||||
String context = seconds == 1 ? "" : "s";
|
||||
|
||||
sender.sendMessage(ChatColor.GREEN + "You have updated the chat delay to " + seconds + " second" + context + ".");
|
||||
Zoot.get().getChat().setDelayTime(seconds);
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,25 @@
|
||||
package com.minexd.zoot.chat.event;
|
||||
|
||||
import com.minexd.zoot.chat.ChatAttempt;
|
||||
import com.minexd.zoot.util.BaseEvent;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.Cancellable;
|
||||
|
||||
@Getter
|
||||
public class ChatAttemptEvent extends BaseEvent implements Cancellable {
|
||||
|
||||
private final Player player;
|
||||
private final ChatAttempt chatAttempt;
|
||||
@Setter private String chatMessage;
|
||||
@Setter private boolean cancelled;
|
||||
@Setter private String cancelReason = "";
|
||||
|
||||
public ChatAttemptEvent(Player player, ChatAttempt chatAttempt, String chatMessage) {
|
||||
this.player = player;
|
||||
this.chatAttempt = chatAttempt;
|
||||
this.chatMessage = chatMessage;
|
||||
}
|
||||
|
||||
}
|
27
src/main/java/com/minexd/zoot/chat/filter/ChatFilter.java
Normal file
27
src/main/java/com/minexd/zoot/chat/filter/ChatFilter.java
Normal file
@ -0,0 +1,27 @@
|
||||
package com.minexd.zoot.chat.filter;
|
||||
|
||||
import com.minexd.zoot.Zoot;
|
||||
import com.minexd.zoot.bootstrap.Bootstrapped;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public abstract class ChatFilter extends Bootstrapped {
|
||||
|
||||
private String command;
|
||||
|
||||
public ChatFilter(Zoot zoot, String command) {
|
||||
super(zoot);
|
||||
|
||||
this.command = command;
|
||||
}
|
||||
|
||||
public abstract boolean isFiltered(String message, String[] words);
|
||||
|
||||
public void punish(Player player) {
|
||||
if (command != null) {
|
||||
zoot.getServer().dispatchCommand(zoot.getServer().getConsoleSender(), command
|
||||
.replace("{player}", player.getName())
|
||||
.replace("{player-uuid}", player.getUniqueId().toString()));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,30 @@
|
||||
package com.minexd.zoot.chat.filter.impl;
|
||||
|
||||
import com.minexd.zoot.Zoot;
|
||||
import com.minexd.zoot.chat.filter.ChatFilter;
|
||||
|
||||
public class ContainsFilter extends ChatFilter {
|
||||
|
||||
private final String phrase;
|
||||
|
||||
public ContainsFilter(Zoot zoot, String phrase) {
|
||||
this(zoot, phrase, null);
|
||||
}
|
||||
|
||||
public ContainsFilter(Zoot zoot, String phrase, String command) {
|
||||
super(zoot, command);
|
||||
this.phrase = phrase;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isFiltered(String message, String[] words) {
|
||||
for (String word : words) {
|
||||
if (word.contains(this.phrase)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,49 @@
|
||||
package com.minexd.zoot.chat.filter.impl;
|
||||
|
||||
import com.minexd.zoot.Zoot;
|
||||
import com.minexd.zoot.chat.filter.ChatFilter;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
public class LinkFilter extends ChatFilter {
|
||||
|
||||
private static final Pattern URL_REGEX = Pattern.compile(
|
||||
"^(http://www\\.|https://www\\.|http://|https://)?[a-z0-9]+([\\-.][a-z0-9]+)*\\.[a-z]{2,5}(:[0-9]{1,5})?(/.*)?$");
|
||||
private static final Pattern IP_REGEX = Pattern.compile(
|
||||
"^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])([.,])){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$");
|
||||
|
||||
public LinkFilter(Zoot zoot) {
|
||||
super(zoot, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isFiltered(String message, String[] words) {
|
||||
for (String word : message.replace("(dot)", ".").replace("[dot]", ".").trim().split(" ")) {
|
||||
boolean continueIt = false;
|
||||
|
||||
for (String phrase : this.zoot.getChat().getLinkWhitelist()) {
|
||||
if (word.toLowerCase().contains(phrase)) {
|
||||
continueIt = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!continueIt) {
|
||||
Matcher matcher = IP_REGEX.matcher(word);
|
||||
|
||||
if (matcher.matches()) {
|
||||
return true;
|
||||
}
|
||||
|
||||
matcher = URL_REGEX.matcher(word);
|
||||
|
||||
if (matcher.matches()) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,219 @@
|
||||
package com.minexd.zoot.chat.util;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.regex.Pattern;
|
||||
import net.md_5.bungee.api.ChatColor;
|
||||
import net.md_5.bungee.api.chat.BaseComponent;
|
||||
import net.md_5.bungee.api.chat.ClickEvent;
|
||||
import net.md_5.bungee.api.chat.ComponentBuilder;
|
||||
import net.md_5.bungee.api.chat.HoverEvent;
|
||||
import net.md_5.bungee.api.chat.TextComponent;
|
||||
|
||||
public class ChatComponentBuilder extends ComponentBuilder {
|
||||
|
||||
private static Field partsField;
|
||||
private static Field currField;
|
||||
|
||||
static {
|
||||
try {
|
||||
currField = ComponentBuilder.class.getDeclaredField("current");
|
||||
partsField = ComponentBuilder.class.getDeclaredField("parts");
|
||||
|
||||
currField.setAccessible(true);
|
||||
partsField.setAccessible(true);
|
||||
} catch (NoSuchFieldException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public ChatComponentBuilder(String text) {
|
||||
super("");
|
||||
this.parse(text);
|
||||
}
|
||||
|
||||
public TextComponent getCurrent() {
|
||||
try {
|
||||
return (TextComponent) currField.get(this);
|
||||
} catch (IllegalAccessException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public void setCurrent(TextComponent tc) {
|
||||
try {
|
||||
currField.set(this, tc);
|
||||
} catch (IllegalAccessException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public List getParts() {
|
||||
try {
|
||||
return (List) partsField.get(this);
|
||||
} catch (IllegalAccessException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public ChatComponentBuilder setCurrentHoverEvent(HoverEvent hoverEvent) {
|
||||
this.getCurrent().setHoverEvent(hoverEvent);
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
public ChatComponentBuilder setCurrentClickEvent(ClickEvent clickEvent) {
|
||||
this.getCurrent().setClickEvent(clickEvent);
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
public ChatComponentBuilder attachToEachPart(HoverEvent hoverEvent) {
|
||||
for (Object part : getParts()) {
|
||||
TextComponent component = (TextComponent) part;
|
||||
|
||||
if (component.getHoverEvent() == null) {
|
||||
component.setHoverEvent(hoverEvent);
|
||||
}
|
||||
}
|
||||
|
||||
this.getCurrent().setHoverEvent(hoverEvent);
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
public ChatComponentBuilder attachToEachPart(ClickEvent clickEvent) {
|
||||
for (Object part : getParts()) {
|
||||
TextComponent component = (TextComponent) part;
|
||||
|
||||
if (component.getClickEvent() == null) {
|
||||
component.setClickEvent(clickEvent);
|
||||
}
|
||||
}
|
||||
|
||||
this.getCurrent().setClickEvent(clickEvent);
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
public ChatComponentBuilder parse(String text) {
|
||||
String regex = "[&§]{1}([a-fA-Fl-oL-O0-9-r]){1}";
|
||||
text = text.replaceAll(regex, "§$1");
|
||||
|
||||
if (!Pattern.compile(regex).matcher(text).find()) {
|
||||
if (getParts().isEmpty() && getCurrent() != null && getCurrent().getText().isEmpty()) {
|
||||
getCurrent().setText(text);
|
||||
} else {
|
||||
this.append(text);
|
||||
}
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
String[] words = text.split(regex);
|
||||
int index = words[0].length();
|
||||
|
||||
for (String word : words) {
|
||||
try {
|
||||
if (index != words[0].length()) {
|
||||
if (getParts().isEmpty() && getCurrent() != null && getCurrent().getText().isEmpty()) {
|
||||
getCurrent().setText(word);
|
||||
} else {
|
||||
this.append(word);
|
||||
}
|
||||
|
||||
ChatColor color = ChatColor.getByChar(text.charAt(index - 1));
|
||||
|
||||
if (color == ChatColor.BOLD) {
|
||||
this.bold(true);
|
||||
} else if (color == ChatColor.STRIKETHROUGH) {
|
||||
this.strikethrough(true);
|
||||
} else if (color == ChatColor.MAGIC) {
|
||||
this.obfuscated(true);
|
||||
} else if (color == ChatColor.UNDERLINE) {
|
||||
this.underlined(true);
|
||||
} else if (color == ChatColor.RESET) {
|
||||
this.bold(false);
|
||||
this.strikethrough(false);
|
||||
this.obfuscated(false);
|
||||
this.underlined(false);
|
||||
} else {
|
||||
this.color(color);
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
index += word.length() + 2;
|
||||
}
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
public ChatComponentBuilder append(BaseComponent[] components) {
|
||||
for (BaseComponent component : components) {
|
||||
append((TextComponent) component);
|
||||
}
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
public ChatComponentBuilder append(TextComponent textComponent) {
|
||||
if (textComponent == null) {
|
||||
return this;
|
||||
}
|
||||
|
||||
String text = textComponent.getText();
|
||||
ChatColor color = textComponent.getColor();
|
||||
boolean bold = textComponent.isBold();
|
||||
boolean underline = textComponent.isUnderlined();
|
||||
boolean italic = textComponent.isUnderlined();
|
||||
boolean strike = textComponent.isStrikethrough();
|
||||
HoverEvent he = textComponent.getHoverEvent();
|
||||
ClickEvent ce = textComponent.getClickEvent();
|
||||
|
||||
append(text);
|
||||
color(color);
|
||||
underlined(underline);
|
||||
italic(italic);
|
||||
strikethrough(strike);
|
||||
event(he);
|
||||
event(ce);
|
||||
|
||||
if (textComponent.getExtra() != null) {
|
||||
for (BaseComponent bc : textComponent.getExtra()) {
|
||||
if (bc instanceof TextComponent) {
|
||||
append((TextComponent) bc);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public BaseComponent[] create() {
|
||||
List<TextComponent> components = new ArrayList<>(getParts());
|
||||
components.add(getCurrent());
|
||||
|
||||
TextComponent first = components.get(0);
|
||||
|
||||
if (first.getText().isEmpty()) {
|
||||
components.remove(0);
|
||||
}
|
||||
|
||||
TextComponent last = components.get(components.size() - 1);
|
||||
|
||||
if (last.getText().isEmpty()) {
|
||||
components.remove(components.size() - 1);
|
||||
}
|
||||
|
||||
return components.toArray(new BaseComponent[components.size()]);
|
||||
}
|
||||
|
||||
}
|
10
src/main/java/com/minexd/zoot/config/ConfigConversion.java
Normal file
10
src/main/java/com/minexd/zoot/config/ConfigConversion.java
Normal file
@ -0,0 +1,10 @@
|
||||
package com.minexd.zoot.config;
|
||||
|
||||
import java.io.File;
|
||||
import org.bukkit.configuration.file.FileConfiguration;
|
||||
|
||||
public interface ConfigConversion {
|
||||
|
||||
void convert(File file, FileConfiguration fileConfiguration);
|
||||
|
||||
}
|
36
src/main/java/com/minexd/zoot/config/ConfigValidation.java
Normal file
36
src/main/java/com/minexd/zoot/config/ConfigValidation.java
Normal file
@ -0,0 +1,36 @@
|
||||
package com.minexd.zoot.config;
|
||||
|
||||
import java.io.File;
|
||||
import org.bukkit.configuration.file.FileConfiguration;
|
||||
|
||||
public class ConfigValidation {
|
||||
|
||||
private final File file;
|
||||
private final FileConfiguration fileConfiguration;
|
||||
private final int version;
|
||||
|
||||
public ConfigValidation(File file, FileConfiguration fileConfiguration, int version) {
|
||||
this.file = file;
|
||||
this.fileConfiguration = fileConfiguration;
|
||||
this.version = version;
|
||||
}
|
||||
|
||||
public void check() {
|
||||
if (fileConfiguration.contains("CONFIG_VERSION")) {
|
||||
if (fileConfiguration.getInt("CONFIG_VERSION") != version) {
|
||||
for (ConfigVersion version : ConfigVersion.values()) {
|
||||
if (fileConfiguration.getInt("CONFIG_VERSION") < version.getNumber()) {
|
||||
System.out.println("Converting current configuration into version " + version.name());
|
||||
version.getConversion().convert(file, fileConfiguration);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for (ConfigVersion version : ConfigVersion.values()) {
|
||||
System.out.println("Converting current configuration into version " + version.name());
|
||||
version.getConversion().convert(file, fileConfiguration);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
20
src/main/java/com/minexd/zoot/config/ConfigVersion.java
Normal file
20
src/main/java/com/minexd/zoot/config/ConfigVersion.java
Normal file
@ -0,0 +1,20 @@
|
||||
package com.minexd.zoot.config;
|
||||
|
||||
import com.minexd.zoot.config.impl.ConfigConversion1;
|
||||
import com.minexd.zoot.config.impl.ConfigConversion2;
|
||||
import com.minexd.zoot.config.impl.ConfigConversion3;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
@AllArgsConstructor
|
||||
@Getter
|
||||
public enum ConfigVersion {
|
||||
|
||||
VERSION_1(1, new ConfigConversion1()),
|
||||
VERSION_2(2, new ConfigConversion2()),
|
||||
VERSION_3(3, new ConfigConversion3());
|
||||
|
||||
private int number;
|
||||
private ConfigConversion conversion;
|
||||
|
||||
}
|
@ -0,0 +1,25 @@
|
||||
package com.minexd.zoot.config.impl;
|
||||
|
||||
import com.minexd.zoot.config.ConfigConversion;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import org.bukkit.configuration.file.FileConfiguration;
|
||||
|
||||
public class ConfigConversion1 implements ConfigConversion {
|
||||
|
||||
@Override
|
||||
public void convert(File file, FileConfiguration fileConfiguration) {
|
||||
fileConfiguration.set("CONFIG_VERSION", 1);
|
||||
fileConfiguration.set("CHAT.FORMAT", "%1$s&r: %2$s");
|
||||
fileConfiguration.set("CHAT.CLEAR_CHAT_BROADCAST", "&eThe chat has been cleared by &r{0}");
|
||||
fileConfiguration.set("CHAT.CLEAR_CHAT_FOR_STAFF", false);
|
||||
fileConfiguration.set("CHAT.MUTE_CHAT_BROADCAST", "&eThe chat has been {0} by &r{1}");
|
||||
|
||||
try {
|
||||
fileConfiguration.save(file);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,22 @@
|
||||
package com.minexd.zoot.config.impl;
|
||||
|
||||
import com.minexd.zoot.config.ConfigConversion;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import org.bukkit.configuration.file.FileConfiguration;
|
||||
|
||||
public class ConfigConversion2 implements ConfigConversion {
|
||||
|
||||
@Override
|
||||
public void convert(File file, FileConfiguration fileConfiguration) {
|
||||
fileConfiguration.set("CONFIG_VERSION", 2);
|
||||
fileConfiguration.set("SETTINGS.UPDATE_PLAYER_LIST_NAME", true);
|
||||
|
||||
try {
|
||||
fileConfiguration.save(file);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,30 @@
|
||||
package com.minexd.zoot.config.impl;
|
||||
|
||||
import com.minexd.zoot.config.ConfigConversion;
|
||||
import org.bukkit.configuration.file.FileConfiguration;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
|
||||
public class ConfigConversion3 implements ConfigConversion {
|
||||
|
||||
@Override
|
||||
public void convert(File file, FileConfiguration fileConfiguration) {
|
||||
fileConfiguration.set("CONFIG_VERSION", 3);
|
||||
fileConfiguration.set("CONVERSATION.SEND_MESSAGE", "&7(To &r{5}{3}&7) %MSG%");
|
||||
fileConfiguration.set("CONVERSATION.RECEIVE_MESSAGE", "&7(From &r{5}{3}&7) %MSG%");
|
||||
fileConfiguration.set("OPTIONS.GLOBAL_CHAT_ENABLED", "&eYou &aenabled &eglobal chat.");
|
||||
fileConfiguration.set("OPTIONS.GLOBAL_CHAT_DISABLED", "&eYou &cdisabled &eglobal chat.");
|
||||
fileConfiguration.set("OPTIONS.PRIVATE_MESSAGES_ENABLED", "&aYou can now receive new conversations.");
|
||||
fileConfiguration.set("OPTIONS.PRIVATE_MESSAGES_DISABLED", "&cYou can no longer receive new conversations. If you start a conversation with a player, they will be able to message you back.");
|
||||
fileConfiguration.set("OPTIONS.PRIVATE_MESSAGE_SOUNDS_ENABLED", "&eYou &aenabled &eprivate message sounds.");
|
||||
fileConfiguration.set("OPTIONS.PRIVATE_MESSAGE_SOUNDS_DISABLED", "&eYou &cdisabled &eprivate message sounds.");
|
||||
|
||||
try {
|
||||
fileConfiguration.save(file);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
88
src/main/java/com/minexd/zoot/essentials/Essentials.java
Normal file
88
src/main/java/com/minexd/zoot/essentials/Essentials.java
Normal file
@ -0,0 +1,88 @@
|
||||
package com.minexd.zoot.essentials;
|
||||
|
||||
import com.minexd.zoot.Zoot;
|
||||
import com.minexd.zoot.bootstrap.Bootstrapped;
|
||||
import com.minexd.zoot.essentials.event.SpawnTeleportEvent;
|
||||
import com.minexd.zoot.util.LocationUtil;
|
||||
import java.io.IOException;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.EntityType;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public class Essentials extends Bootstrapped {
|
||||
|
||||
private Location spawn;
|
||||
|
||||
public Essentials(Zoot zoot) {
|
||||
super(zoot);
|
||||
|
||||
spawn = LocationUtil.deserialize(zoot.getMainConfig().getStringOrDefault("ESSENTIAL.SPAWN_LOCATION", null));
|
||||
}
|
||||
|
||||
public void setSpawn(Location location) {
|
||||
spawn = location;
|
||||
|
||||
if (spawn == null) {
|
||||
zoot.getMainConfig().getConfiguration().set("ESSENTIAL.SPAWN_LOCATION", null);
|
||||
} else {
|
||||
zoot.getMainConfig().getConfiguration().set("ESSENTIAL.SPAWN_LOCATION", LocationUtil.serialize(this.spawn));
|
||||
}
|
||||
|
||||
try {
|
||||
zoot.getMainConfig().getConfiguration().save(zoot.getMainConfig().getFile());
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public void teleportToSpawn(Player player) {
|
||||
Location location = spawn == null ? zoot.getServer().getWorlds().get(0).getSpawnLocation() : spawn;
|
||||
|
||||
SpawnTeleportEvent event = new SpawnTeleportEvent(player, location);
|
||||
event.call();
|
||||
|
||||
if (!event.isCancelled() && event.getLocation() != null) {
|
||||
player.teleport(event.getLocation());
|
||||
}
|
||||
}
|
||||
|
||||
public int clearEntities(World world) {
|
||||
int removed = 0;
|
||||
|
||||
for (Entity entity : world.getEntities()) {
|
||||
if (entity.getType() == EntityType.PLAYER) {
|
||||
continue;
|
||||
}
|
||||
|
||||
removed++;
|
||||
entity.remove();
|
||||
}
|
||||
|
||||
return removed;
|
||||
}
|
||||
|
||||
public int clearEntities(World world, EntityType... excluded) {
|
||||
int removed = 0;
|
||||
|
||||
entityLoop:
|
||||
for (Entity entity : world.getEntities()) {
|
||||
for (EntityType type : excluded) {
|
||||
if (entity.getType() == EntityType.PLAYER) {
|
||||
continue entityLoop;
|
||||
}
|
||||
|
||||
if (entity.getType() == type) {
|
||||
continue entityLoop;
|
||||
}
|
||||
}
|
||||
|
||||
removed++;
|
||||
entity.remove();
|
||||
}
|
||||
|
||||
return removed;
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,52 @@
|
||||
package com.minexd.zoot.essentials;
|
||||
|
||||
import com.minexd.zoot.Zoot;
|
||||
import com.minexd.zoot.bootstrap.BootstrappedListener;
|
||||
import com.minexd.zoot.util.CC;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
|
||||
|
||||
public class EssentialsListener extends BootstrappedListener {
|
||||
|
||||
private static List<String> BLOCKED_COMMANDS = Arrays.asList(
|
||||
"//calc",
|
||||
"//eval",
|
||||
"//solve",
|
||||
"/bukkit:",
|
||||
"/me",
|
||||
"/bukkit:me",
|
||||
"/minecraft:",
|
||||
"/minecraft:me",
|
||||
"/version",
|
||||
"/ver"
|
||||
);
|
||||
|
||||
public EssentialsListener(Zoot zoot) {
|
||||
super(zoot);
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.LOWEST)
|
||||
public void onCommandProcess(PlayerCommandPreprocessEvent event) {
|
||||
Player player = event.getPlayer();
|
||||
String message = (event.getMessage().startsWith("/") ? "" : "/") + event.getMessage();
|
||||
|
||||
for (String blockedCommand : BLOCKED_COMMANDS) {
|
||||
if (message.startsWith(blockedCommand)) {
|
||||
if (message.equalsIgnoreCase("/version") || message.equalsIgnoreCase("/ver")) {
|
||||
if (event.getPlayer().isOp()) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
player.sendMessage(CC.RED + "You cannot perform this command.");
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,17 @@
|
||||
package com.minexd.zoot.essentials.command;
|
||||
|
||||
import com.minexd.zoot.util.CC;
|
||||
import com.qrakn.honcho.command.CommandMeta;
|
||||
import com.qrakn.honcho.command.CommandOption;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
||||
@CommandMeta(label = { "broadcast", "bc" }, options = "r", permission = "zoot.admin.broadcast")
|
||||
public class BroadcastCommand {
|
||||
|
||||
public void execute(CommandSender sender, CommandOption option, String broadcast) {
|
||||
String message = broadcast.replaceAll("(&([a-f0-9l-or]))", "\u00A7$2");
|
||||
Bukkit.broadcastMessage(CC.translate((option == null ? "&6[Broadcast] &r" : "") + message));
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,26 @@
|
||||
package com.minexd.zoot.essentials.command;
|
||||
|
||||
import com.minexd.zoot.util.CC;
|
||||
import com.qrakn.honcho.command.CommandMeta;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
@CommandMeta(label = { "clearinv", "clear", "ci" }, permission = "zoot.admin.clearinv")
|
||||
public class ClearCommand {
|
||||
|
||||
public void execute(Player player) {
|
||||
player.getInventory().setContents(new ItemStack[36]);
|
||||
player.getInventory().setArmorContents(new ItemStack[4]);
|
||||
player.updateInventory();
|
||||
player.sendMessage(CC.GOLD + "You cleared your inventory.");
|
||||
}
|
||||
|
||||
public void execute(CommandSender sender, Player player) {
|
||||
player.getInventory().setContents(new ItemStack[36]);
|
||||
player.getInventory().setArmorContents(new ItemStack[4]);
|
||||
player.updateInventory();
|
||||
player.sendMessage(CC.GOLD + "Your inventory has been cleared by " + sender.getName());
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,15 @@
|
||||
package com.minexd.zoot.essentials.command;
|
||||
|
||||
import com.minexd.zoot.util.CC;
|
||||
import com.qrakn.honcho.command.CommandMeta;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@CommandMeta(label = "day")
|
||||
public class DayCommand {
|
||||
|
||||
public void execute(Player player) {
|
||||
player.setPlayerTime(6000L, false);
|
||||
player.sendMessage(CC.GREEN + "It's now day time.");
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,40 @@
|
||||
package com.minexd.zoot.essentials.command;
|
||||
|
||||
import com.minexd.zoot.Locale;
|
||||
import com.minexd.zoot.util.CC;
|
||||
import com.qrakn.honcho.command.CommandMeta;
|
||||
import org.bukkit.GameMode;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@CommandMeta(label = { "gamemode", "gm" }, permission = "zoot.admin.gamemode")
|
||||
public class GameModeCommand {
|
||||
|
||||
public void execute(Player player, GameMode gameMode) {
|
||||
if (gameMode == null) {
|
||||
player.sendMessage(CC.RED + "That game mode is not valid.");
|
||||
return;
|
||||
}
|
||||
|
||||
player.setGameMode(gameMode);
|
||||
player.updateInventory();
|
||||
player.sendMessage(CC.GOLD + "You updated your game mode.");
|
||||
}
|
||||
|
||||
public void execute(CommandSender sender, Player target, GameMode gameMode) {
|
||||
if (target == null) {
|
||||
sender.sendMessage(Locale.PLAYER_NOT_FOUND.format());
|
||||
return;
|
||||
}
|
||||
|
||||
if (gameMode == null) {
|
||||
sender.sendMessage(CC.RED + "That game mode is not valid.");
|
||||
return;
|
||||
}
|
||||
|
||||
target.setGameMode(gameMode);
|
||||
target.updateInventory();
|
||||
target.sendMessage(CC.GOLD + "Your game mode has been updated by " + sender.getName());
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,33 @@
|
||||
package com.minexd.zoot.essentials.command;
|
||||
|
||||
import com.minexd.zoot.Locale;
|
||||
import com.minexd.zoot.util.CC;
|
||||
import com.qrakn.honcho.command.CommandMeta;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@CommandMeta(label = "heal", permission = "zoot.admin.heal")
|
||||
public class HealCommand {
|
||||
|
||||
public void execute(Player player) {
|
||||
player.setHealth(20.0);
|
||||
player.setFoodLevel(20);
|
||||
player.setSaturation(5.0F);
|
||||
player.updateInventory();
|
||||
player.sendMessage(CC.GOLD + "You healed yourself.");
|
||||
}
|
||||
|
||||
public void execute(CommandSender sender, Player player) {
|
||||
if (player == null) {
|
||||
sender.sendMessage(Locale.PLAYER_NOT_FOUND.format());
|
||||
return;
|
||||
}
|
||||
|
||||
player.setHealth(20.0);
|
||||
player.setFoodLevel(20);
|
||||
player.setSaturation(5.0F);
|
||||
player.updateInventory();
|
||||
player.sendMessage(CC.GOLD + "You have been healed by " + sender.getName());
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,13 @@
|
||||
package com.minexd.zoot.essentials.command;
|
||||
|
||||
import com.qrakn.honcho.command.CommandMeta;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@CommandMeta(label = "hideplayer", permission = "zoot.admin.hideplayer")
|
||||
public class HidePlayerCommand {
|
||||
|
||||
public void execute(Player player, Player target) {
|
||||
player.hidePlayer(target);
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,53 @@
|
||||
package com.minexd.zoot.essentials.command;
|
||||
|
||||
import com.minexd.zoot.ZootAPI;
|
||||
import com.minexd.zoot.profile.Profile;
|
||||
import com.minexd.zoot.rank.Rank;
|
||||
import com.qrakn.honcho.command.CommandMeta;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
@CommandMeta(label = "list")
|
||||
public class ListCommand {
|
||||
|
||||
public void executue(Player sender) {
|
||||
List<Player> sortedPlayers = new ArrayList<>(Bukkit.getOnlinePlayers());
|
||||
sortedPlayers.sort(new Comparator<Player>() {
|
||||
@Override
|
||||
public int compare(Player o1, Player o2) {
|
||||
Profile p1 = Profile.getByUuid(o1.getUniqueId());
|
||||
Profile p2 = Profile.getByUuid(o2.getUniqueId());
|
||||
return p2.getActiveRank().getWeight() - p1.getActiveRank().getWeight();
|
||||
}
|
||||
});
|
||||
|
||||
List<String> playerNames = new ArrayList<>();
|
||||
|
||||
for (Player player : sortedPlayers) {
|
||||
playerNames.add(ZootAPI.getColoredName(player));
|
||||
}
|
||||
|
||||
List<Rank> sortedRanks = new ArrayList<>(Rank.getRanks().values());
|
||||
sortedRanks.sort(new Comparator<Rank>() {
|
||||
@Override
|
||||
public int compare(Rank o1, Rank o2) {
|
||||
return o2.getWeight() - o1.getWeight();
|
||||
}
|
||||
});
|
||||
|
||||
List<String> rankNames = new ArrayList<>();
|
||||
|
||||
for (Rank rank : sortedRanks) {
|
||||
rankNames.add(rank.getColor() + rank.getDisplayName());
|
||||
}
|
||||
|
||||
sender.sendMessage(StringUtils.join(rankNames, ChatColor.WHITE + ", "));
|
||||
sender.sendMessage("(" + Bukkit.getOnlinePlayers().size() + "/" + Bukkit.getMaxPlayers() + "): " +
|
||||
StringUtils.join(playerNames, ChatColor.WHITE + ", "));
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,15 @@
|
||||
package com.minexd.zoot.essentials.command;
|
||||
|
||||
import com.minexd.zoot.util.LocationUtil;
|
||||
import com.qrakn.honcho.command.CommandMeta;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@CommandMeta(label = "loc", permission = "zoot.admin.loc")
|
||||
public class LocationCommand {
|
||||
|
||||
public void execute(Player player) {
|
||||
player.sendMessage(LocationUtil.serialize(player.getLocation()));
|
||||
System.out.println(LocationUtil.serialize(player.getLocation()));
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,21 @@
|
||||
package com.minexd.zoot.essentials.command;
|
||||
|
||||
import com.minexd.zoot.util.CC;
|
||||
import com.qrakn.honcho.command.CommandMeta;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@CommandMeta(label = "more", permission = "zoot.admin.more")
|
||||
public class MoreCommand {
|
||||
|
||||
public void execute(Player player) {
|
||||
if (player.getItemInHand() == null) {
|
||||
player.sendMessage(CC.RED + "There is nothing in your hand.");
|
||||
return;
|
||||
}
|
||||
|
||||
player.getItemInHand().setAmount(64);
|
||||
player.updateInventory();
|
||||
player.sendMessage(CC.GREEN + "You gave yourself more of the item in your hand.");
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,15 @@
|
||||
package com.minexd.zoot.essentials.command;
|
||||
|
||||
import com.minexd.zoot.util.CC;
|
||||
import com.qrakn.honcho.command.CommandMeta;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@CommandMeta(label = "night")
|
||||
public class NightCommand {
|
||||
|
||||
public void execute(Player player) {
|
||||
player.setPlayerTime(18000L, false);
|
||||
player.sendMessage(CC.GREEN + "It's now night time.");
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,37 @@
|
||||
package com.minexd.zoot.essentials.command;
|
||||
|
||||
import com.minexd.zoot.ZootAPI;
|
||||
import com.minexd.zoot.util.BukkitReflection;
|
||||
import com.minexd.zoot.util.CC;
|
||||
import com.qrakn.honcho.command.CommandMeta;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@CommandMeta(label = "ping")
|
||||
public class PingCommand {
|
||||
|
||||
public void execute(Player player) {
|
||||
player.sendMessage(CC.YELLOW + "Your Ping: " + colorPing(BukkitReflection.getPing(player)));
|
||||
}
|
||||
|
||||
public void execute(Player player, Player target) {
|
||||
if (target == null) {
|
||||
player.sendMessage(CC.RED + "A player with that name could not be found.");
|
||||
} else {
|
||||
player.sendMessage(ZootAPI.getColoredName(target) + CC.YELLOW + "'s Ping: " +
|
||||
colorPing(BukkitReflection.getPing(target)));
|
||||
}
|
||||
}
|
||||
|
||||
private String colorPing(int ping) {
|
||||
if (ping <= 40) {
|
||||
return CC.GREEN + ping;
|
||||
} else if (ping <= 70) {
|
||||
return CC.YELLOW + ping;
|
||||
} else if (ping <= 100) {
|
||||
return CC.GOLD + ping;
|
||||
} else {
|
||||
return CC.RED + ping;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,26 @@
|
||||
package com.minexd.zoot.essentials.command;
|
||||
|
||||
import com.minexd.zoot.util.CC;
|
||||
import com.qrakn.honcho.command.CommandMeta;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
|
||||
@CommandMeta(label = "rename", permission = "zoot.staff.rename")
|
||||
public class RenameCommand {
|
||||
|
||||
public void execute(Player player, String name) {
|
||||
if (player.getItemInHand() != null) {
|
||||
ItemStack itemStack = player.getItemInHand();
|
||||
ItemMeta itemMeta = itemStack.getItemMeta();
|
||||
itemMeta.setDisplayName(CC.translate(name));
|
||||
itemStack.setItemMeta(itemMeta);
|
||||
|
||||
player.updateInventory();
|
||||
player.sendMessage(CC.GREEN + "You renamed the item in your hand.");
|
||||
} else {
|
||||
player.sendMessage(CC.RED + "There is nothing in your hand.");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,17 @@
|
||||
package com.minexd.zoot.essentials.command;
|
||||
|
||||
import com.minexd.zoot.Zoot;
|
||||
import com.minexd.zoot.util.BukkitReflection;
|
||||
import com.minexd.zoot.util.CC;
|
||||
import com.qrakn.honcho.command.CommandMeta;
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
||||
@CommandMeta(label = "setslots", async = true, permission = "zoot.admin.setslots")
|
||||
public class SetSlotsCommand {
|
||||
|
||||
public void execute(CommandSender sender, int slots) {
|
||||
BukkitReflection.setMaxPlayers(Zoot.get().getServer(), slots);
|
||||
sender.sendMessage(CC.GOLD + "You set the max slots to " + slots + ".");
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,16 @@
|
||||
package com.minexd.zoot.essentials.command;
|
||||
|
||||
import com.minexd.zoot.Zoot;
|
||||
import com.minexd.zoot.util.CC;
|
||||
import com.qrakn.honcho.command.CommandMeta;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@CommandMeta(label = "setspawn", permission = "zoot.admin.setspawn")
|
||||
public class SetSpawnCommand {
|
||||
|
||||
public void execute(Player player) {
|
||||
Zoot.get().getEssentials().setSpawn(player.getLocation());
|
||||
player.sendMessage(CC.GREEN + "You updated this world's spawn.");
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,13 @@
|
||||
package com.minexd.zoot.essentials.command;
|
||||
|
||||
import com.qrakn.honcho.command.CommandMeta;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@CommandMeta(label = "showplayer", permission = "zoot.admin.showplayer")
|
||||
public class ShowPlayerCommand {
|
||||
|
||||
public void execute(Player player, Player target) {
|
||||
player.showPlayer(target);
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,16 @@
|
||||
package com.minexd.zoot.essentials.command;
|
||||
|
||||
import com.minexd.zoot.Zoot;
|
||||
import com.minexd.zoot.util.CC;
|
||||
import com.qrakn.honcho.command.CommandMeta;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@CommandMeta(label = "spawn", permission = "zoot.staff.spawn")
|
||||
public class SpawnCommand {
|
||||
|
||||
public void execute(Player player) {
|
||||
Zoot.get().getEssentials().teleportToSpawn(player);
|
||||
player.sendMessage(CC.GREEN + "You teleported to this world's spawn.");
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,15 @@
|
||||
package com.minexd.zoot.essentials.command;
|
||||
|
||||
import com.minexd.zoot.util.CC;
|
||||
import com.qrakn.honcho.command.CommandMeta;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@CommandMeta(label = "sunset")
|
||||
public class SunsetCommand {
|
||||
|
||||
public void execute(Player player) {
|
||||
player.setPlayerTime(12000, false);
|
||||
player.sendMessage(CC.GREEN + "It's now sunset.");
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,29 @@
|
||||
package com.minexd.zoot.essentials.command;
|
||||
|
||||
import com.minexd.zoot.util.CC;
|
||||
import com.qrakn.honcho.command.CommandMeta;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.WorldCreator;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@CommandMeta(label = "tpworld", permission = "zoot.admin.tpworld")
|
||||
public class TeleportWorldCommand {
|
||||
|
||||
public void execute(Player player, String worldName) {
|
||||
World world = Bukkit.getWorld(worldName);
|
||||
|
||||
if (world == null) {
|
||||
world = Bukkit.createWorld(new WorldCreator(worldName));
|
||||
player.sendMessage(CC.GOLD + "Generating new world \"" + worldName + "\"");
|
||||
}
|
||||
|
||||
if (world == null) {
|
||||
player.sendMessage(CC.RED + "A world with that name does not exist.");
|
||||
} else {
|
||||
player.teleport(world.getSpawnLocation());
|
||||
player.sendMessage(CC.GOLD + "Teleported you to " + world.getName());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,15 @@
|
||||
package com.minexd.zoot.essentials.command;
|
||||
|
||||
import com.minexd.zoot.Zoot;
|
||||
import com.qrakn.honcho.command.CommandMeta;
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
||||
@CommandMeta(label = "zoot debug", permission = "zoot.admin")
|
||||
public class ZootDebugCommand {
|
||||
|
||||
public void execute(CommandSender sender) {
|
||||
Zoot.get().setDebug(!Zoot.get().isDebug());
|
||||
sender.sendMessage("Debug: " + Zoot.get().isDebug());
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,21 @@
|
||||
package com.minexd.zoot.essentials.event;
|
||||
|
||||
import com.minexd.zoot.util.BaseEvent;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.Cancellable;
|
||||
|
||||
public class SpawnTeleportEvent extends BaseEvent implements Cancellable {
|
||||
|
||||
@Getter private final Player player;
|
||||
@Getter @Setter private Location location;
|
||||
@Getter @Setter private boolean cancelled;
|
||||
|
||||
public SpawnTeleportEvent(Player player, Location location) {
|
||||
this.player = player;
|
||||
this.location = location;
|
||||
}
|
||||
|
||||
}
|
150
src/main/java/com/minexd/zoot/network/NetworkPacketListener.java
Normal file
150
src/main/java/com/minexd/zoot/network/NetworkPacketListener.java
Normal file
@ -0,0 +1,150 @@
|
||||
package com.minexd.zoot.network;
|
||||
|
||||
import com.minexd.zoot.pidgin.packet.handler.IncomingPacketHandler;
|
||||
import com.minexd.zoot.pidgin.packet.listener.PacketListener;
|
||||
import com.minexd.zoot.Locale;
|
||||
import com.minexd.zoot.Zoot;
|
||||
import com.minexd.zoot.network.event.ReceiveStaffChatEvent;
|
||||
import com.minexd.zoot.network.packet.PacketAddGrant;
|
||||
import com.minexd.zoot.network.packet.PacketBroadcastPunishment;
|
||||
import com.minexd.zoot.network.packet.PacketDeleteGrant;
|
||||
import com.minexd.zoot.network.packet.PacketDeleteRank;
|
||||
import com.minexd.zoot.network.packet.PacketRefreshRank;
|
||||
import com.minexd.zoot.network.packet.PacketStaffChat;
|
||||
import com.minexd.zoot.network.packet.PacketStaffJoinNetwork;
|
||||
import com.minexd.zoot.network.packet.PacketStaffLeaveNetwork;
|
||||
import com.minexd.zoot.network.packet.PacketStaffSwitchServer;
|
||||
import com.minexd.zoot.profile.Profile;
|
||||
import com.minexd.zoot.profile.grant.Grant;
|
||||
import com.minexd.zoot.profile.grant.event.GrantAppliedEvent;
|
||||
import com.minexd.zoot.profile.grant.event.GrantExpireEvent;
|
||||
import com.minexd.zoot.profile.punishment.Punishment;
|
||||
import com.minexd.zoot.rank.Rank;
|
||||
import java.util.Objects;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.scheduler.BukkitRunnable;
|
||||
|
||||
public class NetworkPacketListener implements PacketListener {
|
||||
|
||||
private Zoot zoot;
|
||||
|
||||
public NetworkPacketListener(Zoot zoot) {
|
||||
this.zoot = zoot;
|
||||
}
|
||||
|
||||
@IncomingPacketHandler
|
||||
public void onAddGrant(PacketAddGrant packet) {
|
||||
Player player = Bukkit.getPlayer(packet.getPlayerUuid());
|
||||
Grant grant = packet.getGrant();
|
||||
|
||||
if (player != null) {
|
||||
Profile profile = Profile.getProfiles().get(player.getUniqueId());
|
||||
profile.getGrants().removeIf(other -> Objects.equals(other, grant));
|
||||
profile.getGrants().add(grant);
|
||||
|
||||
new GrantAppliedEvent(player, grant);
|
||||
}
|
||||
}
|
||||
|
||||
@IncomingPacketHandler
|
||||
public void onDeleteGrant(PacketDeleteGrant packet) {
|
||||
Player player = Bukkit.getPlayer(packet.getPlayerUuid());
|
||||
Grant grant = packet.getGrant();
|
||||
|
||||
if (player != null) {
|
||||
Profile profile = Profile.getProfiles().get(player.getUniqueId());
|
||||
profile.getGrants().removeIf(other -> Objects.equals(other, grant));
|
||||
profile.getGrants().add(grant);
|
||||
|
||||
new GrantExpireEvent(player, grant);
|
||||
}
|
||||
}
|
||||
|
||||
@IncomingPacketHandler
|
||||
public void onBroadcastPunishment(PacketBroadcastPunishment packet) {
|
||||
Punishment punishment = packet.getPunishment();
|
||||
punishment.broadcast(packet.getStaff(), packet.getTarget(), packet.isSilent());
|
||||
|
||||
Player player = Bukkit.getPlayer(packet.getTargetUuid());
|
||||
|
||||
if (player != null) {
|
||||
Profile profile = Profile.getProfiles().get(player.getUniqueId());
|
||||
profile.getPunishments().removeIf(other -> Objects.equals(other, punishment));
|
||||
profile.getPunishments().add(punishment);
|
||||
|
||||
if (punishment.getType().isBan()) {
|
||||
new BukkitRunnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
player.kickPlayer(punishment.getKickMessage());
|
||||
}
|
||||
}.runTask(Zoot.get());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@IncomingPacketHandler
|
||||
public void onRankRefresh(PacketRefreshRank packet) {
|
||||
Rank rank = Rank.getRankByUuid(packet.getUuid());
|
||||
|
||||
if (rank == null) {
|
||||
rank = new Rank(packet.getUuid(), packet.getName());
|
||||
}
|
||||
|
||||
rank.load();
|
||||
|
||||
Zoot.broadcastOps(Locale.NETWORK_RANK_REFRESHED.format(Locale.NETWORK_BROADCAST_PREFIX.format(),
|
||||
rank.getDisplayName()));
|
||||
}
|
||||
|
||||
@IncomingPacketHandler
|
||||
public void onRankDelete(PacketDeleteRank packet) {
|
||||
Rank rank = Rank.getRanks().remove(packet.getUuid());
|
||||
|
||||
if (rank != null) {
|
||||
Zoot.broadcastOps(Locale.NETWORK_RANK_DELETED.format(Locale.NETWORK_BROADCAST_PREFIX.format(),
|
||||
rank.getDisplayName()));
|
||||
}
|
||||
}
|
||||
|
||||
@IncomingPacketHandler
|
||||
public void onStaffChat(PacketStaffChat packet) {
|
||||
zoot.getServer().getOnlinePlayers().stream()
|
||||
.filter(onlinePlayer -> onlinePlayer.hasPermission("zoot.staff"))
|
||||
.forEach(onlinePlayer -> {
|
||||
ReceiveStaffChatEvent event = new ReceiveStaffChatEvent(onlinePlayer);
|
||||
|
||||
zoot.getServer().getPluginManager().callEvent(event);
|
||||
|
||||
if (!event.isCancelled()) {
|
||||
Profile profile = Profile.getProfiles().get(event.getPlayer().getUniqueId());
|
||||
|
||||
if (profile != null && profile.getStaffOptions().staffModeEnabled()) {
|
||||
onlinePlayer.sendMessage(Locale.STAFF_CHAT.format(Locale.STAFF_BROADCAST_PREFIX.format(),
|
||||
packet.getPlayerName(), packet.getServerName(), packet.getChatMessage()
|
||||
));
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@IncomingPacketHandler
|
||||
public void onStaffJoinNetwork(PacketStaffJoinNetwork packet) {
|
||||
zoot.getServer().broadcast(Locale.STAFF_JOIN_NETWORK.format(Locale.STAFF_BROADCAST_PREFIX.format(),
|
||||
packet.getPlayerName(), packet.getServerName()), "zoot.staff");
|
||||
}
|
||||
|
||||
@IncomingPacketHandler
|
||||
public void onStaffLeaveNetwork(PacketStaffLeaveNetwork packet) {
|
||||
zoot.getServer().broadcast(Locale.STAFF_LEAVE_NETWORK.format(Locale.STAFF_BROADCAST_PREFIX.format(),
|
||||
packet.getPlayerName()), "zoot.staff");
|
||||
}
|
||||
|
||||
@IncomingPacketHandler
|
||||
public void onStaffSwitchServer(PacketStaffSwitchServer packet) {
|
||||
zoot.getServer().broadcast(Locale.STAFF_SWITCH_SERVER.format(Locale.STAFF_BROADCAST_PREFIX.format(),
|
||||
packet.getPlayerName(), packet.getToServerName(), packet.getFromServerName()), "zoot.staff");
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,18 @@
|
||||
package com.minexd.zoot.network.event;
|
||||
|
||||
import com.minexd.zoot.util.BaseEvent;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.Cancellable;
|
||||
|
||||
public class ReceiveStaffChatEvent extends BaseEvent implements Cancellable {
|
||||
|
||||
@Getter private Player player;
|
||||
@Getter @Setter private boolean cancelled;
|
||||
|
||||
public ReceiveStaffChatEvent(Player player) {
|
||||
this.player = player;
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,43 @@
|
||||
package com.minexd.zoot.network.packet;
|
||||
|
||||
import com.google.gson.JsonObject;
|
||||
import com.minexd.zoot.pidgin.packet.Packet;
|
||||
import com.minexd.zoot.profile.grant.Grant;
|
||||
import com.minexd.zoot.util.json.JsonChain;
|
||||
import java.util.UUID;
|
||||
import lombok.Getter;
|
||||
|
||||
public class PacketAddGrant implements Packet {
|
||||
|
||||
@Getter private UUID playerUuid;
|
||||
@Getter private Grant grant;
|
||||
|
||||
public PacketAddGrant() {
|
||||
|
||||
}
|
||||
|
||||
public PacketAddGrant(UUID playerUuid, Grant grant) {
|
||||
this.playerUuid = playerUuid;
|
||||
this.grant = grant;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int id() {
|
||||
return 1;
|
||||
}
|
||||
|
||||
@Override
|
||||
public JsonObject serialize() {
|
||||
return new JsonChain()
|
||||
.addProperty("playerUuid", playerUuid.toString())
|
||||
.add("grant", Grant.SERIALIZER.serialize(grant))
|
||||
.get();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deserialize(JsonObject jsonObject) {
|
||||
playerUuid = UUID.fromString(jsonObject.get("playerUuid").getAsString());
|
||||
grant = Grant.DESERIALIZER.deserialize(jsonObject.get("grant").getAsJsonObject());
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,55 @@
|
||||
package com.minexd.zoot.network.packet;
|
||||
|
||||
import com.google.gson.JsonObject;
|
||||
import com.minexd.zoot.pidgin.packet.Packet;
|
||||
import com.minexd.zoot.profile.punishment.Punishment;
|
||||
import com.minexd.zoot.util.json.JsonChain;
|
||||
import java.util.UUID;
|
||||
import lombok.Getter;
|
||||
|
||||
public class PacketBroadcastPunishment implements Packet {
|
||||
|
||||
@Getter private Punishment punishment;
|
||||
@Getter private String staff;
|
||||
@Getter private String target;
|
||||
@Getter private UUID targetUuid;
|
||||
@Getter private boolean silent;
|
||||
|
||||
public PacketBroadcastPunishment() {
|
||||
|
||||
}
|
||||
|
||||
public PacketBroadcastPunishment(Punishment punishment, String staff, String target, UUID targetUuid, boolean silent) {
|
||||
this.punishment = punishment;
|
||||
this.staff = staff;
|
||||
this.target = target;
|
||||
this.targetUuid = targetUuid;
|
||||
this.silent = silent;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int id() {
|
||||
return 2;
|
||||
}
|
||||
|
||||
@Override
|
||||
public JsonObject serialize() {
|
||||
return new JsonChain()
|
||||
.add("punishment", Punishment.SERIALIZER.serialize(punishment))
|
||||
.addProperty("staff", staff)
|
||||
.addProperty("target", target)
|
||||
.addProperty("targetUuid", targetUuid.toString())
|
||||
.addProperty("silent", silent)
|
||||
.get();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deserialize(JsonObject object) {
|
||||
punishment = Punishment.DESERIALIZER.deserialize(object.get("punishment").getAsJsonObject());
|
||||
staff = object.get("staff").getAsString();
|
||||
target = object.get("target").getAsString();
|
||||
targetUuid = UUID.fromString(object.get("targetUuid").getAsString());
|
||||
silent = object.get("silent").getAsBoolean();
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,43 @@
|
||||
package com.minexd.zoot.network.packet;
|
||||
|
||||
import com.google.gson.JsonObject;
|
||||
import com.minexd.zoot.pidgin.packet.Packet;
|
||||
import com.minexd.zoot.profile.grant.Grant;
|
||||
import com.minexd.zoot.util.json.JsonChain;
|
||||
import java.util.UUID;
|
||||
import lombok.Getter;
|
||||
|
||||
public class PacketDeleteGrant implements Packet {
|
||||
|
||||
@Getter private UUID playerUuid;
|
||||
@Getter private Grant grant;
|
||||
|
||||
public PacketDeleteGrant() {
|
||||
|
||||
}
|
||||
|
||||
public PacketDeleteGrant(UUID playerUuid, Grant grant) {
|
||||
this.playerUuid = playerUuid;
|
||||
this.grant = grant;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int id() {
|
||||
return 3;
|
||||
}
|
||||
|
||||
@Override
|
||||
public JsonObject serialize() {
|
||||
return new JsonChain()
|
||||
.addProperty("playerUuid", playerUuid.toString())
|
||||
.add("grant", Grant.SERIALIZER.serialize(grant))
|
||||
.get();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deserialize(JsonObject jsonObject) {
|
||||
playerUuid = UUID.fromString(jsonObject.get("playerUuid").getAsString());
|
||||
grant = Grant.DESERIALIZER.deserialize(jsonObject.get("grant").getAsJsonObject());
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,37 @@
|
||||
package com.minexd.zoot.network.packet;
|
||||
|
||||
import com.google.gson.JsonObject;
|
||||
import com.minexd.zoot.pidgin.packet.Packet;
|
||||
import com.minexd.zoot.util.json.JsonChain;
|
||||
import java.util.UUID;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
@AllArgsConstructor
|
||||
@Getter
|
||||
public class PacketDeleteRank implements Packet {
|
||||
|
||||
private UUID uuid;
|
||||
|
||||
public PacketDeleteRank() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public int id() {
|
||||
return 4;
|
||||
}
|
||||
|
||||
@Override
|
||||
public JsonObject serialize() {
|
||||
return new JsonChain()
|
||||
.addProperty("uuid", uuid.toString())
|
||||
.get();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deserialize(JsonObject jsonObject) {
|
||||
uuid = UUID.fromString(jsonObject.get("uuid").getAsString());
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,40 @@
|
||||
package com.minexd.zoot.network.packet;
|
||||
|
||||
import com.google.gson.JsonObject;
|
||||
import com.minexd.zoot.pidgin.packet.Packet;
|
||||
import com.minexd.zoot.util.json.JsonChain;
|
||||
import java.util.UUID;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
@AllArgsConstructor
|
||||
@Getter
|
||||
public class PacketRefreshRank implements Packet {
|
||||
|
||||
private UUID uuid;
|
||||
private String name;
|
||||
|
||||
public PacketRefreshRank() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public int id() {
|
||||
return 5;
|
||||
}
|
||||
|
||||
@Override
|
||||
public JsonObject serialize() {
|
||||
return new JsonChain()
|
||||
.addProperty("uuid", uuid.toString())
|
||||
.addProperty("name", name)
|
||||
.get();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deserialize(JsonObject jsonObject) {
|
||||
uuid = UUID.fromString(jsonObject.get("uuid").getAsString());
|
||||
name = jsonObject.get("name").getAsString();
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,48 @@
|
||||
package com.minexd.zoot.network.packet;
|
||||
|
||||
import com.google.gson.JsonObject;
|
||||
|
||||
import com.minexd.zoot.pidgin.packet.Packet;
|
||||
import com.minexd.zoot.util.json.JsonChain;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
public class PacketStaffChat implements Packet {
|
||||
|
||||
private String playerName;
|
||||
private String serverName;
|
||||
private String chatMessage;
|
||||
|
||||
public PacketStaffChat() {
|
||||
|
||||
}
|
||||
|
||||
public PacketStaffChat(String playerName, String serverName, String chatMessage) {
|
||||
this.playerName = playerName;
|
||||
this.serverName = serverName;
|
||||
this.chatMessage = chatMessage;
|
||||
}
|
||||
|
||||
public int id() {
|
||||
return 6;
|
||||
}
|
||||
|
||||
@Override
|
||||
public JsonObject serialize() {
|
||||
return new JsonChain()
|
||||
.addProperty("playerName", playerName)
|
||||
.addProperty("serverName", serverName)
|
||||
.addProperty("chatMessage", chatMessage)
|
||||
.get();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deserialize(JsonObject jsonObject) {
|
||||
playerName = jsonObject.get("playerName").getAsString();
|
||||
serverName = jsonObject.get("serverName").getAsString();
|
||||
chatMessage = jsonObject.get("chatMessage").getAsString();
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,42 @@
|
||||
package com.minexd.zoot.network.packet;
|
||||
|
||||
import com.google.gson.JsonObject;
|
||||
import com.minexd.zoot.pidgin.packet.Packet;
|
||||
import com.minexd.zoot.util.json.JsonChain;
|
||||
import lombok.Getter;
|
||||
|
||||
@Getter
|
||||
public class PacketStaffJoinNetwork implements Packet {
|
||||
|
||||
private String playerName;
|
||||
private String serverName;
|
||||
|
||||
public PacketStaffJoinNetwork() {
|
||||
|
||||
}
|
||||
|
||||
public PacketStaffJoinNetwork(String playerName, String serverName) {
|
||||
this.playerName = playerName;
|
||||
this.serverName = serverName;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int id() {
|
||||
return 7;
|
||||
}
|
||||
|
||||
@Override
|
||||
public JsonObject serialize() {
|
||||
return new JsonChain()
|
||||
.addProperty("playerName", playerName)
|
||||
.addProperty("serverName", serverName)
|
||||
.get();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deserialize(JsonObject jsonObject) {
|
||||
playerName = jsonObject.get("playerName").getAsString();
|
||||
serverName = jsonObject.get("serverName").getAsString();
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,42 @@
|
||||
package com.minexd.zoot.network.packet;
|
||||
|
||||
import com.google.gson.JsonObject;
|
||||
import com.minexd.zoot.pidgin.packet.Packet;
|
||||
import com.minexd.zoot.util.json.JsonChain;
|
||||
import lombok.Getter;
|
||||
|
||||
@Getter
|
||||
public class PacketStaffLeaveNetwork implements Packet {
|
||||
|
||||
private String playerName;
|
||||
private String serverName;
|
||||
|
||||
public PacketStaffLeaveNetwork() {
|
||||
|
||||
}
|
||||
|
||||
public PacketStaffLeaveNetwork(String playerName, String serverName) {
|
||||
this.playerName = playerName;
|
||||
this.serverName = serverName;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int id() {
|
||||
return 8;
|
||||
}
|
||||
|
||||
@Override
|
||||
public JsonObject serialize() {
|
||||
return new JsonChain()
|
||||
.addProperty("playerName", playerName)
|
||||
.addProperty("serverName", serverName)
|
||||
.get();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deserialize(JsonObject jsonObject) {
|
||||
playerName = jsonObject.get("playerName").getAsString();
|
||||
serverName = jsonObject.get("serverName").getAsString();
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,46 @@
|
||||
package com.minexd.zoot.network.packet;
|
||||
|
||||
import com.google.gson.JsonObject;
|
||||
import com.minexd.zoot.pidgin.packet.Packet;
|
||||
import com.minexd.zoot.util.json.JsonChain;
|
||||
import lombok.Getter;
|
||||
|
||||
@Getter
|
||||
public class PacketStaffSwitchServer implements Packet {
|
||||
|
||||
private String playerName;
|
||||
private String fromServerName;
|
||||
private String toServerName;
|
||||
|
||||
public PacketStaffSwitchServer() {
|
||||
|
||||
}
|
||||
|
||||
public PacketStaffSwitchServer(String playerName, String fromServerName, String toServerName) {
|
||||
this.playerName = playerName;
|
||||
this.fromServerName = fromServerName;
|
||||
this.toServerName = toServerName;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int id() {
|
||||
return 9;
|
||||
}
|
||||
|
||||
@Override
|
||||
public JsonObject serialize() {
|
||||
return new JsonChain()
|
||||
.addProperty("playerName", playerName)
|
||||
.addProperty("fromServerName", fromServerName)
|
||||
.addProperty("toServerName", toServerName)
|
||||
.get();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deserialize(JsonObject jsonObject) {
|
||||
playerName = jsonObject.get("playerName").getAsString();
|
||||
fromServerName = jsonObject.get("fromServerName").getAsString();
|
||||
toServerName = jsonObject.get("toServerName").getAsString();
|
||||
}
|
||||
|
||||
}
|
184
src/main/java/com/minexd/zoot/pidgin/Pidgin.java
Normal file
184
src/main/java/com/minexd/zoot/pidgin/Pidgin.java
Normal file
@ -0,0 +1,184 @@
|
||||
package com.minexd.zoot.pidgin;
|
||||
|
||||
import com.google.gson.JsonObject;
|
||||
import com.google.gson.JsonParser;
|
||||
import com.minexd.zoot.Zoot;
|
||||
import com.minexd.zoot.pidgin.packet.Packet;
|
||||
import com.minexd.zoot.pidgin.packet.handler.IncomingPacketHandler;
|
||||
import com.minexd.zoot.pidgin.packet.handler.PacketExceptionHandler;
|
||||
import com.minexd.zoot.pidgin.packet.listener.PacketListener;
|
||||
import com.minexd.zoot.pidgin.packet.listener.PacketListenerData;
|
||||
import redis.clients.jedis.Jedis;
|
||||
import redis.clients.jedis.JedisPool;
|
||||
import redis.clients.jedis.JedisPubSub;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ForkJoinPool;
|
||||
|
||||
public class Pidgin {
|
||||
|
||||
private static JsonParser PARSER = new JsonParser();
|
||||
|
||||
private final String channel;
|
||||
private JedisPool jedisPool;
|
||||
private JedisPubSub jedisPubSub;
|
||||
private List<PacketListenerData> packetListeners = new ArrayList<>();
|
||||
private Map<Integer, Class> idToType = new HashMap<>();
|
||||
private Map<Class, Integer> typeToId = new HashMap<>();
|
||||
|
||||
public Pidgin(String channel, String host, int port, String password) {
|
||||
this.channel = channel;
|
||||
this.packetListeners = new ArrayList<>();
|
||||
|
||||
this.jedisPool = new JedisPool(host, port);
|
||||
|
||||
if (password != null && !password.equals("")) {
|
||||
try (Jedis jedis = this.jedisPool.getResource()) {
|
||||
jedis.auth(password);
|
||||
System.out.println("[Pidgin] Authenticating..");
|
||||
}
|
||||
}
|
||||
|
||||
this.setupPubSub();
|
||||
}
|
||||
|
||||
public void sendPacket(Packet packet) {
|
||||
sendPacket(packet, null);
|
||||
}
|
||||
|
||||
public void sendPacket(Packet packet, PacketExceptionHandler exceptionHandler) {
|
||||
try {
|
||||
|
||||
final JsonObject object = packet.serialize();
|
||||
|
||||
if (object == null) {
|
||||
throw new IllegalStateException("Packet cannot generate null serialized data");
|
||||
}
|
||||
|
||||
try (Jedis jedis = this.jedisPool.getResource()) {
|
||||
|
||||
System.out.println("[Pidgin] Attempting to publish packet..");
|
||||
|
||||
try {
|
||||
|
||||
if (Zoot.get().getMainConfig().getBoolean("REDIS.AUTHENTICATION.ENABLED")) {
|
||||
jedis.auth(Zoot.get().getMainConfig().getString("REDIS.AUTHENTICATION.PASSWORD"));
|
||||
}
|
||||
|
||||
jedis.publish(this.channel, packet.id() + ";" + object.toString());
|
||||
System.out.println("[Pidgin] Successfully published packet..");
|
||||
|
||||
} catch (Exception ex) {
|
||||
System.out.println("[Pidgin] Failed to publish packet..");
|
||||
ex.printStackTrace();
|
||||
}
|
||||
|
||||
}
|
||||
} catch (Exception e) {
|
||||
if (exceptionHandler != null) {
|
||||
exceptionHandler.onException(e);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public Packet buildPacket(int id) {
|
||||
if (!idToType.containsKey(id)) {
|
||||
throw new IllegalStateException("A packet with that ID does not exist");
|
||||
}
|
||||
|
||||
try {
|
||||
return (Packet) idToType.get(id).newInstance();
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
throw new IllegalStateException("Could not create new instance of packet type");
|
||||
}
|
||||
|
||||
public void registerPacket(Class clazz) {
|
||||
try {
|
||||
int id = (int) clazz.getDeclaredMethod("id").invoke(clazz.newInstance(), null);
|
||||
|
||||
if (idToType.containsKey(id) || typeToId.containsKey(clazz)) {
|
||||
throw new IllegalStateException("A packet with that ID has already been registered");
|
||||
}
|
||||
|
||||
idToType.put(id, clazz);
|
||||
typeToId.put(clazz, id);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public void registerListener(PacketListener packetListener) {
|
||||
methodLoop:
|
||||
for (Method method : packetListener.getClass().getDeclaredMethods()) {
|
||||
if (method.getDeclaredAnnotation(IncomingPacketHandler.class) != null) {
|
||||
Class packetClass = null;
|
||||
|
||||
if (method.getParameters().length > 0) {
|
||||
if (Packet.class.isAssignableFrom(method.getParameters()[0].getType())) {
|
||||
packetClass = method.getParameters()[0].getType();
|
||||
}
|
||||
}
|
||||
|
||||
if (packetClass != null) {
|
||||
this.packetListeners.add(new PacketListenerData(packetListener, method, packetClass));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void setupPubSub() {
|
||||
System.out.println("[Pidgin] Setting up PubSup..");
|
||||
|
||||
this.jedisPubSub = new JedisPubSub() {
|
||||
|
||||
@Override
|
||||
public void onMessage(String channel, String message) {
|
||||
|
||||
if (channel.equalsIgnoreCase(Pidgin.this.channel)) {
|
||||
|
||||
try {
|
||||
|
||||
String[] args = message.split(";");
|
||||
|
||||
Integer id = Integer.valueOf(args[0]);
|
||||
|
||||
Packet packet = buildPacket(id);
|
||||
|
||||
if (packet != null) {
|
||||
packet.deserialize(PARSER.parse(args[1]).getAsJsonObject());
|
||||
|
||||
for (PacketListenerData data : packetListeners) {
|
||||
if (data.matches(packet)) {
|
||||
data.getMethod().invoke(data.getInstance(), packet);
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
System.out.println("[Pidgin] Failed to handle message");
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
ForkJoinPool.commonPool().execute(() -> {
|
||||
try (Jedis jedis = this.jedisPool.getResource()) {
|
||||
jedis.subscribe(this.jedisPubSub, channel);
|
||||
System.out.println("[Pidgin] Successfully subscribing to channel..");
|
||||
} catch (Exception exception) {
|
||||
System.out.println("[Pidgin] Failed to subscribe to channel..");
|
||||
exception.printStackTrace();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
}
|
13
src/main/java/com/minexd/zoot/pidgin/packet/Packet.java
Normal file
13
src/main/java/com/minexd/zoot/pidgin/packet/Packet.java
Normal file
@ -0,0 +1,13 @@
|
||||
package com.minexd.zoot.pidgin.packet;
|
||||
|
||||
import com.google.gson.JsonObject;
|
||||
|
||||
public interface Packet {
|
||||
|
||||
int id();
|
||||
|
||||
JsonObject serialize();
|
||||
|
||||
void deserialize(JsonObject object);
|
||||
|
||||
}
|
@ -0,0 +1,17 @@
|
||||
package com.minexd.zoot.pidgin.packet.handler;
|
||||
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
|
||||
/**
|
||||
* Identifies a method and packet type assigned to the method.
|
||||
* The only valid parameter types for a method that is annotated
|
||||
* by this annotation are String and Packet.
|
||||
*/
|
||||
@Target({ ElementType.METHOD})
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
public @interface IncomingPacketHandler {
|
||||
|
||||
}
|
@ -0,0 +1,10 @@
|
||||
package com.minexd.zoot.pidgin.packet.handler;
|
||||
|
||||
public class PacketExceptionHandler {
|
||||
|
||||
public void onException(Exception e) {
|
||||
System.out.println("Failed to send packet");
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,5 @@
|
||||
package com.minexd.zoot.pidgin.packet.listener;
|
||||
|
||||
public interface PacketListener {
|
||||
|
||||
}
|
@ -0,0 +1,26 @@
|
||||
package com.minexd.zoot.pidgin.packet.listener;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
|
||||
import com.minexd.zoot.pidgin.packet.Packet;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
/**
|
||||
* A wrapper class that holds all the information needed to
|
||||
* identify and execute a message function.
|
||||
*
|
||||
*/
|
||||
@AllArgsConstructor
|
||||
@Getter
|
||||
public class PacketListenerData {
|
||||
|
||||
private Object instance;
|
||||
private Method method;
|
||||
private Class packetClass;
|
||||
|
||||
public boolean matches(Packet packet) {
|
||||
return this.packetClass == packet.getClass();
|
||||
}
|
||||
|
||||
}
|
330
src/main/java/com/minexd/zoot/profile/Profile.java
Normal file
330
src/main/java/com/minexd/zoot/profile/Profile.java
Normal file
@ -0,0 +1,330 @@
|
||||
package com.minexd.zoot.profile;
|
||||
|
||||
import com.google.gson.JsonArray;
|
||||
import com.google.gson.JsonElement;
|
||||
import com.google.gson.JsonParser;
|
||||
import com.minexd.zoot.Zoot;
|
||||
import com.minexd.zoot.ZootAPI;
|
||||
import com.minexd.zoot.profile.conversation.ProfileConversations;
|
||||
import com.minexd.zoot.profile.grant.event.GrantAppliedEvent;
|
||||
import com.minexd.zoot.profile.grant.event.GrantExpireEvent;
|
||||
import com.minexd.zoot.profile.option.ProfileOptions;
|
||||
import com.minexd.zoot.profile.staff.ProfileStaffOptions;
|
||||
import com.minexd.zoot.profile.punishment.Punishment;
|
||||
import com.minexd.zoot.profile.grant.Grant;
|
||||
import com.minexd.zoot.profile.punishment.PunishmentType;
|
||||
import com.minexd.zoot.rank.Rank;
|
||||
import com.minexd.zoot.util.Cooldown;
|
||||
import com.mongodb.client.MongoCollection;
|
||||
import com.mongodb.client.MongoCursor;
|
||||
import com.mongodb.client.model.Filters;
|
||||
import com.mongodb.client.model.ReplaceOptions;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.UUID;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import org.bson.Document;
|
||||
import org.bson.conversions.Bson;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.OfflinePlayer;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.permissions.PermissionAttachment;
|
||||
import org.bukkit.permissions.PermissionAttachmentInfo;
|
||||
|
||||
public class Profile {
|
||||
|
||||
@Getter private static Map<UUID, Profile> profiles = new HashMap<>();
|
||||
private static MongoCollection<Document> collection;
|
||||
|
||||
@Getter @Setter private String username;
|
||||
@Getter private final UUID uuid;
|
||||
@Getter @Setter private Long firstSeen;
|
||||
@Getter @Setter private Long lastSeen;
|
||||
@Getter @Setter private String currentAddress;
|
||||
@Getter private List<String> ipAddresses;
|
||||
@Getter private final List<UUID> knownAlts;
|
||||
@Getter private final ProfileOptions options;
|
||||
@Getter private final ProfileStaffOptions staffOptions;
|
||||
@Getter private final ProfileConversations conversations;
|
||||
@Getter private Grant activeGrant;
|
||||
@Getter private final List<Grant> grants;
|
||||
@Getter private final List<Punishment> punishments;
|
||||
@Getter @Setter private boolean loaded;
|
||||
@Getter @Setter private Cooldown chatCooldown;
|
||||
|
||||
public Profile(String username, UUID uuid) {
|
||||
this.username = username;
|
||||
this.uuid = uuid;
|
||||
this.grants = new ArrayList<>();
|
||||
this.punishments = new ArrayList<>();
|
||||
this.ipAddresses = new ArrayList<>();
|
||||
this.knownAlts = new ArrayList<>();
|
||||
this.options = new ProfileOptions();
|
||||
this.staffOptions = new ProfileStaffOptions();
|
||||
this.conversations = new ProfileConversations(this);
|
||||
this.chatCooldown = new Cooldown(0);
|
||||
|
||||
load();
|
||||
}
|
||||
|
||||
public Player getPlayer() {
|
||||
return Bukkit.getPlayer(uuid);
|
||||
}
|
||||
|
||||
public String getColoredUsername() {
|
||||
return activeGrant.getRank().getColor() + username;
|
||||
}
|
||||
|
||||
public Punishment getActivePunishmentByType(PunishmentType type) {
|
||||
for (Punishment punishment : punishments) {
|
||||
if (punishment.getType() == type && !punishment.isRemoved() && !punishment.hasExpired()) {
|
||||
return punishment;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public int getPunishmentCountByType(PunishmentType type) {
|
||||
int i = 0;
|
||||
|
||||
for (Punishment punishment : punishments) {
|
||||
if (punishment.getType() == type) i++;
|
||||
}
|
||||
|
||||
return i;
|
||||
}
|
||||
|
||||
public Rank getActiveRank() {
|
||||
return activeGrant.getRank();
|
||||
}
|
||||
|
||||
public void activateNextGrant() {
|
||||
List<Grant> grants = new ArrayList<>(this.grants);
|
||||
|
||||
grants.sort(Comparator.comparingInt(grant -> grant.getRank().getWeight()));
|
||||
Collections.reverse(grants);
|
||||
|
||||
for (Grant grant : grants) {
|
||||
if (!grant.isRemoved() && !grant.hasExpired()) {
|
||||
if (!grant.equals(activeGrant)) {
|
||||
Zoot.get().debug("");
|
||||
activeGrant = grant;
|
||||
setupBukkitPlayer(getPlayer());
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void checkGrants() {
|
||||
Player player = getPlayer();
|
||||
|
||||
for (Grant grant : grants) {
|
||||
if (!grant.isRemoved() && grant.hasExpired()) {
|
||||
grant.setRemovedAt(System.currentTimeMillis());
|
||||
grant.setRemovedReason("Grant expired");
|
||||
grant.setRemoved(true);
|
||||
|
||||
if (player != null) {
|
||||
new GrantExpireEvent(player, grant).call();
|
||||
}
|
||||
|
||||
if (grant.equals(activeGrant)) {
|
||||
activateNextGrant();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (activeGrant == null) {
|
||||
Grant defaultGrant = new Grant(UUID.randomUUID(), Rank.getDefaultRank(), null,
|
||||
System.currentTimeMillis(), "Default", Integer.MAX_VALUE);
|
||||
|
||||
grants.add(defaultGrant);
|
||||
activeGrant = defaultGrant;
|
||||
|
||||
if (player != null) {
|
||||
new GrantAppliedEvent(player, defaultGrant).call();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void setupBukkitPlayer(Player player) {
|
||||
if (player == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (PermissionAttachmentInfo attachmentInfo : player.getEffectivePermissions()) {
|
||||
if (attachmentInfo.getAttachment() == null) {
|
||||
continue;
|
||||
}
|
||||
|
||||
attachmentInfo.getAttachment().getPermissions().forEach((permission, value) -> {
|
||||
attachmentInfo.getAttachment().unsetPermission(permission);
|
||||
});
|
||||
}
|
||||
|
||||
PermissionAttachment attachment = player.addAttachment(Zoot.get());
|
||||
|
||||
for (String perm : activeGrant.getRank().getAllPermissions()) {
|
||||
attachment.setPermission(perm, true);
|
||||
}
|
||||
|
||||
player.recalculatePermissions();
|
||||
|
||||
String displayName = activeGrant.getRank().getPrefix() + player.getName() + activeGrant.getRank().getSuffix();
|
||||
String coloredName = ZootAPI.getColoredName(player);
|
||||
|
||||
player.setDisplayName(displayName);
|
||||
|
||||
if (Zoot.get().getMainConfig().getBoolean("SETTINGS.UPDATE_PLAYER_LIST_NAME")) {
|
||||
player.setPlayerListName(coloredName);
|
||||
}
|
||||
}
|
||||
|
||||
public void load() {
|
||||
Document document = collection.find(Filters.eq("uuid", uuid.toString())).first();
|
||||
|
||||
if (document != null) {
|
||||
if (username == null) {
|
||||
username = document.getString("username");
|
||||
}
|
||||
|
||||
firstSeen = document.getLong("firstSeen");
|
||||
lastSeen = document.getLong("lastSeen");
|
||||
currentAddress = document.getString("currentAddress");
|
||||
ipAddresses = Zoot.GSON.fromJson(document.getString("ipAddresses"), Zoot.LIST_STRING_TYPE);
|
||||
|
||||
Document optionsDocument = (Document) document.get("options");
|
||||
options.publicChatEnabled(optionsDocument.getBoolean("publicChatEnabled"));
|
||||
options.receivingNewConversations(optionsDocument.getBoolean("receivingNewConversations"));
|
||||
options.playingMessageSounds(optionsDocument.getBoolean("playingMessageSounds"));
|
||||
|
||||
JsonArray grantList = new JsonParser().parse(document.getString("grants")).getAsJsonArray();
|
||||
|
||||
for (JsonElement grantData : grantList) {
|
||||
// Transform into a Grant object
|
||||
Grant grant = Grant.DESERIALIZER.deserialize(grantData.getAsJsonObject());
|
||||
|
||||
if (grant != null) {
|
||||
this.grants.add(grant);
|
||||
}
|
||||
}
|
||||
|
||||
JsonArray punishmentList = new JsonParser().parse(document.getString("punishments")).getAsJsonArray();
|
||||
|
||||
for (JsonElement punishmentData : punishmentList) {
|
||||
// Transform into a Grant object
|
||||
Punishment punishment = Punishment.DESERIALIZER.deserialize(punishmentData.getAsJsonObject());
|
||||
|
||||
if (punishment != null) {
|
||||
this.punishments.add(punishment);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Update active grants
|
||||
activateNextGrant();
|
||||
checkGrants();
|
||||
|
||||
// Set loaded to true
|
||||
loaded = true;
|
||||
}
|
||||
|
||||
public void save() {
|
||||
Document document = new Document();
|
||||
document.put("username", username);
|
||||
document.put("uuid", uuid.toString());
|
||||
document.put("firstSeen", firstSeen);
|
||||
document.put("lastSeen", lastSeen);
|
||||
document.put("currentAddress", currentAddress);
|
||||
document.put("ipAddresses", Zoot.GSON.toJson(ipAddresses, Zoot.LIST_STRING_TYPE));
|
||||
|
||||
Document optionsDocument = new Document();
|
||||
optionsDocument.put("publicChatEnabled", options.publicChatEnabled());
|
||||
optionsDocument.put("receivingNewConversations", options.receivingNewConversations());
|
||||
optionsDocument.put("playingMessageSounds", options.playingMessageSounds());
|
||||
document.put("options", optionsDocument);
|
||||
|
||||
JsonArray grantList = new JsonArray();
|
||||
|
||||
for (Grant grant : this.grants) {
|
||||
grantList.add(Grant.SERIALIZER.serialize(grant));
|
||||
}
|
||||
|
||||
document.put("grants", grantList.toString());
|
||||
|
||||
JsonArray punishmentList = new JsonArray();
|
||||
|
||||
for (Punishment punishment : this.punishments) {
|
||||
punishmentList.add(Punishment.SERIALIZER.serialize(punishment));
|
||||
}
|
||||
|
||||
document.put("punishments", punishmentList.toString());
|
||||
|
||||
collection.replaceOne(Filters.eq("uuid", uuid.toString()), document, new ReplaceOptions().upsert(true));
|
||||
}
|
||||
|
||||
public static void init() {
|
||||
collection = Zoot.get().getMongoDatabase().getCollection("profiles");
|
||||
}
|
||||
|
||||
public static Profile getByUuid(UUID uuid) {
|
||||
if (profiles.containsKey(uuid)) {
|
||||
return profiles.get(uuid);
|
||||
}
|
||||
|
||||
return new Profile(null, uuid);
|
||||
}
|
||||
|
||||
public static Profile getByUsername(String username) {
|
||||
Player player = Bukkit.getPlayer(username);
|
||||
|
||||
if (player != null) {
|
||||
return profiles.get(player.getUniqueId());
|
||||
}
|
||||
|
||||
OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(username);
|
||||
|
||||
if (offlinePlayer.hasPlayedBefore()) {
|
||||
if (profiles.containsKey(offlinePlayer.getUniqueId())) {
|
||||
return profiles.get(offlinePlayer.getUniqueId());
|
||||
}
|
||||
|
||||
return new Profile(offlinePlayer.getName(), offlinePlayer.getUniqueId());
|
||||
}
|
||||
|
||||
UUID uuid = Zoot.get().getRedisCache().getUuid(username);
|
||||
|
||||
if (uuid != null) {
|
||||
if (profiles.containsKey(uuid)) {
|
||||
return profiles.get(uuid);
|
||||
}
|
||||
|
||||
return new Profile(username, uuid);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public static List<Profile> getByIpAddress(String ipAddress) {
|
||||
List<Profile> profiles = new ArrayList<>();
|
||||
Bson filter = Filters.eq("currentAddress", ipAddress);
|
||||
|
||||
try (MongoCursor<Document> cursor = collection.find(filter).iterator()) {
|
||||
while (cursor.hasNext()) {
|
||||
Document document = cursor.next();
|
||||
profiles.add(new Profile(document.getString("username"),
|
||||
UUID.fromString(document.getString("uuid"))));
|
||||
}
|
||||
}
|
||||
|
||||
return profiles;
|
||||
}
|
||||
|
||||
}
|
171
src/main/java/com/minexd/zoot/profile/ProfileListener.java
Normal file
171
src/main/java/com/minexd/zoot/profile/ProfileListener.java
Normal file
@ -0,0 +1,171 @@
|
||||
package com.minexd.zoot.profile;
|
||||
|
||||
import com.minexd.zoot.Locale;
|
||||
import com.minexd.zoot.Zoot;
|
||||
import com.minexd.zoot.bootstrap.BootstrappedListener;
|
||||
import com.minexd.zoot.cache.RedisPlayerData;
|
||||
import com.minexd.zoot.network.packet.PacketStaffChat;
|
||||
import com.minexd.zoot.profile.punishment.Punishment;
|
||||
import com.minexd.zoot.profile.punishment.PunishmentType;
|
||||
import com.minexd.zoot.util.CC;
|
||||
import java.util.List;
|
||||
import java.util.logging.Level;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.player.AsyncPlayerChatEvent;
|
||||
import org.bukkit.event.player.AsyncPlayerPreLoginEvent;
|
||||
import org.bukkit.event.player.PlayerJoinEvent;
|
||||
import org.bukkit.event.player.PlayerQuitEvent;
|
||||
import org.bukkit.scheduler.BukkitRunnable;
|
||||
|
||||
public class ProfileListener extends BootstrappedListener {
|
||||
|
||||
public ProfileListener(Zoot zoot) {
|
||||
super(zoot);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onAsyncPlayerPreLogin(AsyncPlayerPreLoginEvent event) {
|
||||
Player player = Bukkit.getPlayer(event.getUniqueId());
|
||||
|
||||
// Need to check if player is still logged in when receiving another login attempt
|
||||
// This happens when a player using a custom client can access the server list while in-game (and reconnecting)
|
||||
if (player != null && player.isOnline()) {
|
||||
event.setLoginResult(AsyncPlayerPreLoginEvent.Result.KICK_OTHER);
|
||||
event.setKickMessage(CC.RED + "You tried to login too quickly after disconnecting.\nTry again in a few seconds.");
|
||||
zoot.getServer().getScheduler().runTask(zoot, () -> player.kickPlayer(CC.RED + "Duplicate login kick"));
|
||||
return;
|
||||
}
|
||||
|
||||
Profile profile = null;
|
||||
|
||||
try {
|
||||
profile = new Profile(event.getName(), event.getUniqueId());
|
||||
|
||||
if (!profile.isLoaded()) {
|
||||
event.setLoginResult(AsyncPlayerPreLoginEvent.Result.KICK_OTHER);
|
||||
event.setKickMessage(Locale.FAILED_TO_LOAD_PROFILE.format());
|
||||
return;
|
||||
}
|
||||
|
||||
if (profile.getActivePunishmentByType(PunishmentType.BAN) != null) {
|
||||
handleBan(event, profile.getActivePunishmentByType(PunishmentType.BAN));
|
||||
return;
|
||||
}
|
||||
|
||||
profile.setUsername(event.getName());
|
||||
|
||||
if (profile.getFirstSeen() == null) {
|
||||
profile.setFirstSeen(System.currentTimeMillis());
|
||||
}
|
||||
|
||||
profile.setLastSeen(System.currentTimeMillis());
|
||||
|
||||
if (profile.getCurrentAddress() == null) {
|
||||
profile.setCurrentAddress(event.getAddress().getHostAddress());
|
||||
}
|
||||
|
||||
if (!profile.getIpAddresses().contains(event.getAddress().getHostAddress())) {
|
||||
profile.getIpAddresses().add(event.getAddress().getHostAddress());
|
||||
}
|
||||
|
||||
if (!profile.getCurrentAddress().equals(event.getAddress().getHostAddress())) {
|
||||
List<Profile> alts = Profile.getByIpAddress(event.getAddress().getHostAddress());
|
||||
|
||||
for (Profile alt : alts) {
|
||||
if (alt.getActivePunishmentByType(PunishmentType.BAN) != null) {
|
||||
handleBan(event, alt.getActivePunishmentByType(PunishmentType.BAN));
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
profile.save();
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
zoot.debug(Level.SEVERE, "Failed to load profile for " + event.getName(), e);
|
||||
}
|
||||
|
||||
if (profile == null || !profile.isLoaded()) {
|
||||
event.setKickMessage(Locale.FAILED_TO_LOAD_PROFILE.format());
|
||||
event.setLoginResult(AsyncPlayerPreLoginEvent.Result.KICK_OTHER);
|
||||
return;
|
||||
}
|
||||
|
||||
Profile.getProfiles().put(profile.getUuid(), profile);
|
||||
|
||||
RedisPlayerData playerData = new RedisPlayerData(event.getUniqueId(), event.getName());
|
||||
playerData.setLastAction(RedisPlayerData.LastAction.JOINING_SERVER);
|
||||
playerData.setLastSeenServer(zoot.getMainConfig().getString("SERVER_NAME"));
|
||||
playerData.setLastSeenAt(System.currentTimeMillis());
|
||||
|
||||
zoot.getRedisCache().updatePlayerData(playerData);
|
||||
zoot.getRedisCache().updateNameAndUUID(event.getName(), event.getUniqueId());
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerJoin(PlayerJoinEvent event) {
|
||||
Player player = event.getPlayer();
|
||||
Profile profile = Profile.getProfiles().get(player.getUniqueId());
|
||||
profile.setupBukkitPlayer(player);
|
||||
|
||||
for (String perm : profile.getActiveGrant().getRank().getAllPermissions()) {
|
||||
zoot.debug(player, perm);
|
||||
}
|
||||
|
||||
if (player.hasPermission("zoot.staff")) {
|
||||
player.sendMessage(CC.GOLD + "Your staff mode is currently: " +
|
||||
(profile.getStaffOptions().staffModeEnabled() ? CC.GREEN + "Enabled" : CC.RED + "Disabled"));
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerQuit(PlayerQuitEvent event) {
|
||||
Profile profile = Profile.getProfiles().remove(event.getPlayer().getUniqueId());
|
||||
profile.setLastSeen(System.currentTimeMillis());
|
||||
|
||||
if (profile.isLoaded()) {
|
||||
new BukkitRunnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
profile.save();
|
||||
} catch (Exception e) {
|
||||
zoot.debug(Level.SEVERE, "Failed to save profile " + event.getPlayer().getName(), e);
|
||||
}
|
||||
}
|
||||
}.runTaskAsynchronously(Zoot.get());
|
||||
}
|
||||
|
||||
RedisPlayerData playerData = new RedisPlayerData(event.getPlayer().getUniqueId(), event.getPlayer().getName());
|
||||
playerData.setLastAction(RedisPlayerData.LastAction.LEAVING_SERVER);
|
||||
playerData.setLastSeenServer(zoot.getMainConfig().getString("SERVER_NAME"));
|
||||
playerData.setLastSeenAt(System.currentTimeMillis());
|
||||
|
||||
zoot.getRedisCache().updatePlayerData(playerData);
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.LOW)
|
||||
public void onAsyncPlayerChatEvent(AsyncPlayerChatEvent event) {
|
||||
Profile profile = Profile.getByUuid(event.getPlayer().getUniqueId());
|
||||
|
||||
if (profile.getStaffOptions().staffChatModeEnabled()) {
|
||||
if (profile.getStaffOptions().staffModeEnabled()) {
|
||||
Zoot.get().getPidgin().sendPacket(new PacketStaffChat(event.getPlayer().getDisplayName(),
|
||||
Zoot.get().getMainConfig().getString("SERVER_NAME"), event.getMessage()));
|
||||
} else {
|
||||
event.getPlayer().sendMessage(CC.RED + "You must enable staff mode or disable staff chat mode.");
|
||||
}
|
||||
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
|
||||
private void handleBan(AsyncPlayerPreLoginEvent event, Punishment punishment) {
|
||||
event.setLoginResult(AsyncPlayerPreLoginEvent.Result.KICK_OTHER);
|
||||
event.setKickMessage(punishment.getKickMessage());
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,28 @@
|
||||
package com.minexd.zoot.profile;
|
||||
|
||||
import com.qrakn.honcho.command.adapter.CommandTypeAdapter;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class ProfileTypeAdapter implements CommandTypeAdapter {
|
||||
|
||||
public <T> T convert(String string, Class<T> type) {
|
||||
return type.cast(Profile.getByUsername(string));
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T> List<String> tabComplete(String string, Class<T> type) {
|
||||
List<String> completed = new ArrayList<>();
|
||||
|
||||
for (Profile profile : Profile.getProfiles().values()) {
|
||||
if (profile.getUsername() == null) continue;
|
||||
|
||||
if (profile.getUsername().toLowerCase().startsWith(string.toLowerCase())) {
|
||||
completed.add(profile.getUsername());
|
||||
}
|
||||
}
|
||||
|
||||
return completed;
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,90 @@
|
||||
package com.minexd.zoot.profile.conversation;
|
||||
|
||||
import com.minexd.zoot.Locale;
|
||||
import com.minexd.zoot.ZootAPI;
|
||||
import com.minexd.zoot.profile.Profile;
|
||||
import lombok.Getter;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Sound;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
public class Conversation {
|
||||
|
||||
@Getter private final UUID initiatedBy;
|
||||
@Getter private final UUID target;
|
||||
@Getter private long lastMessageSentAt;
|
||||
@Getter private UUID lastMessageSentBy;
|
||||
|
||||
public Conversation(UUID initiatedBy, UUID target) {
|
||||
this.initiatedBy = initiatedBy;
|
||||
this.target = target;
|
||||
this.lastMessageSentAt = System.currentTimeMillis();
|
||||
|
||||
Profile initiatorProfile = Profile.getByUuid(initiatedBy);
|
||||
initiatorProfile.getConversations().getConversations().put(target, this);
|
||||
|
||||
Profile targetProfile = Profile.getByUuid(target);
|
||||
targetProfile.getConversations().getConversations().put(initiatedBy, this);
|
||||
}
|
||||
|
||||
public void sendMessage(Player sender, Player target, String message) {
|
||||
sender.sendMessage(Locale.CONVERSATION_SEND_MESSAGE.format(
|
||||
sender.getName(), sender.getDisplayName(), ZootAPI.getColorOfPlayer(sender),
|
||||
target.getName(), target.getDisplayName(), ZootAPI.getColorOfPlayer(target))
|
||||
.replace("%MSG%", message));
|
||||
|
||||
Profile targetProfile = Profile.getByUuid(target.getUniqueId());
|
||||
|
||||
if (targetProfile.getOptions().playingMessageSounds()) {
|
||||
target.playSound(target.getLocation(), Sound.SUCCESSFUL_HIT, 1.0F, 1.0F);
|
||||
}
|
||||
|
||||
target.sendMessage(Locale.CONVERSATION_RECEIVE_MESSAGE.format(
|
||||
target.getName(), target.getDisplayName(), ZootAPI.getColorOfPlayer(target),
|
||||
sender.getName(), sender.getDisplayName(), ZootAPI.getColorOfPlayer(sender))
|
||||
.replace("%MSG%", message));
|
||||
|
||||
lastMessageSentAt = System.currentTimeMillis();
|
||||
lastMessageSentBy = sender.getUniqueId();
|
||||
}
|
||||
|
||||
public boolean validate() {
|
||||
Player initiator = Bukkit.getPlayer(initiatedBy);
|
||||
|
||||
if (initiator == null || !initiator.isOnline()) {
|
||||
destroy();
|
||||
return false;
|
||||
}
|
||||
|
||||
Player target = Bukkit.getPlayer(this.target);
|
||||
|
||||
if (target == null || !target.isOnline()) {
|
||||
destroy();
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public void destroy() {
|
||||
for (Player player : new Player[] { Bukkit.getPlayer(initiatedBy), Bukkit.getPlayer(target) }) {
|
||||
if (player != null && player.isOnline()) {
|
||||
Profile profile = Profile.getByUuid(player.getUniqueId());
|
||||
profile.getConversations().getConversations().remove(getPartner(player.getUniqueId()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public UUID getPartner(UUID compareWith) {
|
||||
if (initiatedBy.equals(compareWith)) {
|
||||
return target;
|
||||
} else if (target.equals(compareWith)) {
|
||||
return initiatedBy;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,61 @@
|
||||
package com.minexd.zoot.profile.conversation;
|
||||
|
||||
import com.minexd.zoot.profile.Profile;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import lombok.Getter;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public class ProfileConversations {
|
||||
|
||||
@Getter private final Profile profile;
|
||||
@Getter private Map<UUID, Conversation> conversations;
|
||||
|
||||
public ProfileConversations(Profile profile) {
|
||||
this.profile = profile;
|
||||
this.conversations = new HashMap<>();
|
||||
}
|
||||
|
||||
public boolean canBeMessagedBy(Player player) {
|
||||
if (!profile.getOptions().receivingNewConversations()) {
|
||||
return conversations.containsKey(player.getUniqueId());
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public Conversation getOrCreateConversation(Player target) {
|
||||
Player sender = profile.getPlayer();
|
||||
|
||||
if (sender != null) {
|
||||
Conversation conversation = conversations.get(target.getUniqueId());
|
||||
|
||||
if (conversation == null) {
|
||||
conversation = new Conversation(profile.getUuid(), target.getUniqueId());
|
||||
}
|
||||
|
||||
return conversation;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public Conversation getLastRepliedConversation() {
|
||||
List<Conversation> list = conversations
|
||||
.values()
|
||||
.stream()
|
||||
.sorted(Comparator.comparingLong(Conversation::getLastMessageSentAt))
|
||||
.collect(Collectors.toList());
|
||||
|
||||
Collections.reverse(list);
|
||||
|
||||
return list.isEmpty() ? null : list.get(0);
|
||||
}
|
||||
|
||||
public void expireAllConversations() {
|
||||
this.conversations.clear();
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,39 @@
|
||||
package com.minexd.zoot.profile.conversation.command;
|
||||
|
||||
import com.minexd.zoot.profile.Profile;
|
||||
import com.minexd.zoot.profile.conversation.Conversation;
|
||||
import com.minexd.zoot.util.CC;
|
||||
import com.qrakn.honcho.command.CommandMeta;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@CommandMeta(label = { "message", "msg", "whisper", "tell", "t" })
|
||||
public class MessageCommand {
|
||||
|
||||
public void execute(Player player, Player target, String message) {
|
||||
if (player.equals(target)) {
|
||||
player.sendMessage(CC.RED + "You cannot message yourself!");
|
||||
return;
|
||||
}
|
||||
|
||||
if (target == null) {
|
||||
player.sendMessage(CC.RED + "A player with that name could not be found.");
|
||||
return;
|
||||
}
|
||||
|
||||
Profile playerProfile = Profile.getByUuid(player.getUniqueId());
|
||||
Profile targetProfile = Profile.getByUuid(target.getUniqueId());
|
||||
|
||||
if (targetProfile.getConversations().canBeMessagedBy(player)) {
|
||||
Conversation conversation = playerProfile.getConversations().getOrCreateConversation(target);
|
||||
|
||||
if (conversation.validate()) {
|
||||
conversation.sendMessage(player, target, message);
|
||||
} else {
|
||||
player.sendMessage(CC.RED + "That player is not receiving new conversations right now.");
|
||||
}
|
||||
} else {
|
||||
player.sendMessage(CC.RED + "That player is not receiving new conversations right now.");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,28 @@
|
||||
package com.minexd.zoot.profile.conversation.command;
|
||||
|
||||
import com.minexd.zoot.profile.Profile;
|
||||
import com.minexd.zoot.profile.conversation.Conversation;
|
||||
import com.minexd.zoot.util.CC;
|
||||
import com.qrakn.honcho.command.CommandMeta;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@CommandMeta(label = { "reply", "r" })
|
||||
public class ReplyCommand {
|
||||
|
||||
public void execute(Player player, String message) {
|
||||
Profile playerProfile = Profile.getByUuid(player.getUniqueId());
|
||||
Conversation conversation = playerProfile.getConversations().getLastRepliedConversation();
|
||||
|
||||
if (conversation != null) {
|
||||
if (conversation.validate()) {
|
||||
conversation.sendMessage(player, Bukkit.getPlayer(conversation.getPartner(player.getUniqueId())), message);
|
||||
} else {
|
||||
player.sendMessage(CC.RED + "You can no longer reply to that player.");
|
||||
}
|
||||
} else {
|
||||
player.sendMessage(CC.RED + "You have nobody to reply to.");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
68
src/main/java/com/minexd/zoot/profile/grant/Grant.java
Normal file
68
src/main/java/com/minexd/zoot/profile/grant/Grant.java
Normal file
@ -0,0 +1,68 @@
|
||||
package com.minexd.zoot.profile.grant;
|
||||
|
||||
import com.minexd.zoot.rank.Rank;
|
||||
import com.minexd.zoot.util.TimeUtil;
|
||||
import java.util.Date;
|
||||
import java.util.UUID;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
|
||||
public class Grant {
|
||||
|
||||
public static GrantJsonSerializer SERIALIZER = new GrantJsonSerializer();
|
||||
public static GrantJsonDeserializer DESERIALIZER = new GrantJsonDeserializer();
|
||||
|
||||
@Getter private final UUID uuid;
|
||||
@Getter private final Rank rank;
|
||||
@Getter @Setter private UUID addedBy;
|
||||
@Getter private final long addedAt;
|
||||
@Getter private final String addedReason;
|
||||
@Getter private final long duration;
|
||||
@Getter @Setter private UUID removedBy;
|
||||
@Getter @Setter private long removedAt;
|
||||
@Getter @Setter private String removedReason;
|
||||
@Getter @Setter private boolean removed;
|
||||
|
||||
public Grant(UUID uuid, Rank rank, UUID addedBy, long addedAt, String addedReason, long duration) {
|
||||
this.uuid = uuid;
|
||||
this.rank = rank;
|
||||
this.addedBy = addedBy;
|
||||
this.addedAt = addedAt;
|
||||
this.addedReason = addedReason;
|
||||
this.duration = duration;
|
||||
}
|
||||
|
||||
public boolean isPermanent() {
|
||||
return duration == Integer.MAX_VALUE;
|
||||
}
|
||||
|
||||
public boolean hasExpired() {
|
||||
return (!isPermanent()) && (System.currentTimeMillis() >= addedAt + duration);
|
||||
}
|
||||
|
||||
public String getExpiresAtDate() {
|
||||
if (duration == Integer.MAX_VALUE) {
|
||||
return "Never";
|
||||
}
|
||||
|
||||
return TimeUtil.dateToString(new Date(addedAt + duration), "&7");
|
||||
}
|
||||
|
||||
public String getDurationText() {
|
||||
if (removed) {
|
||||
return "Removed";
|
||||
}
|
||||
|
||||
if (isPermanent()) {
|
||||
return "Permanent";
|
||||
}
|
||||
|
||||
return TimeUtil.millisToRoundedTime(duration);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object object) {
|
||||
return object instanceof Grant && ((Grant) object).uuid.equals(uuid);
|
||||
}
|
||||
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user