geforkt von SteamWar/BungeeCore
Commits vergleichen
4 Commits
Autor | SHA1 | Datum | |
---|---|---|---|
|
00da5f673d | ||
|
e4551e9521 | ||
|
14052c5d01 | ||
|
1a54476cbe |
3
.gitignore
vendored
3
.gitignore
vendored
@ -10,3 +10,6 @@ steamwar.properties
|
|||||||
# IntelliJ IDEA
|
# IntelliJ IDEA
|
||||||
.idea
|
.idea
|
||||||
*.iml
|
*.iml
|
||||||
|
|
||||||
|
# Other
|
||||||
|
lib
|
23
BUILDING.md
Normale Datei
23
BUILDING.md
Normale Datei
@ -0,0 +1,23 @@
|
|||||||
|
# Building
|
||||||
|
|
||||||
|
Building SteamWar.de software requires certain libraries,
|
||||||
|
which cannot be provided over traditional ways (like maven)
|
||||||
|
due to copyright issues with compiled Spigot packages.
|
||||||
|
For building these libraries have to be named in a lib
|
||||||
|
directory named like in the following list.
|
||||||
|
A subset of the following libraries is required to build this software
|
||||||
|
(this is the list for being able to build all SteamWar.de software):
|
||||||
|
|
||||||
|
- BungeeCord.jar https://ci.md-5.net/job/BungeeCord/
|
||||||
|
- BungeeTabListPlus.jar https://www.spigotmc.org/resources/bungeetablistplus.313/
|
||||||
|
- PersistentBungeeCore.jar https://steamwar.de/devlabs/SteamWar/PersistentBungeeCore
|
||||||
|
- ProtocolLib.jar https://www.spigotmc.org/resources/protocollib.1997/
|
||||||
|
- Spigot-1.8.jar https://hub.spigotmc.org/jenkins/job/BuildTools/ (1.8.9)
|
||||||
|
- Spigot-1.9.jar https://hub.spigotmc.org/jenkins/job/BuildTools/ (1.9.4)
|
||||||
|
- Spigot-1.10.jar https://hub.spigotmc.org/jenkins/job/BuildTools/ (1.10.2)
|
||||||
|
- Spigot-1.12.jar https://hub.spigotmc.org/jenkins/job/BuildTools/ (1.12.2)
|
||||||
|
- Spigot-1.14.jar https://hub.spigotmc.org/jenkins/job/BuildTools/ (1.14.4)
|
||||||
|
- Spigot-1.15.jar https://hub.spigotmc.org/jenkins/job/BuildTools/ (1.15.2)
|
||||||
|
- SpigotCore.jar https://steamwar.de/devlabs/SteamWar/SpigotCore
|
||||||
|
- WorldEdit-1.12.jar https://dev.bukkit.org/projects/worldedit/files (6.1.9)
|
||||||
|
- WorldEdit-1.15.jar https://dev.bukkit.org/projects/worldedit/files (newest)
|
@ -1 +1 @@
|
|||||||
Subproject commit 20c22c47f940c4510de17594b28eb0a96cb9da0c
|
Subproject commit 0f03b57e437c1d843816b7202d95b79ff0a8d2df
|
230
build.gradle
230
build.gradle
@ -17,6 +17,11 @@
|
|||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
import org.apache.tools.ant.taskdefs.condition.Os
|
||||||
|
|
||||||
|
import java.util.function.BiConsumer
|
||||||
|
|
||||||
plugins {
|
plugins {
|
||||||
// Adding the base plugin fixes the following gradle warnings in IntelliJ:
|
// Adding the base plugin fixes the following gradle warnings in IntelliJ:
|
||||||
//
|
//
|
||||||
@ -29,19 +34,36 @@ plugins {
|
|||||||
id 'java'
|
id 'java'
|
||||||
id 'application'
|
id 'application'
|
||||||
|
|
||||||
id 'com.github.johnrengelman.shadow' version '8.1.1'
|
id 'com.github.johnrengelman.shadow' version '5.0.0'
|
||||||
id 'de.steamwar.gradle' version 'RELEASE'
|
|
||||||
}
|
}
|
||||||
|
|
||||||
group 'de.steamwar'
|
group 'de.steamwar'
|
||||||
version ''
|
version ''
|
||||||
|
|
||||||
|
Properties steamwarProperties = new Properties()
|
||||||
|
if (file("steamwar.properties").exists()) {
|
||||||
|
steamwarProperties.load(file("steamwar.properties").newDataInputStream())
|
||||||
|
}
|
||||||
|
|
||||||
|
ext {
|
||||||
|
buildName = 'BungeeCore'
|
||||||
|
artifactName = 'bungeecore'
|
||||||
|
|
||||||
|
uberJarName = "${buildName}-all.jar"
|
||||||
|
jarName = "${artifactName}.jar"
|
||||||
|
libs = "${buildDir}/libs"
|
||||||
|
|
||||||
|
if (Os.isFamily(Os.FAMILY_WINDOWS)) {
|
||||||
|
operatingSystem = "windows"
|
||||||
|
} else {
|
||||||
|
operatingSystem = "unix"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
compileJava.options.encoding = 'UTF-8'
|
compileJava.options.encoding = 'UTF-8'
|
||||||
|
|
||||||
java {
|
sourceCompatibility = 1.8
|
||||||
sourceCompatibility = JavaVersion.VERSION_17
|
targetCompatibility = 1.8
|
||||||
targetCompatibility = JavaVersion.VERSION_17
|
|
||||||
}
|
|
||||||
|
|
||||||
mainClassName = ''
|
mainClassName = ''
|
||||||
|
|
||||||
@ -60,32 +82,8 @@ sourceSets {
|
|||||||
repositories {
|
repositories {
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
maven {
|
maven {
|
||||||
name = 'papermc'
|
url 'https://m2.dv8tion.net/releases'
|
||||||
url = 'https://repo.papermc.io/repository/maven-public/'
|
|
||||||
}
|
}
|
||||||
maven {
|
|
||||||
url = 'https://m2.dv8tion.net/releases'
|
|
||||||
content {
|
|
||||||
includeGroup 'net.dv8tion'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
maven {
|
|
||||||
url = 'https://repo.lunarclient.dev'
|
|
||||||
content {
|
|
||||||
includeGroup 'com.lunarclient'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
maven { url 'https://jitpack.io' }
|
|
||||||
mavenLocal()
|
|
||||||
}
|
|
||||||
|
|
||||||
shadowJar {
|
|
||||||
exclude 'META-INF/*'
|
|
||||||
//https://imperceptiblethoughts.com/shadow/configuration/minimizing/
|
|
||||||
minimize {
|
|
||||||
exclude project(':')
|
|
||||||
}
|
|
||||||
duplicatesStrategy DuplicatesStrategy.INCLUDE
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
@ -94,24 +92,162 @@ dependencies {
|
|||||||
annotationProcessor 'org.projectlombok:lombok:1.18.22'
|
annotationProcessor 'org.projectlombok:lombok:1.18.22'
|
||||||
testAnnotationProcessor 'org.projectlombok:lombok:1.18.22'
|
testAnnotationProcessor 'org.projectlombok:lombok:1.18.22'
|
||||||
|
|
||||||
compileOnly 'com.velocitypowered:velocity-api:3.3.0-SNAPSHOT'
|
compileOnly files("${projectDir}/lib/BungeeCord.jar")
|
||||||
annotationProcessor 'com.velocitypowered:velocity-api:3.3.0-SNAPSHOT'
|
compileOnly files("${projectDir}/lib/PersistentBungeeCore.jar")
|
||||||
compileOnly 'com.velocitypowered:velocity-proxy:3.3.0-SNAPSHOT'
|
compileOnly files("${projectDir}/lib/BungeeTabListPlus.jar")
|
||||||
|
implementation("net.dv8tion:JDA:4.3.0_299") {
|
||||||
compileOnly 'de.steamwar:persistentvelocitycore:DEV'
|
|
||||||
implementation("net.dv8tion:JDA:4.4.0_352") {
|
|
||||||
exclude module: 'opus-java'
|
exclude module: 'opus-java'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
implementation "com.sparkjava:spark-core:2.9.3"
|
||||||
|
|
||||||
implementation project(":CommonCore")
|
implementation project(":CommonCore")
|
||||||
|
}
|
||||||
implementation 'com.lunarclient:apollo-api:1.1.0'
|
|
||||||
implementation 'com.lunarclient:apollo-common:1.1.0'
|
task buildProject {
|
||||||
|
description 'Build this project'
|
||||||
implementation 'org.reflections:reflections:0.10.2'
|
group "Steamwar"
|
||||||
|
|
||||||
compileOnly 'io.netty:netty-buffer:4.1.106.Final'
|
dependsOn build
|
||||||
compileOnly 'io.netty:netty-transport:4.1.106.Final'
|
}
|
||||||
|
|
||||||
implementation 'com.github.Carleslc.Simple-YAML:Simple-Yaml:1.8.4'
|
task finalizeProject {
|
||||||
|
description 'Finalize this project'
|
||||||
|
group "Steamwar"
|
||||||
|
|
||||||
|
doLast {
|
||||||
|
if ("${buildDir}" == null) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
delete fileTree("${libs}").matching {
|
||||||
|
exclude("${uberJarName}")
|
||||||
|
}
|
||||||
|
file(libs + "/" + uberJarName).renameTo(file(libs + "/" + jarName))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
build.finalizedBy(finalizeProject)
|
||||||
|
|
||||||
|
if (steamwarProperties.containsKey("hostname")) {
|
||||||
|
String hostname = steamwarProperties.get("hostname")
|
||||||
|
String uploadPath = steamwarProperties.getOrDefault("uploadPath", "~")
|
||||||
|
|
||||||
|
String server = steamwarProperties.getOrDefault("server", "DevBungee")
|
||||||
|
String serverStartFlags = steamwarProperties.getOrDefault("serverStartFlags", "")
|
||||||
|
|
||||||
|
task uploadProject {
|
||||||
|
description 'Upload this project'
|
||||||
|
group "Steamwar"
|
||||||
|
|
||||||
|
doLast {
|
||||||
|
await(shell("scp ${libs}/${jarName} ${hostname}:${uploadPath}/${server}/plugins"))
|
||||||
|
if (steamwarProperties.getOrDefault("directStart", "false") == "false" && !answer("Start ${server} server?")) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
serverStart(server, serverStartFlags, hostname)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
uploadProject.dependsOn(buildProject)
|
||||||
|
|
||||||
|
task startDevServer {
|
||||||
|
description 'Start the DevBungee'
|
||||||
|
group "Steamwar"
|
||||||
|
|
||||||
|
doLast {
|
||||||
|
serverStart(server, serverStartFlags, hostname)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private def await(Process proc) {
|
||||||
|
def out = new StringBuilder()
|
||||||
|
def err = new StringBuilder()
|
||||||
|
proc.waitForProcessOutput(out, err)
|
||||||
|
return [out, err, proc.exitValue()]
|
||||||
|
}
|
||||||
|
|
||||||
|
private def shell(String command) {
|
||||||
|
if (operatingSystem == "unix") {
|
||||||
|
return ['bash', '-c', command].execute()
|
||||||
|
} else {
|
||||||
|
return ["cmd", "/c", command].execute()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private def serverStart(String serverName, String serverFlags, String hostname) {
|
||||||
|
def proc = shell("ssh -t ${hostname} \"./mc ${serverFlags} ${serverName}\"")
|
||||||
|
|
||||||
|
Set<String> strings = new HashSet<>()
|
||||||
|
File file = new File("${projectDir}/ignoredlog");
|
||||||
|
if (file.exists()) {
|
||||||
|
new BufferedReader(new InputStreamReader(new FileInputStream(file))).readLines().forEach({ s ->
|
||||||
|
strings.add(s)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
Thread outputThread = new Thread({
|
||||||
|
Reader reader = proc.getInputStream().newReader();
|
||||||
|
Writer writer = System.out.newWriter();
|
||||||
|
try {
|
||||||
|
while (proc.alive) {
|
||||||
|
String s = reader.readLine()
|
||||||
|
if (s == null) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (strings.stream().anyMatch({check -> s.contains(check)})) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
writer.write(s + "\n")
|
||||||
|
writer.flush()
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
// Ignored
|
||||||
|
}
|
||||||
|
})
|
||||||
|
outputThread.setName("${serverName} - OutputThread")
|
||||||
|
outputThread.start()
|
||||||
|
|
||||||
|
Writer writer
|
||||||
|
Thread inputThread = new Thread({
|
||||||
|
Reader reader = System.in.newReader()
|
||||||
|
writer = proc.getOutputStream().newWriter()
|
||||||
|
try {
|
||||||
|
while (proc.alive) {
|
||||||
|
String s = reader.readLine()
|
||||||
|
writer.write(s + "\n")
|
||||||
|
writer.flush()
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
// Ignored
|
||||||
|
}
|
||||||
|
})
|
||||||
|
inputThread.setName("${serverName} - InputThread")
|
||||||
|
inputThread.start()
|
||||||
|
|
||||||
|
gradle.buildFinished { buildResult ->
|
||||||
|
if (!proc.alive) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
writer = proc.getOutputStream().newWriter()
|
||||||
|
writer.write("stop\n")
|
||||||
|
writer.flush()
|
||||||
|
awaitClose(proc, outputThread, inputThread)
|
||||||
|
}
|
||||||
|
awaitClose(proc, outputThread, inputThread)
|
||||||
|
};
|
||||||
|
|
||||||
|
private static def awaitClose(Process proc, Thread outputThread, Thread inputThread) {
|
||||||
|
while (proc.alive) {
|
||||||
|
Thread.sleep(10)
|
||||||
|
}
|
||||||
|
proc.closeStreams()
|
||||||
|
outputThread.interrupt()
|
||||||
|
inputThread.interrupt()
|
||||||
|
}
|
||||||
|
|
||||||
|
private def answer(String question) {
|
||||||
|
while (System.in.available() > 0) System.in.read()
|
||||||
|
println(question)
|
||||||
|
boolean valid = "Yy".contains(((char) System.in.read()).toString())
|
||||||
|
while (System.in.available() > 0) System.in.read()
|
||||||
|
return valid
|
||||||
}
|
}
|
@ -1,86 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
import datetime
|
|
||||||
import os
|
|
||||||
import shutil
|
|
||||||
import sys
|
|
||||||
import tarfile
|
|
||||||
from os import path
|
|
||||||
|
|
||||||
# Non stdlib
|
|
||||||
from nbt import nbt
|
|
||||||
from ruamel.yaml import YAML
|
|
||||||
yaml = YAML()
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
configfile = f'/configs/GameModes/{sys.argv[1]}'
|
|
||||||
version = int(sys.argv[2])
|
|
||||||
worldname = sys.argv[3]
|
|
||||||
|
|
||||||
with open(configfile, 'r') as file:
|
|
||||||
gamemode = yaml.load(file)
|
|
||||||
|
|
||||||
builderworld = path.expanduser(f'~/builder{version}/{worldname}')
|
|
||||||
arenaworld = f'/servers/{gamemode["Server"]["Folder"]}/arenas/{worldname}'
|
|
||||||
|
|
||||||
if path.exists(arenaworld):
|
|
||||||
backupworld = path.expanduser(f'~/backup/arenas/{datetime.datetime.now()}-{worldname}-{version}.tar.xz')
|
|
||||||
with tarfile.open(backupworld, 'w:xz') as tar:
|
|
||||||
tar.add(arenaworld, arcname=worldname)
|
|
||||||
|
|
||||||
shutil.rmtree(arenaworld)
|
|
||||||
else:
|
|
||||||
gamemode['Server']['Maps'].append(worldname)
|
|
||||||
|
|
||||||
with open(configfile, 'w') as file:
|
|
||||||
yaml.dump(gamemode, file)
|
|
||||||
|
|
||||||
|
|
||||||
level = nbt.NBTFile(f'{builderworld}/level.dat')
|
|
||||||
level['Data']['Difficulty'] = nbt.TAG_Byte(2)
|
|
||||||
gameRules = level['Data']['GameRules']
|
|
||||||
gameRules['announceAdvancements'] = nbt.TAG_String('false')
|
|
||||||
gameRules['disableRaids'] = nbt.TAG_String('true')
|
|
||||||
gameRules['doDaylightCycle'] = nbt.TAG_String('false')
|
|
||||||
gameRules['doEntityDrops'] = nbt.TAG_String('false')
|
|
||||||
gameRules['doFireTick'] = nbt.TAG_String('true')
|
|
||||||
gameRules['doImmediateRespawn'] = nbt.TAG_String('true')
|
|
||||||
gameRules['doInsomnia'] = nbt.TAG_String('false')
|
|
||||||
gameRules['doLimitedCrafting'] = nbt.TAG_String('false')
|
|
||||||
gameRules['doMobLoot'] = nbt.TAG_String('false')
|
|
||||||
gameRules['doMobSpawning'] = nbt.TAG_String('false')
|
|
||||||
gameRules['doPatrolSpawning'] = nbt.TAG_String('false')
|
|
||||||
gameRules['doTileDrops'] = nbt.TAG_String('true')
|
|
||||||
gameRules['doTraderSpawning'] = nbt.TAG_String('false')
|
|
||||||
gameRules['doWardenSpawning'] = nbt.TAG_String('false')
|
|
||||||
gameRules['doWeatherCycle'] = nbt.TAG_String('false')
|
|
||||||
gameRules['drowningDamage'] = nbt.TAG_String('true')
|
|
||||||
gameRules['fallDamage'] = nbt.TAG_String('true')
|
|
||||||
gameRules['fireDamage'] = nbt.TAG_String('true')
|
|
||||||
gameRules['freezeDamage'] = nbt.TAG_String('true')
|
|
||||||
gameRules['keepInventory'] = nbt.TAG_String('true')
|
|
||||||
gameRules['lavaSourceConversion'] = nbt.TAG_String('false')
|
|
||||||
gameRules['maxEntityCramming'] = nbt.TAG_String('24')
|
|
||||||
gameRules['mobGriefing'] = nbt.TAG_String('false')
|
|
||||||
gameRules['naturalRegeneration'] = nbt.TAG_String('false')
|
|
||||||
gameRules['randomTickSpeed'] = nbt.TAG_String('3')
|
|
||||||
gameRules['reducedDebugInfo'] = nbt.TAG_String('true')
|
|
||||||
gameRules['snowAccumulationHeight'] = nbt.TAG_String('1')
|
|
||||||
gameRules['spawnRadius'] = nbt.TAG_String('0')
|
|
||||||
gameRules['spectatorsGenerateChunks'] = nbt.TAG_String('true')
|
|
||||||
gameRules['waterSourceConversion'] = nbt.TAG_String('true')
|
|
||||||
level.write_file()
|
|
||||||
|
|
||||||
if path.exists(arenaworld):
|
|
||||||
shutil.rmtree(arenaworld)
|
|
||||||
|
|
||||||
os.makedirs(f'{arenaworld}/backup')
|
|
||||||
shutil.copy2(f'{builderworld}/level.dat', f'{arenaworld}/backup/level.dat')
|
|
||||||
shutil.copytree(f'{builderworld}/region', f'{arenaworld}/backup/region')
|
|
||||||
|
|
||||||
shutil.copy2(f'{builderworld}/level.dat', f'{arenaworld}/level.dat')
|
|
||||||
shutil.copytree(f'{builderworld}/region', f'{arenaworld}/region')
|
|
||||||
shutil.copy2(f'{builderworld}/config.yml', f'{arenaworld}/config.yml')
|
|
||||||
|
|
||||||
if path.exists(f'{builderworld}/paper-world.yml'):
|
|
||||||
shutil.copy2(f'{builderworld}/paper-world.yml', f'{arenaworld}/backup/paper-world.yml')
|
|
||||||
shutil.copy2(f'{builderworld}/paper-world.yml', f'{arenaworld}/paper-world.yml')
|
|
2
gradle/wrapper/gradle-wrapper.properties
vendored
2
gradle/wrapper/gradle-wrapper.properties
vendored
@ -1,5 +1,5 @@
|
|||||||
#Sat Apr 10 23:34:12 CEST 2021
|
#Sat Apr 10 23:34:12 CEST 2021
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.1-all.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.1-all.zip
|
||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
zipStorePath=wrapper/dists
|
zipStorePath=wrapper/dists
|
||||||
|
@ -17,15 +17,6 @@
|
|||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
pluginManagement {
|
rootProject.name = 'BungeeCore'
|
||||||
repositories {
|
|
||||||
gradlePluginPortal()
|
|
||||||
maven {
|
|
||||||
url = uri("https://steamwar.de/maven/")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
rootProject.name = 'VelocityCore'
|
|
||||||
|
|
||||||
include 'CommonCore'
|
include 'CommonCore'
|
@ -19,9 +19,11 @@
|
|||||||
|
|
||||||
package de.steamwar.bungeecore;
|
package de.steamwar.bungeecore;
|
||||||
|
|
||||||
import de.steamwar.sql.SchematicType;
|
import de.steamwar.bungeecore.sql.SchematicType;
|
||||||
import org.simpleyaml.configuration.Configuration;
|
import net.md_5.bungee.api.ProxyServer;
|
||||||
import org.simpleyaml.configuration.file.YamlFile;
|
import net.md_5.bungee.config.Configuration;
|
||||||
|
import net.md_5.bungee.config.ConfigurationProvider;
|
||||||
|
import net.md_5.bungee.config.YamlConfiguration;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
@ -30,29 +32,19 @@ import java.util.stream.Collectors;
|
|||||||
|
|
||||||
public class ArenaMode {
|
public class ArenaMode {
|
||||||
|
|
||||||
private static final Random random = new Random();
|
|
||||||
|
|
||||||
private static final Map<String, ArenaMode> byChat = new HashMap<>();
|
private static final Map<String, ArenaMode> byChat = new HashMap<>();
|
||||||
private static final Map<String, ArenaMode> byInternal = new HashMap<>();
|
private static final Map<String, ArenaMode> byInternal = new HashMap<>();
|
||||||
private static final Map<SchematicType, ArenaMode> bySchemType = new HashMap<>();
|
private static final Map<SchematicType, ArenaMode> bySchemType = new HashMap<>();
|
||||||
private static final List<ArenaMode> allModes = new LinkedList<>();
|
private static final List<ArenaMode> allModes = new LinkedList<>();
|
||||||
|
private static final Random random = new Random();
|
||||||
|
|
||||||
static {
|
static {
|
||||||
init();
|
File folder = new File(ProxyServer.getInstance().getPluginsFolder(), "FightSystem");
|
||||||
}
|
|
||||||
|
|
||||||
public static void init() {
|
|
||||||
byChat.clear();
|
|
||||||
byInternal.clear();
|
|
||||||
bySchemType.clear();
|
|
||||||
allModes.clear();
|
|
||||||
|
|
||||||
File folder = new File(VelocityCore.get().getDataDirectory().getParent().toFile(), "FightSystem");
|
|
||||||
|
|
||||||
for(File configFile : Arrays.stream(folder.listFiles((file, name) -> name.endsWith(".yml") && !name.endsWith(".kits.yml"))).sorted().collect(Collectors.toList())) {
|
for(File configFile : Arrays.stream(folder.listFiles((file, name) -> name.endsWith(".yml") && !name.endsWith(".kits.yml"))).sorted().collect(Collectors.toList())) {
|
||||||
Configuration config;
|
Configuration config;
|
||||||
try {
|
try {
|
||||||
config = YamlFile.loadConfiguration(configFile);
|
config = ConfigurationProvider.getProvider(YamlConfiguration.class).load(configFile);
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
throw new SecurityException("Could not load SchematicTypes", e);
|
throw new SecurityException("Could not load SchematicTypes", e);
|
||||||
}
|
}
|
||||||
@ -102,7 +94,6 @@ public class ArenaMode {
|
|||||||
private final String serverJar;
|
private final String serverJar;
|
||||||
private final String config;
|
private final String config;
|
||||||
private final List<String> maps;
|
private final List<String> maps;
|
||||||
private final Map<String, String> lowerToRealMapNames = new HashMap<>();
|
|
||||||
private final boolean historic;
|
private final boolean historic;
|
||||||
private final String internalName;
|
private final String internalName;
|
||||||
|
|
||||||
@ -115,7 +106,6 @@ public class ArenaMode {
|
|||||||
this.serverJar = config.getString("Server.ServerJar");
|
this.serverJar = config.getString("Server.ServerJar");
|
||||||
this.config = internalName + ".yml";
|
this.config = internalName + ".yml";
|
||||||
this.maps = config.getStringList("Server.Maps");
|
this.maps = config.getStringList("Server.Maps");
|
||||||
maps.forEach(map -> lowerToRealMapNames.put(map.toLowerCase(), map));
|
|
||||||
this.displayName = config.getString("GameName", internalName);
|
this.displayName = config.getString("GameName", internalName);
|
||||||
this.chatNames = config.getStringList("Server.ChatNames");
|
this.chatNames = config.getStringList("Server.ChatNames");
|
||||||
this.schemType = config.getString("Schematic.Type", "").toLowerCase();
|
this.schemType = config.getString("Schematic.Type", "").toLowerCase();
|
||||||
@ -165,10 +155,6 @@ public class ArenaMode {
|
|||||||
return maps;
|
return maps;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String convertToRealMapName(String map){
|
|
||||||
return lowerToRealMapNames.get(map.toLowerCase());
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getChatName(){
|
public String getChatName(){
|
||||||
return chatNames.get(0);
|
return chatNames.get(0);
|
||||||
}
|
}
|
||||||
|
@ -19,8 +19,7 @@
|
|||||||
|
|
||||||
package de.steamwar.bungeecore;
|
package de.steamwar.bungeecore;
|
||||||
|
|
||||||
import de.steamwar.messages.ChatSender;
|
import net.md_5.bungee.api.ProxyServer;
|
||||||
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
|
|
||||||
|
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
@ -30,15 +29,14 @@ class Broadcaster {
|
|||||||
private int lastBroadCast = 0;
|
private int lastBroadCast = 0;
|
||||||
|
|
||||||
Broadcaster(){
|
Broadcaster(){
|
||||||
VelocityCore.get().getProxyServer().getScheduler().buildTask(VelocityCore.get(), () -> {
|
ProxyServer.getInstance().getScheduler().schedule(BungeeCore.get(), () -> {
|
||||||
if(!VelocityCore.get().getProxyServer().getAllPlayers().isEmpty() && broadCastMsgs.length > 0) {
|
if(!ProxyServer.getInstance().getPlayers().isEmpty())
|
||||||
VelocityCore.get().getProxyServer().sendMessage(LegacyComponentSerializer.legacySection().deserialize(VelocityCore.CHAT_PREFIX + broadCastMsgs[lastBroadCast]));
|
BungeeCore.broadcast(BungeeCore.CHAT_PREFIX + broadCastMsgs[lastBroadCast]);
|
||||||
}
|
|
||||||
lastBroadCast++;
|
lastBroadCast++;
|
||||||
if(lastBroadCast == broadCastMsgs.length){
|
if(lastBroadCast == broadCastMsgs.length){
|
||||||
lastBroadCast = 0;
|
lastBroadCast = 0;
|
||||||
}
|
}
|
||||||
}).repeat(10, TimeUnit.MINUTES);
|
}, 10, 10, TimeUnit.MINUTES);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void setBroadCastMsgs(String[] broadCastMsgs) {
|
static void setBroadCastMsgs(String[] broadCastMsgs) {
|
||||||
|
@ -19,127 +19,82 @@
|
|||||||
|
|
||||||
package de.steamwar.bungeecore;
|
package de.steamwar.bungeecore;
|
||||||
|
|
||||||
import com.google.inject.Inject;
|
|
||||||
import com.google.inject.Injector;
|
|
||||||
import com.velocitypowered.api.event.Subscribe;
|
|
||||||
import com.velocitypowered.api.event.proxy.ProxyInitializeEvent;
|
|
||||||
import com.velocitypowered.api.event.proxy.ProxyReloadEvent;
|
|
||||||
import com.velocitypowered.api.plugin.Plugin;
|
|
||||||
import com.velocitypowered.api.plugin.annotation.DataDirectory;
|
|
||||||
import com.velocitypowered.api.proxy.Player;
|
|
||||||
import com.velocitypowered.api.proxy.ProxyServer;
|
|
||||||
import de.steamwar.bungeecore.bot.SteamwarDiscordBot;
|
import de.steamwar.bungeecore.bot.SteamwarDiscordBot;
|
||||||
import de.steamwar.bungeecore.bot.config.SteamwarDiscordBotConfig;
|
import de.steamwar.bungeecore.bot.config.SteamwarDiscordBotConfig;
|
||||||
import de.steamwar.bungeecore.commands.*;
|
import de.steamwar.bungeecore.commands.*;
|
||||||
|
import de.steamwar.bungeecore.comms.SpigotReceiver;
|
||||||
import de.steamwar.bungeecore.listeners.*;
|
import de.steamwar.bungeecore.listeners.*;
|
||||||
import de.steamwar.bungeecore.mods.ServerListPing;
|
import de.steamwar.bungeecore.listeners.mods.*;
|
||||||
import de.steamwar.bungeecore.mods.*;
|
import de.steamwar.bungeecore.sql.*;
|
||||||
import de.steamwar.bungeecore.network.BungeeNetworkHandler;
|
import net.md_5.bungee.api.ChatMessageType;
|
||||||
import de.steamwar.bungeecore.tablist.TablistManager;
|
import net.md_5.bungee.api.CommandSender;
|
||||||
import de.steamwar.bungeecore.util.SteamWarModule;
|
import net.md_5.bungee.api.ProxyServer;
|
||||||
import de.steamwar.bungeecore.util.annotations.Create;
|
import net.md_5.bungee.api.chat.ClickEvent;
|
||||||
import de.steamwar.command.SWCommandUtils;
|
import net.md_5.bungee.api.chat.HoverEvent;
|
||||||
import de.steamwar.command.SWTypeMapperCreator;
|
import net.md_5.bungee.api.chat.TextComponent;
|
||||||
import de.steamwar.command.TabCompletionCache;
|
import net.md_5.bungee.api.config.ServerInfo;
|
||||||
import de.steamwar.command.TypeMapper;
|
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
||||||
import de.steamwar.sql.Punishment;
|
import net.md_5.bungee.api.plugin.Plugin;
|
||||||
import de.steamwar.sql.SteamwarUser;
|
import net.md_5.bungee.config.Configuration;
|
||||||
import de.steamwar.sql.Team;
|
import net.md_5.bungee.config.ConfigurationProvider;
|
||||||
import de.steamwar.sql.UserElo;
|
import net.md_5.bungee.config.YamlConfiguration;
|
||||||
import de.steamwar.sql.internal.Statement;
|
|
||||||
import lombok.Getter;
|
|
||||||
import org.reflections.Reflections;
|
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.nio.file.Path;
|
import java.util.HashMap;
|
||||||
import java.util.*;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import java.util.logging.Logger;
|
|
||||||
|
|
||||||
@Plugin(
|
public class BungeeCore extends Plugin {
|
||||||
id = "velocitycore",
|
|
||||||
name = "VelocityCore",
|
|
||||||
authors = {"SteamWar"}
|
|
||||||
)
|
|
||||||
public class VelocityCore {
|
|
||||||
|
|
||||||
public static boolean MAIN_SERVER;
|
|
||||||
|
|
||||||
public static String CHAT_PREFIX;
|
public static String CHAT_PREFIX;
|
||||||
|
public static String WORLD_FOLDER;
|
||||||
|
public static String BAUWELT_PROTOTYP;
|
||||||
public static String LOBBY_SERVER;
|
public static String LOBBY_SERVER;
|
||||||
|
public static String USERWORLDS15;
|
||||||
|
public static String BAUWELT15;
|
||||||
public static boolean EVENT_MODE;
|
public static boolean EVENT_MODE;
|
||||||
|
|
||||||
private static VelocityCore instance;
|
private static BungeeCore instance;
|
||||||
|
|
||||||
|
public static final Map<String, String> serverPermissions = new HashMap<>();
|
||||||
|
public static final Map<String, String> commands = new HashMap<>();
|
||||||
|
|
||||||
private ErrorLogger errorLogger;
|
private ErrorLogger errorLogger;
|
||||||
private TablistManager tablistManager;
|
|
||||||
|
|
||||||
@Getter
|
@Override
|
||||||
private final ProxyServer proxyServer;
|
public void onEnable(){
|
||||||
|
getProxy().registerChannel("sw:bridge");
|
||||||
|
getProxy().registerChannel("fabricmodsender:mods");
|
||||||
|
|
||||||
@Getter
|
|
||||||
private final Logger logger;
|
|
||||||
|
|
||||||
@Getter
|
|
||||||
private final Path dataDirectory;
|
|
||||||
|
|
||||||
@Getter
|
|
||||||
private Injector injector;
|
|
||||||
|
|
||||||
@Inject
|
|
||||||
public VelocityCore(ProxyServer proxyServer, Logger logger, @DataDirectory Path dataDirectory, Injector injector) {
|
|
||||||
this.proxyServer = proxyServer;
|
|
||||||
this.logger = logger;
|
|
||||||
this.dataDirectory = dataDirectory;
|
|
||||||
this.injector = injector;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Subscribe
|
|
||||||
public void onProxyInitialization(ProxyInitializeEvent event) {
|
|
||||||
setInstance(this);
|
setInstance(this);
|
||||||
MAIN_SERVER = proxyServer.getBoundAddress().getPort() == 25565;
|
|
||||||
loadConfig();
|
loadConfig();
|
||||||
|
|
||||||
injector = injector.createChildInjector(new SteamWarModule(this));
|
|
||||||
|
|
||||||
errorLogger = new ErrorLogger();
|
errorLogger = new ErrorLogger();
|
||||||
|
|
||||||
SWCommandUtils.init((SWTypeMapperCreator<TypeMapper<Object>, Player, Object>) (mapper, tabCompleter) -> new TypeMapper<Object>() {
|
|
||||||
@Override
|
|
||||||
public Object map(Player commandSender, String[] previousArguments, String s) {
|
|
||||||
return mapper.apply(s);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Collection<String> tabCompletes(Player sender, String[] previousArguments, String s) {
|
|
||||||
return tabCompleter.apply(sender, s);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
proxyServer.getScheduler().buildTask(this, TabCompletionCache::invalidateOldEntries).repeat(1, TimeUnit.SECONDS);
|
|
||||||
|
|
||||||
Reflections reflections = new Reflections("de.steamwar.bungeecore");
|
|
||||||
reflections.getTypesAnnotatedWith(Create.class)
|
|
||||||
.forEach(clazz -> {
|
|
||||||
Create create = clazz.getAnnotation(Create.class);
|
|
||||||
if (create.eventProxy() || MAIN_SERVER) {
|
|
||||||
Object obj = injector.getInstance(clazz);
|
|
||||||
if (Arrays.stream(clazz.getDeclaredMethods()).anyMatch(method -> method.isAnnotationPresent(Subscribe.class))) {
|
|
||||||
proxyServer.getEventManager().register(this, obj);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
new ConnectionListener();
|
new ConnectionListener();
|
||||||
|
new Forge();
|
||||||
|
new Forge12();
|
||||||
|
new LabyMod();
|
||||||
|
new Badlion();
|
||||||
new ChatListener();
|
new ChatListener();
|
||||||
new BanListener();
|
new BanListener();
|
||||||
new CheckListener();
|
new CheckListener();
|
||||||
new IPSanitizer();
|
new ModLoaderBlocker();
|
||||||
|
new WorldDownloader();
|
||||||
|
new BrandListener();
|
||||||
|
new Fabric();
|
||||||
|
new SubserverProtocolFixer();
|
||||||
|
|
||||||
if(MAIN_SERVER) {
|
new Node.LocalNode();
|
||||||
//new Node.RemoteNode("lx");
|
//new Node.RemoteNode("lx");
|
||||||
}
|
//new Node.RemoteNode("az");
|
||||||
|
|
||||||
|
commands.put("/tp", null);
|
||||||
|
commands.put("/bc", null);
|
||||||
|
commands.put("/bauchat", null);
|
||||||
|
commands.put("/local", null);
|
||||||
|
|
||||||
new TeamchatCommand();
|
new TeamchatCommand();
|
||||||
new MsgCommand();
|
new MsgCommand();
|
||||||
@ -149,7 +104,7 @@ public class VelocityCore {
|
|||||||
new KickCommand();
|
new KickCommand();
|
||||||
new JoinmeCommand();
|
new JoinmeCommand();
|
||||||
new TpCommand();
|
new TpCommand();
|
||||||
HelpCommand helpCommand = new HelpCommand();
|
new HelpCommand();
|
||||||
new TeamCommand();
|
new TeamCommand();
|
||||||
new ServerTeamchatCommand();
|
new ServerTeamchatCommand();
|
||||||
new DevCommand();
|
new DevCommand();
|
||||||
@ -172,9 +127,6 @@ public class VelocityCore {
|
|||||||
new RankCommand();
|
new RankCommand();
|
||||||
new LocalCommand();
|
new LocalCommand();
|
||||||
new SetLocaleCommand();
|
new SetLocaleCommand();
|
||||||
new BuilderCloudCommand();
|
|
||||||
|
|
||||||
new ModCommand();
|
|
||||||
|
|
||||||
// Punishment Commands:
|
// Punishment Commands:
|
||||||
new PunishmentCommand("ban", Punishment.PunishmentType.Ban);
|
new PunishmentCommand("ban", Punishment.PunishmentType.Ban);
|
||||||
@ -188,8 +140,8 @@ public class VelocityCore {
|
|||||||
new PunishmentCommand("note", Punishment.PunishmentType.Note);
|
new PunishmentCommand("note", Punishment.PunishmentType.Note);
|
||||||
|
|
||||||
if(!EVENT_MODE){
|
if(!EVENT_MODE){
|
||||||
new BauCommand(helpCommand);
|
new BauCommand();
|
||||||
new WebpasswordCommand();
|
new WebregisterCommand();
|
||||||
new FightCommand();
|
new FightCommand();
|
||||||
new ChallengeCommand();
|
new ChallengeCommand();
|
||||||
new HistoricCommand();
|
new HistoricCommand();
|
||||||
@ -204,15 +156,15 @@ public class VelocityCore {
|
|||||||
|
|
||||||
new EventStarter();
|
new EventStarter();
|
||||||
new SessionManager();
|
new SessionManager();
|
||||||
BungeeNetworkHandler.register();
|
new SpigotReceiver();
|
||||||
tablistManager = new TablistManager();
|
new TablistManager();
|
||||||
new SettingsChangedListener();
|
new SettingsChangedListener();
|
||||||
|
|
||||||
proxyServer.getScheduler().buildTask(this, () -> {
|
getProxy().getScheduler().schedule(this, () -> {
|
||||||
SteamwarUser.clear();
|
SteamwarUser.clearCache();
|
||||||
UserElo.clear();
|
UserElo.clearCache();
|
||||||
Team.clear();
|
Team.clearCache();
|
||||||
}).repeat(1, TimeUnit.HOURS);
|
}, 1, 1, TimeUnit.HOURS);
|
||||||
|
|
||||||
if (SteamwarDiscordBotConfig.loaded) {
|
if (SteamwarDiscordBotConfig.loaded) {
|
||||||
try {
|
try {
|
||||||
@ -223,8 +175,8 @@ public class VelocityCore {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Subscribe
|
@Override
|
||||||
public void onDisable(ProxyReloadEvent event) {
|
public void onDisable(){
|
||||||
if (SteamwarDiscordBotConfig.loaded) {
|
if (SteamwarDiscordBotConfig.loaded) {
|
||||||
try {
|
try {
|
||||||
SteamwarDiscordBot.instance().getJda().shutdown();
|
SteamwarDiscordBot.instance().getJda().shutdown();
|
||||||
@ -233,16 +185,67 @@ public class VelocityCore {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(tablistManager != null)
|
|
||||||
tablistManager.disable();
|
|
||||||
errorLogger.unregister();
|
errorLogger.unregister();
|
||||||
Statement.closeAll();
|
Statement.closeAll();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static VelocityCore get() {
|
public static BungeeCore get() {
|
||||||
return instance;
|
return instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static TextComponent stringToText(String msg){
|
||||||
|
return new TextComponent(TextComponent.fromLegacyText(msg));
|
||||||
|
}
|
||||||
|
public static void send(ProxiedPlayer player, String msg){
|
||||||
|
send(player, msg, null, null);
|
||||||
|
}
|
||||||
|
public static void send(CommandSender sender, String msg){
|
||||||
|
sender.sendMessage(stringToText(msg));
|
||||||
|
}
|
||||||
|
public static void send(ProxiedPlayer player, ChatMessageType type, String msg){
|
||||||
|
send(player, type, msg, null, null);
|
||||||
|
}
|
||||||
|
public static void send(ProxiedPlayer player, String msg, String onHover, ClickEvent onClick){
|
||||||
|
send(player, ChatMessageType.SYSTEM, msg, onHover, onClick);
|
||||||
|
}
|
||||||
|
public static void send(ProxiedPlayer player, ChatMessageType type, String msg, String onHover, ClickEvent onClick){
|
||||||
|
if(type == ChatMessageType.CHAT && player.getChatMode() != ProxiedPlayer.ChatMode.SHOWN)
|
||||||
|
return;
|
||||||
|
TextComponent message = stringToText(msg);
|
||||||
|
if(onHover != null)
|
||||||
|
message.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, TextComponent.fromLegacyText(onHover)));
|
||||||
|
if(onClick != null)
|
||||||
|
message.setClickEvent(onClick);
|
||||||
|
player.sendMessage(type, message);
|
||||||
|
}
|
||||||
|
public static void broadcast(String msg){
|
||||||
|
ProxyServer.getInstance().broadcast(stringToText(msg));
|
||||||
|
}
|
||||||
|
public static void broadcast(String msg, String onHover, ClickEvent onClick){
|
||||||
|
TextComponent message = stringToText(msg);
|
||||||
|
if(onHover != null)
|
||||||
|
message.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, TextComponent.fromLegacyText(onHover)));
|
||||||
|
if(onClick != null)
|
||||||
|
message.setClickEvent(onClick);
|
||||||
|
ProxyServer.getInstance().broadcast(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void log(final ServerInfo server, final String msg){
|
||||||
|
log(server.getName() + ": " + msg);
|
||||||
|
}
|
||||||
|
public static void log(final ProxiedPlayer player, final String msg){
|
||||||
|
log(player.getName() + ": " + msg);
|
||||||
|
}
|
||||||
|
public static void log(final String msg){
|
||||||
|
log(Level.INFO, msg);
|
||||||
|
}
|
||||||
|
public static void log(final Level logLevel, final String msg){
|
||||||
|
get().getLogger().log(logLevel, msg);
|
||||||
|
}
|
||||||
|
public static void log(final String msg, final Throwable e){
|
||||||
|
get().getLogger().log(Level.SEVERE, msg, e);
|
||||||
|
}
|
||||||
|
|
||||||
private static void loadConfig(){
|
private static void loadConfig(){
|
||||||
Configuration config;
|
Configuration config;
|
||||||
try{
|
try{
|
||||||
@ -265,38 +268,40 @@ public class VelocityCore {
|
|||||||
}
|
}
|
||||||
|
|
||||||
CHAT_PREFIX = config.getString("prefix");
|
CHAT_PREFIX = config.getString("prefix");
|
||||||
|
WORLD_FOLDER = config.getString("worldfolder");
|
||||||
|
BAUWELT_PROTOTYP = config.getString("bauweltprototyp");
|
||||||
LOBBY_SERVER = config.getString("lobbyserver");
|
LOBBY_SERVER = config.getString("lobbyserver");
|
||||||
|
USERWORLDS15 = config.getString("userworlds15");
|
||||||
|
BAUWELT15 = config.getString("bauwelt15");
|
||||||
EVENT_MODE = config.getBoolean("eventmode");
|
EVENT_MODE = config.getBoolean("eventmode");
|
||||||
Broadcaster.setBroadCastMsgs(config.getStringList("broadcasts").toArray(new String[1]));
|
Broadcaster.setBroadCastMsgs(config.getStringList("broadcasts").toArray(new String[1]));
|
||||||
PollSystem.init(config.getString("poll.question"), config.getStringList("poll.answers"));
|
PollSystem.init(config.getString("poll.question"), config.getStringList("poll.answers"));
|
||||||
|
Persistent.setChatPrefix(CHAT_PREFIX);
|
||||||
|
Persistent.setLobbyServer(LOBBY_SERVER);
|
||||||
|
|
||||||
|
if (config.contains("discord")) {
|
||||||
|
SteamwarDiscordBotConfig.loadConfig(config.getSection("discord"));
|
||||||
|
}
|
||||||
|
|
||||||
final Configuration servers = config.getSection("servers");
|
final Configuration servers = config.getSection("servers");
|
||||||
for(final String serverName : servers.getKeys()){
|
for(final String serverName : servers.getKeys()){
|
||||||
final Configuration server = servers.getSection(serverName);
|
final Configuration server = servers.getSection(serverName);
|
||||||
List<String> cmds = server.getStringList("commands");
|
List<String> cmds = server.getStringList("commands");
|
||||||
|
serverPermissions.put(serverName, "bungeecore.server." + server.getString("permission"));
|
||||||
String cmd = cmds.remove(0);
|
String cmd = cmds.remove(0);
|
||||||
|
|
||||||
if(server.contains("spectatePort"))
|
|
||||||
EventStarter.addSpectateServer(server.getInt("spectatePort"), cmd);
|
|
||||||
|
|
||||||
new ServerSwitchCommand(
|
new ServerSwitchCommand(
|
||||||
cmd,
|
cmd,
|
||||||
serverName,
|
serverName,
|
||||||
|
serverPermissions.get(serverName),
|
||||||
cmds.toArray(new String[0])
|
cmds.toArray(new String[0])
|
||||||
);
|
);
|
||||||
}
|
if(server.getBoolean("modchecked", false)) {
|
||||||
|
ModLoaderBlocker.addServer(serverName);
|
||||||
File discordFile = new File(System.getProperty("user.home"), "discord.yml");
|
|
||||||
if(discordFile.exists() && !EVENT_MODE) {
|
|
||||||
try {
|
|
||||||
SteamwarDiscordBotConfig.loadConfig(ConfigurationProvider.getProvider(YamlConfiguration.class).load(discordFile));
|
|
||||||
} catch (IOException e) {
|
|
||||||
get().getLogger().log(Level.SEVERE, "Could not load discord bot configuration", e);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void setInstance(VelocityCore core){
|
private static void setInstance(BungeeCore core){
|
||||||
instance = core;
|
instance = core;
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -19,7 +19,7 @@
|
|||||||
|
|
||||||
package de.steamwar.bungeecore;
|
package de.steamwar.bungeecore;
|
||||||
|
|
||||||
import de.steamwar.sql.SWException;
|
import de.steamwar.bungeecore.sql.SWException;
|
||||||
|
|
||||||
import java.io.ByteArrayOutputStream;
|
import java.io.ByteArrayOutputStream;
|
||||||
import java.io.PrintStream;
|
import java.io.PrintStream;
|
||||||
@ -33,6 +33,7 @@ import java.util.logging.LogRecord;
|
|||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
public class ErrorLogger extends Handler {
|
public class ErrorLogger extends Handler {
|
||||||
|
private int ddosRate = 0;
|
||||||
|
|
||||||
ErrorLogger(){
|
ErrorLogger(){
|
||||||
Logger.getLogger("").addHandler(this);
|
Logger.getLogger("").addHandler(this);
|
||||||
@ -56,12 +57,17 @@ public class ErrorLogger extends Handler {
|
|||||||
if(logRecord.getThrown() != null)
|
if(logRecord.getThrown() != null)
|
||||||
logRecord.getThrown().printStackTrace(new PrintStream(stacktraceOutput));
|
logRecord.getThrown().printStackTrace(new PrintStream(stacktraceOutput));
|
||||||
String stacktrace = stacktraceOutput.toString();
|
String stacktrace = stacktraceOutput.toString();
|
||||||
if (stacktrace.contains("ErrorLogger")) {
|
if(stacktrace.contains("Cannot request protocol")) {
|
||||||
|
if(++ddosRate % 1000 == 0) {
|
||||||
|
SWException.log("Bungee", "DDOS", ddosRate + "");
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
} else if (stacktrace.contains("ErrorLogger")) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
SWException.log(message, stacktrace);
|
SWException.log("Bungee", message, stacktrace);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -80,14 +86,9 @@ public class ErrorLogger extends Handler {
|
|||||||
List<String> contains = new ArrayList<>();
|
List<String> contains = new ArrayList<>();
|
||||||
contains.add("Error authenticating ");
|
contains.add("Error authenticating ");
|
||||||
contains.add("read timed out");
|
contains.add("read timed out");
|
||||||
contains.add("could not decode packet");
|
|
||||||
contains.add("Connection reset by peer");
|
contains.add("Connection reset by peer");
|
||||||
contains.add("No client connected for pending server");
|
contains.add("No client connected for pending server");
|
||||||
contains.add("Error occurred processing connection for");
|
contains.add("Error occurred processing connection for");
|
||||||
contains.add("Server is online mode!");
|
|
||||||
contains.add(" took ");
|
|
||||||
contains.add("Could not translate packet ");
|
|
||||||
contains.add("455420");
|
|
||||||
ignoreContains = Collections.unmodifiableList(contains);
|
ignoreContains = Collections.unmodifiableList(contains);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,37 +19,42 @@
|
|||||||
|
|
||||||
package de.steamwar.bungeecore;
|
package de.steamwar.bungeecore;
|
||||||
|
|
||||||
import de.steamwar.sql.EventFight;
|
import de.steamwar.bungeecore.sql.Event;
|
||||||
import de.steamwar.sql.Team;
|
import de.steamwar.bungeecore.sql.EventFight;
|
||||||
import net.kyori.adventure.text.event.ClickEvent;
|
import de.steamwar.bungeecore.sql.SteamwarUser;
|
||||||
|
import de.steamwar.bungeecore.sql.Team;
|
||||||
|
import net.md_5.bungee.api.ProxyServer;
|
||||||
|
import net.md_5.bungee.api.chat.ClickEvent;
|
||||||
|
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
||||||
|
import net.md_5.bungee.api.scheduler.ScheduledTask;
|
||||||
|
|
||||||
import java.sql.Timestamp;
|
import java.sql.Timestamp;
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Queue;
|
import java.util.Queue;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
import static de.steamwar.bungeecore.Storage.eventServer;
|
import static de.steamwar.bungeecore.Storage.eventServer;
|
||||||
|
|
||||||
public class EventStarter {
|
public class EventStarter implements Runnable {
|
||||||
|
|
||||||
private static final Map<Integer, String> spectatePorts = new HashMap<>();
|
private static ScheduledTask task = null;
|
||||||
|
|
||||||
public static void addSpectateServer(int port, String command) {
|
EventStarter(){
|
||||||
spectatePorts.put(port, command);
|
|
||||||
}
|
|
||||||
|
|
||||||
public EventStarter() {
|
|
||||||
EventFight.loadAllComingFights();
|
EventFight.loadAllComingFights();
|
||||||
VelocityCore.get().getProxyServer().getScheduler().buildTask(VelocityCore.get(), this::run).repeat(10, TimeUnit.SECONDS);
|
|
||||||
|
if(task != null)
|
||||||
|
task.cancel();
|
||||||
|
|
||||||
|
ProxyServer.getInstance().getScheduler().schedule(BungeeCore.get(), this, 1, 10, TimeUnit.SECONDS);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Map<Integer, Subserver> getEventServer() {
|
public static Map<Integer, Subserver> getEventServer() {
|
||||||
return eventServer;
|
return eventServer;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void run() {
|
@Override
|
||||||
eventServer.entrySet().removeIf(entry -> Subserver.getSubserver(entry.getValue().getServer()) == null);
|
public void run() {
|
||||||
|
eventServer.entrySet().removeIf(entry -> !Subserver.getServerList().contains(entry.getValue()));
|
||||||
Queue<EventFight> fights = EventFight.getFights();
|
Queue<EventFight> fights = EventFight.getFights();
|
||||||
|
|
||||||
EventFight next;
|
EventFight next;
|
||||||
@ -58,19 +63,22 @@ public class EventStarter {
|
|||||||
Team red = Team.get(next.getTeamRed());
|
Team red = Team.get(next.getTeamRed());
|
||||||
|
|
||||||
//Don't start EventServer if not the event bungee
|
//Don't start EventServer if not the event bungee
|
||||||
if(VelocityCore.EVENT_MODE || next.getSpectatePort() == 0) {
|
if(BungeeCore.EVENT_MODE || !Event.get(next.getEventID()).spectateSystem()) {
|
||||||
ServerStarter starter = new ServerStarter().event(next);
|
ServerStarter starter = new ServerStarter().event(next);
|
||||||
|
|
||||||
starter.callback(subserver -> {
|
ProxiedPlayer leiter = ProxyServer.getInstance().getPlayer(SteamwarUser.get(next.getKampfleiter()).getUuid());
|
||||||
|
if(leiter != null)
|
||||||
|
starter.send(leiter);
|
||||||
|
|
||||||
|
Subserver subserver = starter.start();
|
||||||
|
|
||||||
eventServer.put(blue.getTeamId(), subserver);
|
eventServer.put(blue.getTeamId(), subserver);
|
||||||
eventServer.put(red.getTeamId(), subserver);
|
eventServer.put(red.getTeamId(), subserver);
|
||||||
}).start();
|
|
||||||
|
|
||||||
Message.broadcast("EVENT_FIGHT_BROADCAST", "EVENT_FIGHT_BROADCAST_HOVER",
|
Message.broadcast("EVENT_FIGHT_BROADCAST", "EVENT_FIGHT_BROADCAST_HOVER",
|
||||||
ClickEvent.runCommand("/event " + blue.getTeamKuerzel()), blue.getTeamColor(), blue.getTeamName(), red.getTeamColor(), red.getTeamName());
|
new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/event " + blue.getTeamKuerzel()), blue.getTeamColor(), blue.getTeamName(), red.getTeamColor(), red.getTeamName());
|
||||||
} else {
|
} else {
|
||||||
Message.broadcast("EVENT_FIGHT_BROADCAST", "EVENT_FIGHT_BROADCAST_HOVER",
|
Message.broadcast("EVENT_FIGHT_BROADCAST", "EVENT_FIGHT_BROADCAST_HOVER",
|
||||||
ClickEvent.runCommand("/" + spectatePorts.get(next.getSpectatePort())), blue.getTeamColor(), blue.getTeamName(), red.getTeamColor(), red.getTeamName());
|
new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/spectate"), blue.getTeamColor(), blue.getTeamName(), red.getTeamColor(), red.getTeamName());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,13 +19,12 @@
|
|||||||
|
|
||||||
package de.steamwar.bungeecore;
|
package de.steamwar.bungeecore;
|
||||||
|
|
||||||
import com.velocitypowered.api.command.CommandSource;
|
|
||||||
import de.steamwar.messages.ChatSender;
|
import de.steamwar.messages.ChatSender;
|
||||||
import de.steamwar.messages.SteamwarResourceBundle;
|
import de.steamwar.messages.SteamwarResourceBundle;
|
||||||
import net.kyori.adventure.identity.Identity;
|
import net.md_5.bungee.api.ChatMessageType;
|
||||||
import net.kyori.adventure.text.Component;
|
import net.md_5.bungee.api.CommandSender;
|
||||||
import net.kyori.adventure.text.event.ClickEvent;
|
import net.md_5.bungee.api.chat.ClickEvent;
|
||||||
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
|
import net.md_5.bungee.api.chat.TextComponent;
|
||||||
|
|
||||||
import java.text.DateFormat;
|
import java.text.DateFormat;
|
||||||
import java.text.MessageFormat;
|
import java.text.MessageFormat;
|
||||||
@ -36,17 +35,17 @@ import java.util.ResourceBundle;
|
|||||||
public class Message {
|
public class Message {
|
||||||
|
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public static Component parseToComponent(String message, boolean prefixed, CommandSource sender, Object... params){
|
public static TextComponent parseToComponent(String message, boolean prefixed, CommandSender sender, Object... params){
|
||||||
return LegacyComponentSerializer.legacySection().deserialize(parse(message, prefixed, locale(sender), params));
|
return new TextComponent(TextComponent.fromLegacyText(parse(message, prefixed, locale(sender), params)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public static String parsePrefixed(String message, CommandSource sender, Object... params){
|
public static String parsePrefixed(String message, CommandSender sender, Object... params){
|
||||||
return parse(message, true, locale(sender), params);
|
return parse(message, true, locale(sender), params);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public static String parse(String message, CommandSource sender, Object... params){
|
public static String parse(String message, CommandSender sender, Object... params){
|
||||||
return parse(message, false, locale(sender), params);
|
return parse(message, false, locale(sender), params);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -56,8 +55,8 @@ public class Message {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Deprecated
|
@Deprecated
|
||||||
private static Locale locale(CommandSource sender) {
|
private static Locale locale(CommandSender sender) {
|
||||||
return sender.get(Identity.LOCALE).orElse(Locale.GERMAN);
|
return ChatSender.of(sender).getLocale();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Deprecated
|
@Deprecated
|
||||||
@ -83,32 +82,32 @@ public class Message {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public static void send(String message, CommandSource sender, Object... params){
|
public static void send(String message, CommandSender sender, Object... params){
|
||||||
send(message, true, sender, null, null, params);
|
send(message, true, sender, ChatMessageType.SYSTEM, null, null, params);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public static void sendPrefixless(String message, CommandSource sender, Object... params){
|
public static void sendPrefixless(String message, CommandSender sender, Object... params){
|
||||||
send(message, false, sender, null, null, params);
|
send(message, false, sender, ChatMessageType.SYSTEM, null, null, params);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public static void send(String message, CommandSource sender, String onHover, ClickEvent onClick, Object... params){
|
public static void send(String message, CommandSender sender, String onHover, ClickEvent onClick, Object... params){
|
||||||
send(message, true, sender, onHover, onClick, params);
|
send(message, true, sender, ChatMessageType.SYSTEM, onHover, onClick, params);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public static void sendPrefixless(String message, CommandSource sender, String onHover, ClickEvent onClick, Object... params){
|
public static void sendPrefixless(String message, CommandSender sender, String onHover, ClickEvent onClick, Object... params){
|
||||||
send(message, false, sender, onHover, onClick, params);
|
send(message, false, sender, ChatMessageType.SYSTEM, onHover, onClick, params);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Deprecated
|
@Deprecated
|
||||||
private static void send(String message, boolean prefixed, CommandSource s, String onHover, ClickEvent onClick, Object... params){
|
private static void send(String message, boolean prefixed, CommandSender s, ChatMessageType type, String onHover, ClickEvent onClick, Object... params){
|
||||||
ChatSender sender = ChatSender.of(s);
|
ChatSender sender = ChatSender.of(s);
|
||||||
if(!sender.chatShown())
|
if(type == ChatMessageType.CHAT && !sender.chatShown())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
sender.send(prefixed, onHover != null ? new Message("PLAIN_STRING", onHover) : null, onClick, new Message(message, params));
|
sender.send(prefixed, type, onHover != null ? new Message("PLAIN_STRING", onHover) : null, onClick, new Message(message, params));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void broadcast(String message, Object... params) {
|
public static void broadcast(String message, Object... params) {
|
||||||
@ -124,7 +123,7 @@ public class Message {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static void team(String message, String onHover, ClickEvent onClick, Object... params) {
|
public static void team(String message, String onHover, ClickEvent onClick, Object... params) {
|
||||||
ChatSender.serverteamReceivers().forEach(player -> player.prefixless(message, onHover != null ? new Message(onHover, params) : null, onClick, params));
|
ChatSender.serverteamReceivers().filter(player -> player.user().getUserGroup().isTeamGroup()).forEach(player -> player.prefixless(message, onHover != null ? new Message(onHover, params) : null, onClick, params));
|
||||||
}
|
}
|
||||||
|
|
||||||
private final String format;
|
private final String format;
|
||||||
|
@ -19,11 +19,9 @@
|
|||||||
|
|
||||||
package de.steamwar.bungeecore;
|
package de.steamwar.bungeecore;
|
||||||
|
|
||||||
import net.md_5.bungee.BungeeCord;
|
|
||||||
import net.md_5.bungee.api.ProxyServer;
|
import net.md_5.bungee.api.ProxyServer;
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.nio.file.Files;
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
@ -31,13 +29,8 @@ import java.util.logging.Level;
|
|||||||
|
|
||||||
public abstract class Node {
|
public abstract class Node {
|
||||||
|
|
||||||
//-Xquickstart Langzeitperformance testen!
|
private static final List<String> OPENJ9_ARGS = Arrays.asList("-Xgc:excessiveGCratio=80", "-Xsyslog:none", "-Xtrace:none", "-Xdisableexplicitgc", "-XX:+AlwaysPreTouch", "-XX:+CompactStrings", "-XX:-HeapDumpOnOutOfMemory", "-XX:+ExitOnOutOfMemoryError", "-Dlog4j.configurationFile=log4j2.xml");
|
||||||
private static final List<String> OPENJ9_ARGS = Arrays.asList(
|
private static final double MIN_FREE_MEM = 4.0 * 1024 * 1024; // 4 GiB
|
||||||
"-XX:+EnableCRIUSupport", "-XX:-CRIURestoreNonPortableMode",
|
|
||||||
"-Xgc:excessiveGCratio=80", "-Xdisableexplicitgc", "-Xnoclassgc", "-Xmos128M", "-Xmns48M", "-XX:+ExitOnOutOfMemoryError", // initial heap half values of memory observed by 1.19 spectate server
|
|
||||||
"-Xsyslog:none", "-Xtrace:none", "-Xverify:none", "-Xdump:system:none", "-Xdump:jit:none", "-Xdump:snap:none",
|
|
||||||
"-Dlog4j.configurationFile=log4j2.xml"
|
|
||||||
);
|
|
||||||
private static final Set<String> JAVA_8 = new HashSet<>();
|
private static final Set<String> JAVA_8 = new HashSet<>();
|
||||||
static {
|
static {
|
||||||
JAVA_8.add("paper-1.8.8.jar");
|
JAVA_8.add("paper-1.8.8.jar");
|
||||||
@ -47,70 +40,59 @@ public abstract class Node {
|
|||||||
JAVA_8.add("spigot-1.10.2.jar");
|
JAVA_8.add("spigot-1.10.2.jar");
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final long MIN_FREE_MEM = 4 * 1024 * 1024L; // 4 GiB
|
|
||||||
|
|
||||||
private static final List<Node> nodes = new ArrayList<>();
|
private static final List<Node> nodes = new ArrayList<>();
|
||||||
|
public static Node local = null;
|
||||||
|
|
||||||
public static Node getNode() {
|
public static Node getNode() {
|
||||||
for(Node node : nodes) {
|
Node node = local;
|
||||||
if(node.belowLoadLimit)
|
double minLoad = local.getLoad();
|
||||||
return node;
|
if(minLoad < 0.5)
|
||||||
|
return local;
|
||||||
|
|
||||||
|
synchronized (nodes) {
|
||||||
|
Iterator<Node> it = nodes.iterator();
|
||||||
|
while(it.hasNext()) {
|
||||||
|
Node n = it.next();
|
||||||
|
double load = n.getLoad();
|
||||||
|
if (load < minLoad) {
|
||||||
|
minLoad = load;
|
||||||
|
node = n;
|
||||||
|
} else if (load == Double.POSITIVE_INFINITY) {
|
||||||
|
BungeeCore.get().getLogger().log(Level.SEVERE, "Removing " + n.getName() + " due to infinite load!");
|
||||||
|
it.remove();
|
||||||
}
|
}
|
||||||
return null;
|
}
|
||||||
|
}
|
||||||
|
return node;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void forEach(Consumer<Node> consumer) {
|
public static void forEach(Consumer<Node> consumer) {
|
||||||
|
consumer.accept(local);
|
||||||
|
synchronized (nodes) {
|
||||||
nodes.forEach(consumer);
|
nodes.forEach(consumer);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public abstract ProcessBuilder startServer(String serverJar, File directory, String worldDir, String levelName, int port, String xmx, String... dParams);
|
public abstract ProcessBuilder startServer(String serverJar, File directory, String worldDir, String levelName, int port, String xmx, String... dParams);
|
||||||
|
public abstract void execute(String... command);
|
||||||
protected abstract ProcessBuilder prepareExecution(String... command);
|
public abstract String getName();
|
||||||
protected abstract void calcLoadLimit();
|
public abstract double getLoad();
|
||||||
|
|
||||||
protected final String hostname;
|
|
||||||
protected volatile boolean belowLoadLimit = true;
|
|
||||||
|
|
||||||
protected Node(String hostname) {
|
|
||||||
this.hostname = hostname;
|
|
||||||
nodes.add(this);
|
|
||||||
VelocityCore.get().getProxyServer().getScheduler().buildTask(VelocityCore.get(), () -> calcLoadLimit()).repeat(2, TimeUnit.SECONDS);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void execute(String... command) {
|
|
||||||
try {
|
|
||||||
prepareExecution(command).start().waitFor();
|
|
||||||
} catch (IOException e) {
|
|
||||||
throw new SecurityException("Could not execute command", e);
|
|
||||||
} catch (InterruptedException e) {
|
|
||||||
VelocityCore.get().getLogger().log(Level.SEVERE, "Interrupted during execution", e);
|
|
||||||
Thread.currentThread().interrupt();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean belowLoadLimit() {
|
|
||||||
return belowLoadLimit;
|
|
||||||
}
|
|
||||||
public String getName() {
|
|
||||||
return hostname;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void constructServerstart(File directory, List<String> cmd, String serverJar, String worldDir, String levelName, int port, String xmx, String... dParams) {
|
protected void constructServerstart(File directory, List<String> cmd, String serverJar, String worldDir, String levelName, int port, String xmx, String... dParams) {
|
||||||
if (JAVA_8.contains(serverJar))
|
if (JAVA_8.contains(serverJar))
|
||||||
cmd.add("/usr/lib/jvm/java-8-openj9-amd64/bin/java");
|
cmd.add("/usr/lib/jvm/java-8-openj9-amd64/bin/java");
|
||||||
else
|
else
|
||||||
cmd.add("/usr/lib/jvm/java-21-openj9-amd64/bin/java");
|
cmd.add("java");
|
||||||
|
|
||||||
for(String param : dParams){
|
for(String param : dParams){
|
||||||
cmd.add("-D" + param);
|
cmd.add("-D" + param);
|
||||||
}
|
}
|
||||||
cmd.add("-Xshareclasses:nonfatal,name=" + directory.getName());
|
|
||||||
cmd.add("-Xmx" + xmx);
|
cmd.add("-Xmx" + xmx);
|
||||||
|
cmd.add("-Xshareclasses:nonfatal,name=" + directory.getName());
|
||||||
cmd.addAll(OPENJ9_ARGS);
|
cmd.addAll(OPENJ9_ARGS);
|
||||||
if (!JAVA_8.contains(serverJar)) {
|
if (!JAVA_8.contains(serverJar)) {
|
||||||
cmd.add("--add-opens");
|
cmd.add("--add-opens");
|
||||||
cmd.add("java.base/jdk.internal.misc=ALL-UNNAMED");
|
cmd.add("java.base/jdk.internal.misc=ALL-UNNAMED");
|
||||||
cmd.add("-XX:-CRIUSecProvider");
|
|
||||||
}
|
}
|
||||||
cmd.add("-jar");
|
cmd.add("-jar");
|
||||||
cmd.add("/binarys/" + serverJar);
|
cmd.add("/binarys/" + serverJar);
|
||||||
@ -124,21 +106,26 @@ public abstract class Node {
|
|||||||
cmd.add("nogui");
|
cmd.add("nogui");
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void calcLoadLimit(BufferedReader meminfo) throws IOException {
|
protected void execute(ProcessBuilder builder) {
|
||||||
String line = meminfo.readLine();
|
try {
|
||||||
while(!line.startsWith("MemAvailable")) {
|
builder.start().waitFor();
|
||||||
line = meminfo.readLine();
|
} catch (IOException e) {
|
||||||
|
throw new SecurityException("Could not execute command", e);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
ProxyServer.getInstance().getLogger().log(Level.SEVERE, "Interrupted during execution", e);
|
||||||
|
Thread.currentThread().interrupt();
|
||||||
}
|
}
|
||||||
|
|
||||||
long availableMem = Long.parseLong(line.replaceAll(" +", " ").split(" ")[1]);
|
|
||||||
belowLoadLimit = availableMem >= MIN_FREE_MEM;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class LocalNode extends Node {
|
public static class LocalNode extends Node {
|
||||||
private static final File MEMINFO = new File("/proc/meminfo");
|
private static final File meminfo = new File("/proc/meminfo");
|
||||||
|
private static final File loadavg = new File("/proc/loadavg");
|
||||||
|
|
||||||
|
private final int cores;
|
||||||
|
|
||||||
public LocalNode() {
|
public LocalNode() {
|
||||||
super("sw");
|
this.cores = Runtime.getRuntime().availableProcessors();
|
||||||
|
local = this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -151,26 +138,74 @@ public abstract class Node {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void calcLoadLimit() {
|
public void execute(String... command) {
|
||||||
try (BufferedReader meminfo = new BufferedReader(new InputStreamReader(Files.newInputStream(MEMINFO.toPath())))) {
|
execute(new ProcessBuilder(command));
|
||||||
calcLoadLimit(meminfo);
|
|
||||||
} catch (IOException e) {
|
|
||||||
VelocityCore.get().getLogger().log(Level.SEVERE, "Could not read local load", e);
|
|
||||||
belowLoadLimit = false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected ProcessBuilder prepareExecution(String... command) {
|
public String getName() {
|
||||||
return new ProcessBuilder(command);
|
return "local";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double getLoad() {
|
||||||
|
double totalMem;
|
||||||
|
double freeMem;
|
||||||
|
try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(meminfo)))) {
|
||||||
|
totalMem = Double.parseDouble(bufferedReader.readLine().replaceAll(" +", " ").split(" ")[1]);
|
||||||
|
bufferedReader.readLine();
|
||||||
|
freeMem = Double.parseDouble(bufferedReader.readLine().replaceAll(" +", " ").split(" ")[1]);
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new SecurityException("Could not read local memory", e);
|
||||||
|
}
|
||||||
|
|
||||||
|
double cpuLoad;
|
||||||
|
try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(loadavg)))) {
|
||||||
|
cpuLoad = Double.parseDouble(bufferedReader.readLine().split(" ")[0]);
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new SecurityException("Could not read local cpu", e);
|
||||||
|
}
|
||||||
|
|
||||||
|
return cpuLoad / cores + (freeMem > MIN_FREE_MEM ? 0 : ((totalMem - freeMem) / totalMem));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class RemoteNode extends Node {
|
public static class RemoteNode extends Node {
|
||||||
|
private final int cores;
|
||||||
|
private final String remote;
|
||||||
|
|
||||||
public RemoteNode(String hostname) {
|
public RemoteNode(String remote) {
|
||||||
super(hostname);
|
this.remote = remote;
|
||||||
VelocityCore.get().getLogger().log(Level.INFO, "Added node " + hostname);
|
|
||||||
|
//Determine core count
|
||||||
|
Process process;
|
||||||
|
try {
|
||||||
|
process = new ProcessBuilder("ssh", remote, "nproc").start();
|
||||||
|
if(!process.waitFor(5, TimeUnit.SECONDS))
|
||||||
|
throw new IOException("Timeout of " + remote + " on init");
|
||||||
|
} catch (IOException e) {
|
||||||
|
BungeeCore.get().getLogger().log(Level.SEVERE, "Could not initialize " + remote);
|
||||||
|
cores = 1;
|
||||||
|
return;
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
Thread.currentThread().interrupt();
|
||||||
|
cores = 1;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int c;
|
||||||
|
try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
|
||||||
|
c = Integer.parseInt(bufferedReader.readLine());
|
||||||
|
} catch (IOException | NumberFormatException e) {
|
||||||
|
BungeeCore.get().getLogger().log(Level.SEVERE, "Could not read cores of" + remote, e);
|
||||||
|
c = 1;
|
||||||
|
}
|
||||||
|
cores = c;
|
||||||
|
BungeeCore.get().getLogger().log(Level.INFO, "Adding node " + remote + " with " + cores + " cores.");
|
||||||
|
|
||||||
|
synchronized (nodes) {
|
||||||
|
nodes.add(this);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -179,7 +214,7 @@ public abstract class Node {
|
|||||||
cmd.add("ssh");
|
cmd.add("ssh");
|
||||||
cmd.add("-L");
|
cmd.add("-L");
|
||||||
cmd.add(port + ":localhost:" + port);
|
cmd.add(port + ":localhost:" + port);
|
||||||
cmd.add(hostname);
|
cmd.add(remote);
|
||||||
cmd.add("cd");
|
cmd.add("cd");
|
||||||
cmd.add(directory.getPath());
|
cmd.add(directory.getPath());
|
||||||
cmd.add(";");
|
cmd.add(";");
|
||||||
@ -188,30 +223,43 @@ public abstract class Node {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected ProcessBuilder prepareExecution(String... command) {
|
public void execute(String... command) {
|
||||||
List<String> cmd = new ArrayList<>();
|
List<String> cmd = new ArrayList<>();
|
||||||
cmd.add("ssh");
|
cmd.add("ssh");
|
||||||
cmd.add(hostname);
|
cmd.add(remote);
|
||||||
cmd.addAll(Arrays.asList(command));
|
cmd.addAll(Arrays.asList(command));
|
||||||
return new ProcessBuilder(cmd);
|
execute(new ProcessBuilder(cmd));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void calcLoadLimit() {
|
public String getName() {
|
||||||
try {
|
return remote;
|
||||||
Process process = prepareExecution("cat /proc/meminfo").start();
|
|
||||||
if(!process.waitFor(1, TimeUnit.SECONDS))
|
|
||||||
throw new IOException(hostname + " timeout");
|
|
||||||
try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
|
|
||||||
calcLoadLimit(reader);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double getLoad() {
|
||||||
|
Process process;
|
||||||
|
try {
|
||||||
|
process = new ProcessBuilder("ssh", remote, "cat /proc/loadavg;cat /proc/meminfo").start();
|
||||||
|
if(!process.waitFor(1, TimeUnit.SECONDS))
|
||||||
|
return Double.POSITIVE_INFINITY;
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
if(belowLoadLimit)
|
BungeeCore.get().getLogger().log(Level.SEVERE, "Could starting process to read load", e);
|
||||||
VelocityCore.get().getLogger().log(Level.SEVERE, "Could read remote load", e);
|
return Double.POSITIVE_INFINITY;
|
||||||
belowLoadLimit = false;
|
|
||||||
} catch (InterruptedException e) {
|
} catch (InterruptedException e) {
|
||||||
Thread.currentThread().interrupt();
|
Thread.currentThread().interrupt();
|
||||||
belowLoadLimit = false;
|
return Double.POSITIVE_INFINITY;
|
||||||
|
}
|
||||||
|
|
||||||
|
try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
|
||||||
|
double cpuLoad = Double.parseDouble(bufferedReader.readLine().split(" ")[0]);
|
||||||
|
double totalMem = Double.parseDouble(bufferedReader.readLine().replaceAll(" +", " ").split(" ")[1]);
|
||||||
|
bufferedReader.readLine();
|
||||||
|
double freeMem = Double.parseDouble(bufferedReader.readLine().replaceAll(" +", " ").split(" ")[1]);
|
||||||
|
return cpuLoad / cores + (freeMem > MIN_FREE_MEM ? 0 : ((totalMem - freeMem) / totalMem));
|
||||||
|
} catch (IOException e) {
|
||||||
|
BungeeCore.get().getLogger().log(Level.SEVERE, "Could read load", e);
|
||||||
|
return Double.POSITIVE_INFINITY;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,35 +1,32 @@
|
|||||||
package de.steamwar.bungeecore;
|
package de.steamwar.bungeecore;
|
||||||
|
|
||||||
import com.velocitypowered.api.proxy.Player;
|
import de.steamwar.bungeecore.sql.EventFight;
|
||||||
import de.steamwar.messages.ChatSender;
|
import de.steamwar.bungeecore.sql.SteamwarUser;
|
||||||
import de.steamwar.sql.*;
|
import de.steamwar.bungeecore.sql.Team;
|
||||||
import lombok.Getter;
|
import de.steamwar.bungeecore.sql.Tutorial;
|
||||||
|
import net.md_5.bungee.api.ProxyServer;
|
||||||
|
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
||||||
|
|
||||||
import java.io.DataOutputStream;
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
|
||||||
import java.net.InetSocketAddress;
|
import java.net.InetSocketAddress;
|
||||||
import java.nio.file.Files;
|
|
||||||
import java.time.format.DateTimeFormatter;
|
import java.time.format.DateTimeFormatter;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.function.BooleanSupplier;
|
import java.util.function.BooleanSupplier;
|
||||||
import java.util.function.Consumer;
|
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
public class ServerStarter {
|
public class ServerStarter {
|
||||||
|
|
||||||
private static final Portrange BAU_PORTS = VelocityCore.MAIN_SERVER ? new Portrange(10100, 20000) : new Portrange(2100, 2200);
|
private static final boolean MAIN_SERVER = ProxyServer.getInstance().getConfig().getListeners().stream().anyMatch(info -> ((InetSocketAddress) info.getSocketAddress()).getPort() == 25565);
|
||||||
private static final Portrange ARENA_PORTS = VelocityCore.MAIN_SERVER ? new Portrange(3000, 3100) : (VelocityCore.EVENT_MODE ? new Portrange(4000, 5000) : BAU_PORTS);
|
private static final Portrange BAU_PORTS = MAIN_SERVER ? new Portrange(10100, 20000) : new Portrange(2100, 2200);
|
||||||
|
private static final Portrange ARENA_PORTS = MAIN_SERVER ? new Portrange(3000, 3100) : (BungeeCore.EVENT_MODE ? new Portrange(4000, 5000) : BAU_PORTS);
|
||||||
|
|
||||||
private static final String SERVER_PATH = "/servers/";
|
private static final String BACKBONE = "/home/minecraft/";
|
||||||
private static final String USER_HOME = System.getProperty("user.home") + "/";
|
private static final String SERVER_PATH = BACKBONE + "server/";
|
||||||
private static final String EVENT_PATH = USER_HOME + "event/";
|
private static final String EVENT_PATH = BACKBONE + "event/";
|
||||||
public static final String TEMP_WORLD_PATH = USER_HOME + "arenaserver/";
|
public static final String TEMP_WORLD_PATH = BACKBONE + "arenaserver/";
|
||||||
public static final String TUTORIAL_PATH = USER_HOME + "tutorials/";
|
public static final String TUTORIAL_PATH = BACKBONE + "tutorials/";
|
||||||
|
public static final String WORLDS18_PATH = BACKBONE + "userworlds18/";
|
||||||
public static final String WORLDS_BASE_PATH = USER_HOME + "userworlds";
|
|
||||||
public static final String BUILDER_BASE_PATH = USER_HOME + "builder";
|
|
||||||
|
|
||||||
private File directory = null;
|
private File directory = null;
|
||||||
private String worldDir = null;
|
private String worldDir = null;
|
||||||
@ -46,11 +43,9 @@ public class ServerStarter {
|
|||||||
private boolean allowMerge = false;
|
private boolean allowMerge = false;
|
||||||
private String fightMap = null;
|
private String fightMap = null;
|
||||||
private String gameMode = null;
|
private String gameMode = null;
|
||||||
private boolean checkpoint = false;
|
private ServerConstructor constructor = (serverName, port, builder, shutdownCallback) -> new Arenaserver(serverName, gameMode, fightMap, allowMerge, port, builder, shutdownCallback);
|
||||||
private ServerConstructor constructor = (serverName, port, builder, shutdownCallback, failureCallback) -> new Arenaserver(serverName, gameMode, fightMap, allowMerge, port, builder, shutdownCallback);
|
|
||||||
private Consumer<Subserver> callback = subserver -> {};
|
|
||||||
|
|
||||||
private final Set<Player> playersToSend = new HashSet<>();
|
private final Set<ProxiedPlayer> playersToSend = new HashSet<>();
|
||||||
private final Map<String, String> arguments = new HashMap<>();
|
private final Map<String, String> arguments = new HashMap<>();
|
||||||
|
|
||||||
public ServerStarter arena(ArenaMode mode, String map) {
|
public ServerStarter arena(ArenaMode mode, String map) {
|
||||||
@ -67,13 +62,13 @@ public class ServerStarter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public ServerStarter event(EventFight eventFight) {
|
public ServerStarter event(EventFight eventFight) {
|
||||||
arena(ArenaMode.getByInternal(eventFight.getSpielmodus()), eventFight.getMap());
|
arena(eventFight.getSpielmodus(), eventFight.getMap());
|
||||||
node = Node.LocalNode.getNode();
|
node = Node.local;
|
||||||
worldDir = EVENT_PATH;
|
worldDir = EVENT_PATH;
|
||||||
worldCleanup = () -> {};
|
worldCleanup = () -> {};
|
||||||
arguments.put("fightID", String.valueOf(eventFight.getFightID()));
|
arguments.put("fightID", String.valueOf(eventFight.getFightID()));
|
||||||
fightMap = eventFight.getMap();
|
fightMap = eventFight.getMap();
|
||||||
gameMode = eventFight.getSpielmodus();
|
gameMode = eventFight.getSpielmodus().getInternalName();
|
||||||
|
|
||||||
String serverName = Team.get(eventFight.getTeamBlue()).getTeamKuerzel() + " vs " + Team.get(eventFight.getTeamRed()).getTeamKuerzel();
|
String serverName = Team.get(eventFight.getTeamBlue()).getTeamKuerzel() + " vs " + Team.get(eventFight.getTeamRed()).getTeamKuerzel();
|
||||||
serverNameProvider = port -> serverName;
|
serverNameProvider = port -> serverName;
|
||||||
@ -81,7 +76,7 @@ public class ServerStarter {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ServerStarter test(ArenaMode mode, String map, Player owner) {
|
public ServerStarter test(ArenaMode mode, String map, ProxiedPlayer owner) {
|
||||||
arena(mode, map);
|
arena(mode, map);
|
||||||
buildWithTemp(owner);
|
buildWithTemp(owner);
|
||||||
portrange = BAU_PORTS;
|
portrange = BAU_PORTS;
|
||||||
@ -89,12 +84,12 @@ public class ServerStarter {
|
|||||||
return send(owner);
|
return send(owner);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ServerStarter blueLeader(Player player) {
|
public ServerStarter blueLeader(ProxiedPlayer player) {
|
||||||
arguments.put("blueLeader", player.getUniqueId().toString());
|
arguments.put("blueLeader", player.getUniqueId().toString());
|
||||||
return send(player);
|
return send(player);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ServerStarter redLeader(Player player) {
|
public ServerStarter redLeader(ProxiedPlayer player) {
|
||||||
arguments.put("redLeader", player.getUniqueId().toString());
|
arguments.put("redLeader", player.getUniqueId().toString());
|
||||||
return send(player);
|
return send(player);
|
||||||
}
|
}
|
||||||
@ -114,50 +109,38 @@ public class ServerStarter {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ServerStarter build(Version version, UUID owner) {
|
public ServerStarter build18(UUID owner) {
|
||||||
directory = version.getServerDirectory("Bau");
|
directory = new File(SERVER_PATH, "Bau18");
|
||||||
serverJar = version.getServerJar();
|
serverJar = "paper-1.18.2.jar";
|
||||||
worldDir = version.getWorldFolder(WORLDS_BASE_PATH);
|
worldDir = WORLDS18_PATH;
|
||||||
worldName = version != Version.SPIGOT_12 ? String.valueOf(SteamwarUser.get(owner).getId()) : owner.toString();
|
worldName = String.valueOf(SteamwarUser.get(owner).getId());
|
||||||
checkpoint = true;
|
buildWithWorld(owner, new File(directory, "Bauwelt").getPath());
|
||||||
|
|
||||||
build(owner);
|
|
||||||
|
|
||||||
worldSetup = () -> {
|
|
||||||
File world = new File(worldDir, worldName);
|
|
||||||
if (!world.exists())
|
|
||||||
copyWorld(node, new File(directory, "Bauwelt").getPath(), world.getPath());
|
|
||||||
};
|
|
||||||
|
|
||||||
// Send players to existing server
|
|
||||||
startCondition = () -> {
|
|
||||||
Bauserver subserver = Bauserver.get(owner);
|
|
||||||
if(subserver != null) {
|
|
||||||
for(Player p : playersToSend)
|
|
||||||
SubserverSystem.sendPlayer(subserver, p);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
boolean atLeastOneSupervisor = playersToSend.stream().anyMatch(player -> {
|
|
||||||
if (player.getUniqueId().equals(owner)) return true;
|
|
||||||
BauweltMember bauweltMember = BauweltMember.getBauMember(owner, player.getUniqueId());
|
|
||||||
return bauweltMember.isSupervisor();
|
|
||||||
});
|
|
||||||
if (!atLeastOneSupervisor) {
|
|
||||||
for (Player p : playersToSend) {
|
|
||||||
ChatSender.of(p).system("BAU_START_NOT_ALLOWED");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return atLeastOneSupervisor;
|
|
||||||
};
|
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ServerStarter tutorial(Player owner, Tutorial tutorial) {
|
public ServerStarter build15(UUID owner) {
|
||||||
|
directory = new File(SERVER_PATH, "Bau15");
|
||||||
|
worldDir = BungeeCore.USERWORLDS15;
|
||||||
|
worldName = String.valueOf(SteamwarUser.get(owner).getId());
|
||||||
|
buildWithWorld(owner, BungeeCore.BAUWELT15);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ServerStarter build12(UUID owner) {
|
||||||
|
directory = new File(SERVER_PATH, "UserBau");
|
||||||
|
serverJar = "spigot-1.12.2.jar";
|
||||||
|
xmx = "256M";
|
||||||
|
worldDir = BungeeCore.WORLD_FOLDER;
|
||||||
|
worldName = owner.toString();
|
||||||
|
buildWithWorld(owner, BungeeCore.BAUWELT_PROTOTYP);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ServerStarter tutorial(ProxiedPlayer owner, Tutorial tutorial) {
|
||||||
directory = new File(SERVER_PATH, "Tutorial");
|
directory = new File(SERVER_PATH, "Tutorial");
|
||||||
buildWithTemp(owner);
|
buildWithTemp(owner);
|
||||||
tempWorld(TUTORIAL_PATH + tutorial.getTutorialId());
|
tempWorld(TUTORIAL_PATH + tutorial.id());
|
||||||
arguments.put("tutorial", String.valueOf(tutorial.getTutorialId()));
|
arguments.put("tutorial", String.valueOf(tutorial.id()));
|
||||||
return send(owner);
|
return send(owner);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -167,7 +150,29 @@ public class ServerStarter {
|
|||||||
worldCleanup = () -> SubserverSystem.deleteFolder(node, worldDir + worldName);
|
worldCleanup = () -> SubserverSystem.deleteFolder(node, worldDir + worldName);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void buildWithTemp(Player owner) {
|
private void buildWithWorld(UUID owner, String prototype) {
|
||||||
|
build(owner);
|
||||||
|
|
||||||
|
worldSetup = () -> {
|
||||||
|
File world = new File(worldDir, worldName);
|
||||||
|
if (!world.exists())
|
||||||
|
copyWorld(node, prototype, world.getPath());
|
||||||
|
};
|
||||||
|
|
||||||
|
// Send players to existing server
|
||||||
|
startCondition = () -> {
|
||||||
|
for(Subserver subserver : Subserver.getServerList()) {
|
||||||
|
if(subserver.getType() == Servertype.BAUSERVER && ((Bauserver)subserver).getOwner().equals(owner)) {
|
||||||
|
for(ProxiedPlayer p : playersToSend)
|
||||||
|
SubserverSystem.sendPlayer(subserver, p);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private void buildWithTemp(ProxiedPlayer owner) {
|
||||||
build(owner.getUniqueId());
|
build(owner.getUniqueId());
|
||||||
|
|
||||||
// Stop existing build server
|
// Stop existing build server
|
||||||
@ -175,125 +180,59 @@ public class ServerStarter {
|
|||||||
if(startingBau(owner))
|
if(startingBau(owner))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
Bauserver subserver = Bauserver.get(owner.getUniqueId());
|
for (Subserver subserver : Subserver.getServerList()) {
|
||||||
if(subserver != null && subserver.isStarted())
|
if (subserver.getType() == Servertype.BAUSERVER && ((Bauserver) subserver).getOwner().equals(owner.getUniqueId()) && subserver.hasStarted()) {
|
||||||
subserver.stop();
|
subserver.stop();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return !startingBau(owner);
|
return !startingBau(owner);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
private void build(UUID owner) {
|
private void build(UUID owner) {
|
||||||
constructor = (serverName, port, builder, shutdownCallback, failureCallback) -> new Bauserver(serverName, owner, port, builder, shutdownCallback, failureCallback);
|
constructor = (serverName, port, builder, shutdownCallback) -> new Bauserver(serverName, owner, port, builder, shutdownCallback);
|
||||||
serverNameProvider = port -> bauServerName(SteamwarUser.get(owner));
|
serverNameProvider = port -> bauServerName(SteamwarUser.get(owner));
|
||||||
}
|
}
|
||||||
|
|
||||||
public ServerStarter builder(Version version, String map, File generator) {
|
public ServerStarter send(ProxiedPlayer player) {
|
||||||
serverJar = version.getServerJar();
|
|
||||||
directory = version.getServerDirectory("Builder");
|
|
||||||
worldDir = version.getWorldFolder(BUILDER_BASE_PATH);
|
|
||||||
worldName = map;
|
|
||||||
serverNameProvider = port -> "⛏" + map;
|
|
||||||
checkpoint = true;
|
|
||||||
constructor = (serverName, port, builder, shutdownCallback, failureCallback) -> new Builderserver(serverName, worldName, port, builder, shutdownCallback, failureCallback);
|
|
||||||
|
|
||||||
// Send players to existing server
|
|
||||||
startCondition = () -> {
|
|
||||||
Builderserver subserver = Builderserver.get(worldName);
|
|
||||||
if (subserver != null) {
|
|
||||||
for(Player p : playersToSend)
|
|
||||||
SubserverSystem.sendPlayer(subserver, p);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
};
|
|
||||||
|
|
||||||
if(generator != null) {
|
|
||||||
worldSetup = () -> {
|
|
||||||
File leveldat = new File(new File(worldDir, worldName), "level.dat");
|
|
||||||
try {
|
|
||||||
Files.copy(generator.toPath(), leveldat.toPath());
|
|
||||||
} catch (IOException e) {
|
|
||||||
throw new SecurityException(e);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ServerStarter send(Player player) {
|
|
||||||
playersToSend.add(player);
|
playersToSend.add(player);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ServerStarter callback(Consumer<Subserver> callback) {
|
public Subserver start() {
|
||||||
this.callback = callback;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean start() {
|
|
||||||
if(!startCondition.getAsBoolean())
|
if(!startCondition.getAsBoolean())
|
||||||
return false;
|
return null;
|
||||||
|
|
||||||
int port = portrange.freePort();
|
int port = portrange.freePort();
|
||||||
String serverName = serverNameProvider.apply(port);
|
String serverName = serverNameProvider.apply(port);
|
||||||
|
|
||||||
if(node == null) {
|
if(node == null)
|
||||||
node = Node.getNode();
|
node = Node.getNode();
|
||||||
if(node == null) {
|
|
||||||
for (Player p : playersToSend)
|
|
||||||
ChatSender.of(p).system("SERVER_START_OVERLOAD");
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(worldName == null)
|
if(worldName == null)
|
||||||
worldName = serverToWorldName(serverName);
|
worldName = serverToWorldName(serverName);
|
||||||
|
|
||||||
worldSetup.run();
|
worldSetup.run();
|
||||||
arguments.put("logPath", worldName);
|
arguments.put("logPath", worldName);
|
||||||
|
|
||||||
File checkpointDir = new File("/tmp/" + System.getProperty("user.name") + ".checkpoints/" + directory.getName() + "/" + worldName);
|
Subserver subserver = constructor.construct(serverName, port, node.startServer(
|
||||||
if(checkpoint)
|
|
||||||
arguments.put("checkpoint", checkpointDir.getPath());
|
|
||||||
|
|
||||||
if(checkpoint && checkpointDir.exists()) {
|
|
||||||
try {
|
|
||||||
new DataOutputStream(Files.newOutputStream(new File(checkpointDir, "port").toPath())).writeInt(port);
|
|
||||||
} catch (IOException e) {
|
|
||||||
throw new SecurityException(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
postStart(constructor.construct(serverName, port, node.prepareExecution(
|
|
||||||
"criu", "restore", "-D", checkpointDir.getPath(), "--auto-dedup", "--shell-job", "-v"
|
|
||||||
), worldCleanup, e -> regularStart(serverName, port)));
|
|
||||||
} else {
|
|
||||||
regularStart(serverName, port);
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void regularStart(String serverName, int port) {
|
|
||||||
postStart(constructor.construct(serverName, port, node.startServer(
|
|
||||||
serverJar, directory, worldDir, worldName, port, xmx, arguments.entrySet().stream().map(entry -> entry.getKey() + "=" + entry.getValue()).toArray(String[]::new)
|
serverJar, directory, worldDir, worldName, port, xmx, arguments.entrySet().stream().map(entry -> entry.getKey() + "=" + entry.getValue()).toArray(String[]::new)
|
||||||
), worldCleanup, null));
|
), worldCleanup);
|
||||||
}
|
|
||||||
|
|
||||||
private void postStart(Subserver subserver) {
|
for(ProxiedPlayer p : playersToSend)
|
||||||
for(Player p : playersToSend)
|
|
||||||
SubserverSystem.sendPlayer(subserver, p);
|
SubserverSystem.sendPlayer(subserver, p);
|
||||||
|
|
||||||
callback.accept(subserver);
|
return subserver;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean startingBau(Player p) {
|
private static boolean startingBau(ProxiedPlayer p) {
|
||||||
Bauserver subserver = Bauserver.get(p.getUniqueId());
|
for (Subserver subserver : Subserver.getServerList()) {
|
||||||
if(subserver != null && !subserver.isStarted()) {
|
if (subserver.getType() == Servertype.BAUSERVER && ((Bauserver) subserver).getOwner().equals(p.getUniqueId()) && !subserver.hasStarted()) {
|
||||||
ChatSender.of(p).system("BAU_START_ALREADY");
|
Message.send("BAU_START_ALREADY", p);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -310,7 +249,7 @@ public class ServerStarter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private interface ServerConstructor {
|
private interface ServerConstructor {
|
||||||
Subserver construct(String serverName, int port, ProcessBuilder builder, Runnable shutdownCallback, Consumer<Exception> failureCallback);
|
Subserver construct(String serverName, int port, ProcessBuilder builder, Runnable shutdownCallback);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class Portrange {
|
private static class Portrange {
|
||||||
@ -348,28 +287,4 @@ public class ServerStarter {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Getter
|
|
||||||
public enum Version {
|
|
||||||
SPIGOT_12("spigot-1.12.2.jar", 12),
|
|
||||||
SPIGOT_15("spigot-1.15.2.jar", 15),
|
|
||||||
PAPER_19("paper-1.19.3.jar", 19),
|
|
||||||
PAPER_20("paper-1.20.1.jar", 20);
|
|
||||||
|
|
||||||
private final String serverJar;
|
|
||||||
private final int versionSuffix;
|
|
||||||
|
|
||||||
Version(String serverJar, int versionSuffix) {
|
|
||||||
this.serverJar = serverJar;
|
|
||||||
this.versionSuffix = versionSuffix;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getWorldFolder(String base) {
|
|
||||||
return base + versionSuffix + "/";
|
|
||||||
}
|
|
||||||
|
|
||||||
public File getServerDirectory(String base) {
|
|
||||||
return new File(SERVER_PATH, base + versionSuffix);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
@ -19,13 +19,13 @@
|
|||||||
|
|
||||||
package de.steamwar.bungeecore;
|
package de.steamwar.bungeecore;
|
||||||
|
|
||||||
import com.velocitypowered.api.proxy.Player;
|
import de.steamwar.bungeecore.comms.handlers.FightInfoHandler;
|
||||||
import de.steamwar.bungeecore.network.NetworkSender;
|
import de.steamwar.bungeecore.comms.packets.StartingServerPacket;
|
||||||
import de.steamwar.bungeecore.network.handlers.FightInfoHandler;
|
import de.steamwar.bungeecore.sql.IgnoreSystem;
|
||||||
import de.steamwar.sql.IgnoreSystem;
|
import de.steamwar.bungeecore.sql.SteamwarUser;
|
||||||
import de.steamwar.sql.SteamwarUser;
|
import net.md_5.bungee.api.ProxyServer;
|
||||||
import de.steamwar.network.packets.server.StartingServerPacket;
|
import net.md_5.bungee.api.chat.ClickEvent;
|
||||||
import net.kyori.adventure.text.event.ClickEvent;
|
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
@ -36,26 +36,23 @@ public class SubserverSystem {
|
|||||||
node.execute("rm", "-r", worldName);
|
node.execute("rm", "-r", worldName);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void sendDeniedMessage(Player p, UUID owner){
|
public static void sendDeniedMessage(ProxiedPlayer p, UUID owner){
|
||||||
Player o = VelocityCore.get().getProxyServer().getPlayer(owner).orElse(null);
|
ProxiedPlayer o = ProxyServer.getInstance().getPlayer(owner);
|
||||||
|
if(o == null)
|
||||||
if(o == null){
|
|
||||||
return;
|
return;
|
||||||
}
|
if(IgnoreSystem.isIgnored(o, p)){
|
||||||
|
|
||||||
if(IgnoreSystem.isIgnored(owner, p.getUniqueId())){
|
|
||||||
Message.send("SERVER_IGNORED", p);
|
Message.send("SERVER_IGNORED", p);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Message.send("SERVER_ADD_MEMBER", o, p.getUsername());
|
Message.send("SERVER_ADD_MEMBER", o, p.getName());
|
||||||
Message.sendPrefixless("SERVER_ADD_MESSAGE", o, Message.parse("SERVER_ADD_MESSAGE_HOVER", o, p.getUsername()),
|
Message.sendPrefixless("SERVER_ADD_MESSAGE", o, Message.parse("SERVER_ADD_MESSAGE_HOVER", o, p.getName()),
|
||||||
ClickEvent.runCommand("/bau addmember " + p.getUsername()));
|
new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/bau addmember " + p.getName()));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void sendPlayer(Subserver subserver, Player player) {
|
public static void sendPlayer(Subserver subserver, ProxiedPlayer player) {
|
||||||
subserver.sendPlayer(player);
|
subserver.sendPlayer(player);
|
||||||
if(!subserver.isStarted() && FightInfoHandler.onLobby(player))
|
if(!subserver.hasStarted() && FightInfoHandler.onLobby(player))
|
||||||
NetworkSender.send(player, new StartingServerPacket(SteamwarUser.get(player.getUniqueId()).getId()));
|
new StartingServerPacket(SteamwarUser.get(player.getUniqueId())).send(player);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* This file is a part of the SteamWar software.
|
* This file is a part of the SteamWar software.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2022 SteamWar.de-Serverteam
|
* Copyright (C) 2020 SteamWar.de-Serverteam
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU Affero General Public License as published by
|
* it under the terms of the GNU Affero General Public License as published by
|
||||||
@ -17,20 +17,29 @@
|
|||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package de.steamwar.bungeecore.network;
|
package de.steamwar.bungeecore.api;
|
||||||
|
|
||||||
import de.steamwar.bungeecore.network.handlers.*;
|
|
||||||
import lombok.experimental.UtilityClass;
|
import lombok.experimental.UtilityClass;
|
||||||
|
import spark.Request;
|
||||||
|
import spark.Response;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
@UtilityClass
|
@UtilityClass
|
||||||
public class BungeeNetworkHandler {
|
public class AuthUtils {
|
||||||
public static void register() {
|
|
||||||
new EloPlayerHandler().register();
|
public static Optional<Token> isAuthorized(Request request, Response response) {
|
||||||
new EloSchemHandler().register();
|
String authorization = request.headers("Authorization");
|
||||||
new ExecuteCommandHandler().register();
|
if (authorization == null) {
|
||||||
new FightInfoHandler().register();
|
response.status(401);
|
||||||
new ImALobbyHandler().register();
|
return Optional.empty();
|
||||||
new InventoryCallbackHandler().register();
|
}
|
||||||
new PrepareSchemHandler().register();
|
|
||||||
|
try {
|
||||||
|
return Optional.of(Token.decrypt(authorization));
|
||||||
|
} catch (SecurityException e) {
|
||||||
|
response.status(401);
|
||||||
|
return Optional.empty();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -17,9 +17,16 @@
|
|||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package de.steamwar.command;
|
package de.steamwar.bungeecore.api;
|
||||||
|
|
||||||
import net.md_5.bungee.api.CommandSender;
|
import com.google.gson.JsonObject;
|
||||||
|
import spark.Request;
|
||||||
|
import spark.Response;
|
||||||
|
|
||||||
public interface TypeValidator<T> extends AbstractValidator<CommandSender, T> {
|
public interface EndPoint {
|
||||||
|
|
||||||
|
default String path() {
|
||||||
|
return this.getClass().getTypeName().substring(27).replace("EndPoint", "").replaceAll("([A-Z])", "_\1").toLowerCase();
|
||||||
|
}
|
||||||
|
JsonObject result(Request request, Response response);
|
||||||
}
|
}
|
164
src/de/steamwar/bungeecore/api/Token.java
Normale Datei
164
src/de/steamwar/bungeecore/api/Token.java
Normale Datei
@ -0,0 +1,164 @@
|
|||||||
|
/*
|
||||||
|
* This file is a part of the SteamWar software.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2020 SteamWar.de-Serverteam
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.steamwar.bungeecore.api;
|
||||||
|
|
||||||
|
import com.google.gson.JsonObject;
|
||||||
|
import com.google.gson.JsonParser;
|
||||||
|
import com.google.gson.stream.JsonWriter;
|
||||||
|
import de.steamwar.bungeecore.sql.SteamwarUser;
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
import javax.crypto.Cipher;
|
||||||
|
import java.io.*;
|
||||||
|
import java.math.BigInteger;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.security.*;
|
||||||
|
import java.security.spec.DSAPrivateKeySpec;
|
||||||
|
import java.security.spec.DSAPublicKeySpec;
|
||||||
|
import java.util.Base64;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
public class Token {
|
||||||
|
|
||||||
|
private static KeyPair pair;
|
||||||
|
|
||||||
|
private static KeyPair getKeyPair() {
|
||||||
|
if (pair != null) return pair;
|
||||||
|
|
||||||
|
File publicKeyFile = new File("~/token_dsa.pub");
|
||||||
|
File privateKeyFile = new File("~/token_dsa");
|
||||||
|
|
||||||
|
if (publicKeyFile.exists() && privateKeyFile.exists()) {
|
||||||
|
PublicKey publicKey = null;
|
||||||
|
try {
|
||||||
|
JsonObject jsonObject = JsonParser.parseReader(new BufferedReader(new InputStreamReader(new FileInputStream(publicKeyFile)))).getAsJsonObject();
|
||||||
|
BigInteger y = jsonObject.get("y").getAsBigInteger();
|
||||||
|
BigInteger p = jsonObject.get("p").getAsBigInteger();
|
||||||
|
BigInteger q = jsonObject.get("q").getAsBigInteger();
|
||||||
|
BigInteger g = jsonObject.get("g").getAsBigInteger();
|
||||||
|
KeyFactory keyFactory = KeyFactory.getInstance("DSA");
|
||||||
|
publicKey = keyFactory.generatePublic(new DSAPublicKeySpec(y, p, q, g));
|
||||||
|
} catch (Exception e) {
|
||||||
|
// Ignore
|
||||||
|
}
|
||||||
|
PrivateKey privateKey = null;
|
||||||
|
try {
|
||||||
|
JsonObject jsonObject = JsonParser.parseReader(new BufferedReader(new InputStreamReader(new FileInputStream(privateKeyFile)))).getAsJsonObject();
|
||||||
|
BigInteger x = jsonObject.get("x").getAsBigInteger();
|
||||||
|
BigInteger p = jsonObject.get("p").getAsBigInteger();
|
||||||
|
BigInteger q = jsonObject.get("q").getAsBigInteger();
|
||||||
|
BigInteger g = jsonObject.get("g").getAsBigInteger();
|
||||||
|
KeyFactory keyFactory = KeyFactory.getInstance("DSA");
|
||||||
|
privateKey = keyFactory.generatePrivate(new DSAPrivateKeySpec(x, p, q, g));
|
||||||
|
} catch (Exception e) {
|
||||||
|
// Ignore
|
||||||
|
}
|
||||||
|
pair = new KeyPair(publicKey, privateKey);
|
||||||
|
return pair;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("DSA");
|
||||||
|
keyPairGen.initialize(2048);
|
||||||
|
pair = keyPairGen.generateKeyPair();
|
||||||
|
saveKeyPair();
|
||||||
|
return pair;
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new SecurityException(e.getMessage(), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void saveKeyPair() {
|
||||||
|
File publicKeyFile = new File("~/token_dsa.pub");
|
||||||
|
File privateKeyFile = new File("~/token_dsa");
|
||||||
|
|
||||||
|
try {
|
||||||
|
publicKeyFile.createNewFile();
|
||||||
|
KeyFactory keyFactory = KeyFactory.getInstance(pair.getPrivate().getAlgorithm());
|
||||||
|
DSAPublicKeySpec dsaPublicKeySpec = keyFactory.getKeySpec(pair.getPublic(), DSAPublicKeySpec.class);
|
||||||
|
|
||||||
|
JsonObject privateKey = new JsonObject();
|
||||||
|
privateKey.addProperty("y", dsaPublicKeySpec.getY());
|
||||||
|
privateKey.addProperty("p", dsaPublicKeySpec.getP());
|
||||||
|
privateKey.addProperty("q", dsaPublicKeySpec.getQ());
|
||||||
|
privateKey.addProperty("g", dsaPublicKeySpec.getG());
|
||||||
|
new JsonWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(publicKeyFile)))).close();
|
||||||
|
} catch (Exception e) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
privateKeyFile.createNewFile();
|
||||||
|
KeyFactory keyFactory = KeyFactory.getInstance(pair.getPrivate().getAlgorithm());
|
||||||
|
DSAPrivateKeySpec dsaPrivateKeySpec = keyFactory.getKeySpec(pair.getPrivate(), DSAPrivateKeySpec.class);
|
||||||
|
|
||||||
|
JsonObject privateKey = new JsonObject();
|
||||||
|
privateKey.addProperty("x", dsaPrivateKeySpec.getX());
|
||||||
|
privateKey.addProperty("p", dsaPrivateKeySpec.getP());
|
||||||
|
privateKey.addProperty("q", dsaPrivateKeySpec.getQ());
|
||||||
|
privateKey.addProperty("g", dsaPrivateKeySpec.getG());
|
||||||
|
new JsonWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(privateKeyFile)))).close();
|
||||||
|
} catch (Exception e) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private UUID uuid;
|
||||||
|
private long creationDate;
|
||||||
|
|
||||||
|
public Token(SteamwarUser steamwarUser) {
|
||||||
|
uuid = steamwarUser.getUuid();
|
||||||
|
creationDate = System.currentTimeMillis();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Token(JsonObject jsonObject) {
|
||||||
|
uuid = UUID.fromString(jsonObject.get("uuid").getAsString());
|
||||||
|
creationDate = jsonObject.get("creationDate").getAsLong();
|
||||||
|
}
|
||||||
|
|
||||||
|
public JsonObject toJSON() {
|
||||||
|
JsonObject jsonObject = new JsonObject();
|
||||||
|
jsonObject.addProperty("uuid", uuid.toString());
|
||||||
|
jsonObject.addProperty("creationDate", creationDate);
|
||||||
|
return jsonObject;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String encrypt() {
|
||||||
|
try {
|
||||||
|
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
|
||||||
|
cipher.init(Cipher.ENCRYPT_MODE, getKeyPair().getPublic());
|
||||||
|
return Base64.getEncoder().encodeToString(cipher.doFinal(toJSON().toString().getBytes(StandardCharsets.UTF_8)));
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new SecurityException(e.getMessage(), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Token decrypt(String s) {
|
||||||
|
try {
|
||||||
|
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
|
||||||
|
cipher.init(Cipher.DECRYPT_MODE, getKeyPair().getPrivate());
|
||||||
|
byte[] bytes = cipher.doFinal(Base64.getDecoder().decode(s));
|
||||||
|
JsonObject jsonObject = JsonParser.parseReader(new InputStreamReader(new ByteArrayInputStream(bytes))).getAsJsonObject();
|
||||||
|
return new Token(jsonObject);
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new SecurityException(e.getMessage(), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
68
src/de/steamwar/bungeecore/api/WebAPI.java
Normale Datei
68
src/de/steamwar/bungeecore/api/WebAPI.java
Normale Datei
@ -0,0 +1,68 @@
|
|||||||
|
/*
|
||||||
|
* This file is a part of the SteamWar software.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2020 SteamWar.de-Serverteam
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.steamwar.bungeecore.api;
|
||||||
|
|
||||||
|
import com.google.gson.JsonObject;
|
||||||
|
import de.steamwar.bungeecore.api.v1.ServerstatusEndPoint;
|
||||||
|
import de.steamwar.bungeecore.api.v1.ServerteamEndPoint;
|
||||||
|
import de.steamwar.bungeecore.api.v1.statistics.*;
|
||||||
|
import de.steamwar.bungeecore.api.v1.user.GetUsernameEndPoint;
|
||||||
|
import de.steamwar.bungeecore.api.v1.user.GetUuidEndPoint;
|
||||||
|
import de.steamwar.bungeecore.api.v1.website.LoginEndPoint;
|
||||||
|
import de.steamwar.bungeecore.api.v1.website.LogoutEndPoint;
|
||||||
|
|
||||||
|
import static spark.Spark.port;
|
||||||
|
import static spark.Spark.post;
|
||||||
|
|
||||||
|
public class WebAPI {
|
||||||
|
|
||||||
|
private static EndPoint[] endPointsV1 = new EndPoint[] {
|
||||||
|
new FightsEndPoint(),
|
||||||
|
new HoursContributedEndPoint(),
|
||||||
|
new HoursPlayedEndPoint(),
|
||||||
|
new SchematicsAcceptedEndPoint(),
|
||||||
|
new UniqueJoinsEndPoint(),
|
||||||
|
new GetUsernameEndPoint(),
|
||||||
|
new GetUuidEndPoint(),
|
||||||
|
new LoginEndPoint(),
|
||||||
|
new LogoutEndPoint(),
|
||||||
|
new ServerstatusEndPoint(),
|
||||||
|
new ServerteamEndPoint(),
|
||||||
|
};
|
||||||
|
|
||||||
|
private static void register(EndPoint[] endPoints) {
|
||||||
|
for (EndPoint endPoint : endPoints) {
|
||||||
|
post(endPoint.path(), (request, response) -> {
|
||||||
|
JsonObject result = endPoint.result(request, response);
|
||||||
|
if (result == null) {
|
||||||
|
result = new JsonObject();
|
||||||
|
}
|
||||||
|
response.type("application/json");
|
||||||
|
return result.toString();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void start() {
|
||||||
|
port(1024);
|
||||||
|
|
||||||
|
register(endPointsV1);
|
||||||
|
}
|
||||||
|
}
|
38
src/de/steamwar/bungeecore/api/doc.txt
Normale Datei
38
src/de/steamwar/bungeecore/api/doc.txt
Normale Datei
@ -0,0 +1,38 @@
|
|||||||
|
```
|
||||||
|
SteamWar Endpoints:
|
||||||
|
|
||||||
|
Serverteam-Endpoint:
|
||||||
|
- UUID, Rang, InGame-Name
|
||||||
|
|
||||||
|
User-Endpoints:
|
||||||
|
- UUID -> skin.png
|
||||||
|
- UUID -> head.png
|
||||||
|
- Token -> UUID
|
||||||
|
- Token -> head.png
|
||||||
|
- Token -> skin.png
|
||||||
|
- Token -> InGame-Name
|
||||||
|
|
||||||
|
Website-User-Endpoints:
|
||||||
|
- (UserName, hashedPW) -> Token
|
||||||
|
- (Token) -> Void // Abmeldung
|
||||||
|
|
||||||
|
Serverstatus-Endpoint:
|
||||||
|
- PlayerSize, MaxPlayerSize
|
||||||
|
Response -> Status
|
||||||
|
|
||||||
|
Ranked-Endpoint:
|
||||||
|
- (Modus, Season?) -> Ranglist
|
||||||
|
- (UUID) -> Ränge
|
||||||
|
Ranglist-Endpoint:
|
||||||
|
- Modi // Alle Modi, welche eine Ranglist haben
|
||||||
|
Schem-Endpoint:
|
||||||
|
- (Modus, Season?) -> Public-Ranglist
|
||||||
|
- (Modus, Season?, Token) -> Privat-Ranglist
|
||||||
|
|
||||||
|
Statistiken-Endpoints:
|
||||||
|
- Modi, AnzahlFights // Anzahl Fights der letzten 7 Tage
|
||||||
|
- AnzahlJoins // Anzahl Joins der letzten 7 Tage (total)
|
||||||
|
- UniqueJoins // Anzahl uniquer PlayerJoins der letzten 7 Tage (total)
|
||||||
|
- HoursPlayed // Anzahl gespielter Stunden für alle Spieler der letzten 7 Tage (total)
|
||||||
|
|
||||||
|
```
|
39
src/de/steamwar/bungeecore/api/v1/ServerstatusEndPoint.java
Normale Datei
39
src/de/steamwar/bungeecore/api/v1/ServerstatusEndPoint.java
Normale Datei
@ -0,0 +1,39 @@
|
|||||||
|
/*
|
||||||
|
* This file is a part of the SteamWar software.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2020 SteamWar.de-Serverteam
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.steamwar.bungeecore.api.v1;
|
||||||
|
|
||||||
|
import com.google.gson.JsonObject;
|
||||||
|
import de.steamwar.bungeecore.api.EndPoint;
|
||||||
|
import net.md_5.bungee.BungeeCord;
|
||||||
|
import spark.Request;
|
||||||
|
import spark.Response;
|
||||||
|
|
||||||
|
public class ServerstatusEndPoint implements EndPoint {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public JsonObject result(Request request, Response response) {
|
||||||
|
JsonObject jsonObject = new JsonObject();
|
||||||
|
jsonObject.addProperty("players", BungeeCord.getInstance().getPlayers().size());
|
||||||
|
jsonObject.addProperty("maxPlayers", BungeeCord.getInstance().getConfig().getPlayerLimit());
|
||||||
|
|
||||||
|
response.status(200);
|
||||||
|
return jsonObject;
|
||||||
|
}
|
||||||
|
}
|
46
src/de/steamwar/bungeecore/api/v1/ServerteamEndPoint.java
Normale Datei
46
src/de/steamwar/bungeecore/api/v1/ServerteamEndPoint.java
Normale Datei
@ -0,0 +1,46 @@
|
|||||||
|
/*
|
||||||
|
* This file is a part of the SteamWar software.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2020 SteamWar.de-Serverteam
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.steamwar.bungeecore.api.v1;
|
||||||
|
|
||||||
|
import com.google.gson.JsonArray;
|
||||||
|
import com.google.gson.JsonObject;
|
||||||
|
import de.steamwar.bungeecore.api.EndPoint;
|
||||||
|
import de.steamwar.bungeecore.sql.SteamwarUser;
|
||||||
|
import spark.Request;
|
||||||
|
import spark.Response;
|
||||||
|
|
||||||
|
public class ServerteamEndPoint implements EndPoint {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public JsonObject result(Request request, Response response) {
|
||||||
|
JsonObject jsonObject = new JsonObject();
|
||||||
|
JsonArray jsonArray = new JsonArray();
|
||||||
|
SteamwarUser.getServerTeam().forEach(steamwarUser -> {
|
||||||
|
JsonObject user = new JsonObject();
|
||||||
|
user.addProperty("name", steamwarUser.getUserName());
|
||||||
|
user.addProperty("rank", steamwarUser.getUserGroup().name());
|
||||||
|
jsonArray.add(user);
|
||||||
|
});
|
||||||
|
jsonObject.add("", jsonArray);
|
||||||
|
|
||||||
|
response.status(200);
|
||||||
|
return jsonObject;
|
||||||
|
}
|
||||||
|
}
|
45
src/de/steamwar/bungeecore/api/v1/statistics/FightsEndPoint.java
Normale Datei
45
src/de/steamwar/bungeecore/api/v1/statistics/FightsEndPoint.java
Normale Datei
@ -0,0 +1,45 @@
|
|||||||
|
/*
|
||||||
|
* This file is a part of the SteamWar software.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2020 SteamWar.de-Serverteam
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.steamwar.bungeecore.api.v1.statistics;
|
||||||
|
|
||||||
|
import com.google.gson.JsonObject;
|
||||||
|
import de.steamwar.bungeecore.api.EndPoint;
|
||||||
|
import de.steamwar.bungeecore.sql.Statistics;
|
||||||
|
import spark.Request;
|
||||||
|
import spark.Response;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class FightsEndPoint implements EndPoint {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public JsonObject result(Request request, Response response) {
|
||||||
|
Map<String, Map<String, Integer>> result = Statistics.getFightsPerDayPerGameMode();
|
||||||
|
JsonObject jsonObject = new JsonObject();
|
||||||
|
result.forEach((s, stringIntegerMap) -> {
|
||||||
|
JsonObject singleResult = new JsonObject();
|
||||||
|
stringIntegerMap.forEach(singleResult::addProperty);
|
||||||
|
jsonObject.add(s, singleResult);
|
||||||
|
});
|
||||||
|
|
||||||
|
response.status(200);
|
||||||
|
return jsonObject;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,41 @@
|
|||||||
|
/*
|
||||||
|
* This file is a part of the SteamWar software.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2020 SteamWar.de-Serverteam
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.steamwar.bungeecore.api.v1.statistics;
|
||||||
|
|
||||||
|
import com.google.gson.JsonObject;
|
||||||
|
import de.steamwar.bungeecore.api.EndPoint;
|
||||||
|
import de.steamwar.bungeecore.sql.Statistics;
|
||||||
|
import spark.Request;
|
||||||
|
import spark.Response;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class HoursContributedEndPoint implements EndPoint {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public JsonObject result(Request request, Response response) {
|
||||||
|
Map<String, Double> result = Statistics.getHoursContributedPerPlayer();
|
||||||
|
JsonObject jsonObject = new JsonObject();
|
||||||
|
result.forEach(jsonObject::addProperty);
|
||||||
|
|
||||||
|
response.status(200);
|
||||||
|
return jsonObject;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,41 @@
|
|||||||
|
/*
|
||||||
|
* This file is a part of the SteamWar software.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2020 SteamWar.de-Serverteam
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.steamwar.bungeecore.api.v1.statistics;
|
||||||
|
|
||||||
|
import com.google.gson.JsonObject;
|
||||||
|
import de.steamwar.bungeecore.api.EndPoint;
|
||||||
|
import de.steamwar.bungeecore.sql.Statistics;
|
||||||
|
import spark.Request;
|
||||||
|
import spark.Response;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class HoursPlayedEndPoint implements EndPoint {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public JsonObject result(Request request, Response response) {
|
||||||
|
Map<String, Double> result = Statistics.getHoursPlayedPerDay();
|
||||||
|
JsonObject jsonObject = new JsonObject();
|
||||||
|
result.forEach(jsonObject::addProperty);
|
||||||
|
|
||||||
|
response.status(200);
|
||||||
|
return jsonObject;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,45 @@
|
|||||||
|
/*
|
||||||
|
* This file is a part of the SteamWar software.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2020 SteamWar.de-Serverteam
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.steamwar.bungeecore.api.v1.statistics;
|
||||||
|
|
||||||
|
import com.google.gson.JsonObject;
|
||||||
|
import de.steamwar.bungeecore.api.EndPoint;
|
||||||
|
import de.steamwar.bungeecore.sql.Statistics;
|
||||||
|
import spark.Request;
|
||||||
|
import spark.Response;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class SchematicsAcceptedEndPoint implements EndPoint {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public JsonObject result(Request request, Response response) {
|
||||||
|
Map<String, Map<String, Integer>> result = Statistics.getAcceptedSchematicsPerDayPerGameMode();
|
||||||
|
JsonObject jsonObject = new JsonObject();
|
||||||
|
result.forEach((s, stringIntegerMap) -> {
|
||||||
|
JsonObject singleResult = new JsonObject();
|
||||||
|
stringIntegerMap.forEach(singleResult::addProperty);
|
||||||
|
jsonObject.add(s, singleResult);
|
||||||
|
});
|
||||||
|
|
||||||
|
response.status(200);
|
||||||
|
return jsonObject;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,41 @@
|
|||||||
|
/*
|
||||||
|
* This file is a part of the SteamWar software.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2020 SteamWar.de-Serverteam
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.steamwar.bungeecore.api.v1.statistics;
|
||||||
|
|
||||||
|
import com.google.gson.JsonObject;
|
||||||
|
import de.steamwar.bungeecore.api.EndPoint;
|
||||||
|
import de.steamwar.bungeecore.sql.Statistics;
|
||||||
|
import spark.Request;
|
||||||
|
import spark.Response;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class UniqueJoinsEndPoint implements EndPoint {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public JsonObject result(Request request, Response response) {
|
||||||
|
Map<String, Integer> result = Statistics.getUniqueJoinsPerDay();
|
||||||
|
JsonObject jsonObject = new JsonObject();
|
||||||
|
result.forEach(jsonObject::addProperty);
|
||||||
|
|
||||||
|
response.status(200);
|
||||||
|
return jsonObject;
|
||||||
|
}
|
||||||
|
}
|
50
src/de/steamwar/bungeecore/api/v1/user/GetUsernameEndPoint.java
Normale Datei
50
src/de/steamwar/bungeecore/api/v1/user/GetUsernameEndPoint.java
Normale Datei
@ -0,0 +1,50 @@
|
|||||||
|
/*
|
||||||
|
* This file is a part of the SteamWar software.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2020 SteamWar.de-Serverteam
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.steamwar.bungeecore.api.v1.user;
|
||||||
|
|
||||||
|
import com.google.gson.JsonObject;
|
||||||
|
import de.steamwar.bungeecore.api.AuthUtils;
|
||||||
|
import de.steamwar.bungeecore.api.EndPoint;
|
||||||
|
import de.steamwar.bungeecore.api.Token;
|
||||||
|
import de.steamwar.bungeecore.sql.SteamwarUser;
|
||||||
|
import spark.Request;
|
||||||
|
import spark.Response;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
import static spark.Spark.post;
|
||||||
|
|
||||||
|
public class GetUsernameEndPoint implements EndPoint {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public JsonObject result(Request request, Response response) {
|
||||||
|
Optional<Token> optionalToken = AuthUtils.isAuthorized(request, response);
|
||||||
|
if (!optionalToken.isPresent()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
Token token = optionalToken.get();
|
||||||
|
|
||||||
|
JsonObject jsonObject = new JsonObject();
|
||||||
|
jsonObject.addProperty("username", SteamwarUser.get(token.getUuid()).getUserName());
|
||||||
|
|
||||||
|
response.status(200);
|
||||||
|
return jsonObject;
|
||||||
|
}
|
||||||
|
}
|
47
src/de/steamwar/bungeecore/api/v1/user/GetUuidEndPoint.java
Normale Datei
47
src/de/steamwar/bungeecore/api/v1/user/GetUuidEndPoint.java
Normale Datei
@ -0,0 +1,47 @@
|
|||||||
|
/*
|
||||||
|
* This file is a part of the SteamWar software.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2020 SteamWar.de-Serverteam
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.steamwar.bungeecore.api.v1.user;
|
||||||
|
|
||||||
|
import com.google.gson.JsonObject;
|
||||||
|
import de.steamwar.bungeecore.api.AuthUtils;
|
||||||
|
import de.steamwar.bungeecore.api.EndPoint;
|
||||||
|
import de.steamwar.bungeecore.api.Token;
|
||||||
|
import spark.Request;
|
||||||
|
import spark.Response;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
public class GetUuidEndPoint implements EndPoint {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public JsonObject result(Request request, Response response) {
|
||||||
|
Optional<Token> optionalToken = AuthUtils.isAuthorized(request, response);
|
||||||
|
if (!optionalToken.isPresent()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
Token token = optionalToken.get();
|
||||||
|
|
||||||
|
JsonObject jsonObject = new JsonObject();
|
||||||
|
jsonObject.addProperty("uuid", token.getUuid().toString());
|
||||||
|
|
||||||
|
response.status(200);
|
||||||
|
return jsonObject;
|
||||||
|
}
|
||||||
|
}
|
@ -17,13 +17,17 @@
|
|||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package de.steamwar.bungeecore.network;
|
package de.steamwar.bungeecore.api.v1.website;
|
||||||
|
|
||||||
import com.velocitypowered.api.proxy.server.RegisteredServer;
|
import com.google.gson.JsonObject;
|
||||||
import de.steamwar.network.packets.MetaInfos;
|
import de.steamwar.bungeecore.api.EndPoint;
|
||||||
import lombok.Getter;
|
import spark.Request;
|
||||||
|
import spark.Response;
|
||||||
|
|
||||||
@Getter
|
public class LoginEndPoint implements EndPoint {
|
||||||
public record ServerMetaInfo(RegisteredServer sender) implements MetaInfos {
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public JsonObject result(Request request, Response response) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
@ -17,13 +17,17 @@
|
|||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package de.steamwar.command;
|
package de.steamwar.bungeecore.api.v1.website;
|
||||||
|
|
||||||
import com.velocitypowered.api.proxy.Player;
|
import com.google.gson.JsonObject;
|
||||||
|
import de.steamwar.bungeecore.api.EndPoint;
|
||||||
|
import spark.Request;
|
||||||
|
import spark.Response;
|
||||||
|
|
||||||
public interface TypeMapper<T> extends AbstractTypeMapper<Player, T> {
|
public class LogoutEndPoint implements EndPoint {
|
||||||
/**
|
|
||||||
* The CommandSender can be null!
|
@Override
|
||||||
*/
|
public JsonObject result(Request request, Response response) {
|
||||||
T map(Player commandSender, String[] previousArguments, String s);
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
@ -19,9 +19,9 @@
|
|||||||
|
|
||||||
package de.steamwar.bungeecore.bot;
|
package de.steamwar.bungeecore.bot;
|
||||||
|
|
||||||
import de.steamwar.bungeecore.VelocityCore;
|
import de.steamwar.bungeecore.BungeeCore;
|
||||||
import de.steamwar.bungeecore.bot.config.SteamwarDiscordBotConfig;
|
import de.steamwar.bungeecore.bot.config.SteamwarDiscordBotConfig;
|
||||||
import de.steamwar.sql.SteamwarUser;
|
import de.steamwar.bungeecore.sql.SteamwarUser;
|
||||||
import net.dv8tion.jda.api.MessageBuilder;
|
import net.dv8tion.jda.api.MessageBuilder;
|
||||||
import net.dv8tion.jda.api.entities.Emoji;
|
import net.dv8tion.jda.api.entities.Emoji;
|
||||||
import net.dv8tion.jda.api.entities.Member;
|
import net.dv8tion.jda.api.entities.Member;
|
||||||
@ -46,8 +46,8 @@ public class AuthManager {
|
|||||||
String code = Base64.getEncoder().encodeToString(randBytes);
|
String code = Base64.getEncoder().encodeToString(randBytes);
|
||||||
|
|
||||||
TOKENS.put(code, member.getIdLong());
|
TOKENS.put(code, member.getIdLong());
|
||||||
VelocityCore.log("Created Discord Auth-Token: " + code + " for: " + member.getUser().getAsTag());
|
BungeeCore.log("Created Discord Auth-Token: " + code + " for: " + member.getUser().getAsTag());
|
||||||
VelocityCore.get().getProxy().getScheduler().schedule(VelocityCore.get(), () -> TOKENS.remove(code), 10, TimeUnit.MINUTES);
|
BungeeCore.get().getProxy().getScheduler().schedule(BungeeCore.get(), () -> TOKENS.remove(code), 10, TimeUnit.MINUTES);
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -19,7 +19,7 @@
|
|||||||
|
|
||||||
package de.steamwar.bungeecore.bot;
|
package de.steamwar.bungeecore.bot;
|
||||||
|
|
||||||
import de.steamwar.bungeecore.VelocityCore;
|
import de.steamwar.bungeecore.BungeeCore;
|
||||||
import de.steamwar.bungeecore.bot.commands.*;
|
import de.steamwar.bungeecore.bot.commands.*;
|
||||||
import de.steamwar.bungeecore.bot.config.SteamwarDiscordBotConfig;
|
import de.steamwar.bungeecore.bot.config.SteamwarDiscordBotConfig;
|
||||||
import de.steamwar.bungeecore.bot.events.EventManager;
|
import de.steamwar.bungeecore.bot.events.EventManager;
|
||||||
@ -28,8 +28,8 @@ import de.steamwar.bungeecore.bot.listeners.*;
|
|||||||
import de.steamwar.bungeecore.bot.util.DiscordRolesMessage;
|
import de.steamwar.bungeecore.bot.util.DiscordRolesMessage;
|
||||||
import de.steamwar.bungeecore.bot.util.DiscordRulesMessage;
|
import de.steamwar.bungeecore.bot.util.DiscordRulesMessage;
|
||||||
import de.steamwar.bungeecore.bot.util.DiscordTicketMessage;
|
import de.steamwar.bungeecore.bot.util.DiscordTicketMessage;
|
||||||
|
import de.steamwar.bungeecore.sql.Event;
|
||||||
import de.steamwar.messages.ChatSender;
|
import de.steamwar.messages.ChatSender;
|
||||||
import de.steamwar.sql.Event;
|
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import net.dv8tion.jda.api.JDA;
|
import net.dv8tion.jda.api.JDA;
|
||||||
import net.dv8tion.jda.api.JDABuilder;
|
import net.dv8tion.jda.api.JDABuilder;
|
||||||
@ -81,7 +81,7 @@ public class SteamwarDiscordBot {
|
|||||||
} catch (LoginException e) {
|
} catch (LoginException e) {
|
||||||
throw new SecurityException("Could not Login: " + SteamwarDiscordBotConfig.TOKEN, e);
|
throw new SecurityException("Could not Login: " + SteamwarDiscordBotConfig.TOKEN, e);
|
||||||
}
|
}
|
||||||
ProxyServer.getInstance().getScheduler().runAsync(VelocityCore.get(), () -> {
|
ProxyServer.getInstance().getScheduler().runAsync(BungeeCore.get(), () -> {
|
||||||
try {
|
try {
|
||||||
jda.awaitReady();
|
jda.awaitReady();
|
||||||
} catch (InterruptedException e) {
|
} catch (InterruptedException e) {
|
||||||
@ -90,11 +90,11 @@ public class SteamwarDiscordBot {
|
|||||||
try {
|
try {
|
||||||
activity();
|
activity();
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
VelocityCore.get().getLogger().log(Level.SEVERE, "Could not set initial activity to discord", e);
|
BungeeCore.get().getLogger().log(Level.SEVERE, "Could not set initial activity to discord", e);
|
||||||
}
|
}
|
||||||
EventManager.update();
|
EventManager.update();
|
||||||
SchematicsManager.update();
|
SchematicsManager.update();
|
||||||
ProxyServer.getInstance().getScheduler().schedule(VelocityCore.get(), () -> {
|
ProxyServer.getInstance().getScheduler().schedule(BungeeCore.get(), () -> {
|
||||||
try {
|
try {
|
||||||
activity();
|
activity();
|
||||||
EventManager.update();
|
EventManager.update();
|
||||||
@ -148,7 +148,7 @@ public class SteamwarDiscordBot {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
int count = VelocityCore.get().getProxy().getOnlineCount();
|
int count = BungeeCore.get().getProxy().getOnlineCount();
|
||||||
if (count == 1) {
|
if (count == 1) {
|
||||||
jda.getPresence().setActivity(Activity.playing("mit 1 Spieler"));
|
jda.getPresence().setActivity(Activity.playing("mit 1 Spieler"));
|
||||||
} else {
|
} else {
|
||||||
|
@ -21,7 +21,8 @@ package de.steamwar.bungeecore.bot.commands;
|
|||||||
|
|
||||||
import de.steamwar.bungeecore.Message;
|
import de.steamwar.bungeecore.Message;
|
||||||
import de.steamwar.bungeecore.commands.PunishmentCommand;
|
import de.steamwar.bungeecore.commands.PunishmentCommand;
|
||||||
import de.steamwar.sql.SteamwarUser;
|
import de.steamwar.bungeecore.sql.Punishment;
|
||||||
|
import de.steamwar.bungeecore.sql.SteamwarUser;
|
||||||
import net.dv8tion.jda.api.events.interaction.SlashCommandEvent;
|
import net.dv8tion.jda.api.events.interaction.SlashCommandEvent;
|
||||||
import net.dv8tion.jda.api.interactions.commands.OptionType;
|
import net.dv8tion.jda.api.interactions.commands.OptionType;
|
||||||
|
|
||||||
@ -44,7 +45,7 @@ public class BanCommand extends BasicDiscordCommand {
|
|||||||
}
|
}
|
||||||
|
|
||||||
SteamwarUser sender = SteamwarUser.get(event.getMember().getIdLong());
|
SteamwarUser sender = SteamwarUser.get(event.getMember().getIdLong());
|
||||||
SteamwarUser target = PunishmentCommand.getOrCreateOfflinePlayer(event.getOption("user").getAsString());
|
SteamwarUser target = SteamwarUser.getOrCreateOfflinePlayer(event.getOption("user").getAsString());
|
||||||
if (target == null) {
|
if (target == null) {
|
||||||
event.reply("Angegebener User invalide").setEphemeral(true).queue();
|
event.reply("Angegebener User invalide").setEphemeral(true).queue();
|
||||||
return;
|
return;
|
||||||
@ -59,7 +60,7 @@ public class BanCommand extends BasicDiscordCommand {
|
|||||||
String msg = event.getOption("reason").getAsString();
|
String msg = event.getOption("reason").getAsString();
|
||||||
boolean isPerma = event.getOption("time").getAsString().equals("perma");
|
boolean isPerma = event.getOption("time").getAsString().equals("perma");
|
||||||
|
|
||||||
PunishmentCommand.ban(target, time, msg, sender, isPerma);
|
target.punish(Punishment.PunishmentType.Ban, time, msg, sender.getId(), isPerma);
|
||||||
Message.team("BAN_TEAM", new Message("PREFIX"), target.getUserName(), sender.getUserName(), new Message((isPerma ? "BAN_PERMA" : "BAN_UNTIL"), time), msg);
|
Message.team("BAN_TEAM", new Message("PREFIX"), target.getUserName(), sender.getUserName(), new Message((isPerma ? "BAN_PERMA" : "BAN_UNTIL"), time), msg);
|
||||||
event.reply("Erfolgreich " + target.getUserName() + (isPerma ? " permanent" : " bis " + time) + " gebannt").setEphemeral(true).queue();
|
event.reply("Erfolgreich " + target.getUserName() + (isPerma ? " permanent" : " bis " + time) + " gebannt").setEphemeral(true).queue();
|
||||||
}
|
}
|
||||||
|
@ -19,8 +19,8 @@
|
|||||||
|
|
||||||
package de.steamwar.bungeecore.bot.commands;
|
package de.steamwar.bungeecore.bot.commands;
|
||||||
|
|
||||||
import de.steamwar.sql.SteamwarUser;
|
import de.steamwar.bungeecore.sql.SteamwarUser;
|
||||||
import de.steamwar.sql.UserPerm;
|
import de.steamwar.bungeecore.sql.UserGroup;
|
||||||
import net.dv8tion.jda.api.entities.Member;
|
import net.dv8tion.jda.api.entities.Member;
|
||||||
import net.dv8tion.jda.api.events.interaction.SlashCommandEvent;
|
import net.dv8tion.jda.api.events.interaction.SlashCommandEvent;
|
||||||
import net.dv8tion.jda.api.interactions.commands.build.CommandData;
|
import net.dv8tion.jda.api.interactions.commands.build.CommandData;
|
||||||
@ -45,7 +45,7 @@ public abstract class BasicDiscordCommand extends CommandData {
|
|||||||
protected boolean testPermission(SlashCommandEvent event) {
|
protected boolean testPermission(SlashCommandEvent event) {
|
||||||
Member member = event.getMember();
|
Member member = event.getMember();
|
||||||
SteamwarUser steamwarUser = SteamwarUser.get(member.getIdLong());
|
SteamwarUser steamwarUser = SteamwarUser.get(member.getIdLong());
|
||||||
if (steamwarUser == null || (!steamwarUser.hasPerm(UserPerm.TEAM))) {
|
if (steamwarUser == null || (!steamwarUser.getUserGroup().isTeamGroup() && steamwarUser.getUserGroup() != UserGroup.Builder)) {
|
||||||
event.reply("Du hast für " + event.getName() + " keine Rechte oder es existiert keine Verknüpfung für dich.").setEphemeral(true).queue();
|
event.reply("Du hast für " + event.getName() + " keine Rechte oder es existiert keine Verknüpfung für dich.").setEphemeral(true).queue();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -21,8 +21,8 @@ package de.steamwar.bungeecore.bot.commands;
|
|||||||
|
|
||||||
import de.steamwar.bungeecore.Message;
|
import de.steamwar.bungeecore.Message;
|
||||||
import de.steamwar.bungeecore.commands.PunishmentCommand;
|
import de.steamwar.bungeecore.commands.PunishmentCommand;
|
||||||
import de.steamwar.sql.Punishment;
|
import de.steamwar.bungeecore.sql.Punishment;
|
||||||
import de.steamwar.sql.SteamwarUser;
|
import de.steamwar.bungeecore.sql.SteamwarUser;
|
||||||
import net.dv8tion.jda.api.events.interaction.SlashCommandEvent;
|
import net.dv8tion.jda.api.events.interaction.SlashCommandEvent;
|
||||||
import net.dv8tion.jda.api.interactions.commands.OptionType;
|
import net.dv8tion.jda.api.interactions.commands.OptionType;
|
||||||
|
|
||||||
@ -45,7 +45,7 @@ public class MuteCommand extends BasicDiscordCommand {
|
|||||||
}
|
}
|
||||||
|
|
||||||
SteamwarUser sender = SteamwarUser.get(event.getMember().getIdLong());
|
SteamwarUser sender = SteamwarUser.get(event.getMember().getIdLong());
|
||||||
SteamwarUser target = PunishmentCommand.getOrCreateOfflinePlayer(event.getOption("user").getAsString());
|
SteamwarUser target = SteamwarUser.getOrCreateOfflinePlayer(event.getOption("user").getAsString());
|
||||||
if (target == null) {
|
if (target == null) {
|
||||||
event.reply("Angegebener User invalide").setEphemeral(true).complete();
|
event.reply("Angegebener User invalide").setEphemeral(true).complete();
|
||||||
return;
|
return;
|
||||||
|
@ -19,10 +19,10 @@
|
|||||||
|
|
||||||
package de.steamwar.bungeecore.bot.commands;
|
package de.steamwar.bungeecore.bot.commands;
|
||||||
|
|
||||||
import de.steamwar.sql.Event;
|
import de.steamwar.bungeecore.sql.Event;
|
||||||
import de.steamwar.sql.SteamwarUser;
|
import de.steamwar.bungeecore.sql.SteamwarUser;
|
||||||
import de.steamwar.sql.Team;
|
import de.steamwar.bungeecore.sql.Team;
|
||||||
import de.steamwar.sql.TeamTeilnahme;
|
import de.steamwar.bungeecore.sql.TeamTeilnahme;
|
||||||
import net.dv8tion.jda.api.EmbedBuilder;
|
import net.dv8tion.jda.api.EmbedBuilder;
|
||||||
import net.dv8tion.jda.api.entities.Emoji;
|
import net.dv8tion.jda.api.entities.Emoji;
|
||||||
import net.dv8tion.jda.api.events.interaction.SlashCommandEvent;
|
import net.dv8tion.jda.api.events.interaction.SlashCommandEvent;
|
||||||
@ -91,6 +91,6 @@ public class TeamCommand extends BasicDiscordCommand {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private boolean isOnline(SteamwarUser user) {
|
private boolean isOnline(SteamwarUser user) {
|
||||||
return ProxyServer.getInstance().getPlayer(user.getUUID()) != null;
|
return ProxyServer.getInstance().getPlayer(user.getUuid()) != null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,10 +19,8 @@
|
|||||||
|
|
||||||
package de.steamwar.bungeecore.bot.commands;
|
package de.steamwar.bungeecore.bot.commands;
|
||||||
|
|
||||||
import de.steamwar.bungeecore.commands.PunishmentCommand;
|
import de.steamwar.bungeecore.sql.Punishment;
|
||||||
import de.steamwar.sql.BannedUserIPs;
|
import de.steamwar.bungeecore.sql.SteamwarUser;
|
||||||
import de.steamwar.sql.Punishment;
|
|
||||||
import de.steamwar.sql.SteamwarUser;
|
|
||||||
import net.dv8tion.jda.api.events.interaction.SlashCommandEvent;
|
import net.dv8tion.jda.api.events.interaction.SlashCommandEvent;
|
||||||
import net.dv8tion.jda.api.interactions.commands.OptionType;
|
import net.dv8tion.jda.api.interactions.commands.OptionType;
|
||||||
|
|
||||||
@ -44,7 +42,7 @@ public class UnbanCommand extends BasicDiscordCommand {
|
|||||||
}
|
}
|
||||||
|
|
||||||
SteamwarUser sender = SteamwarUser.get(event.getMember().getIdLong());
|
SteamwarUser sender = SteamwarUser.get(event.getMember().getIdLong());
|
||||||
SteamwarUser target = PunishmentCommand.getOrCreateOfflinePlayer(event.getOption("user").getAsString());
|
SteamwarUser target = SteamwarUser.getOrCreateOfflinePlayer(event.getOption("user").getAsString());
|
||||||
if (target == null) {
|
if (target == null) {
|
||||||
event.reply("Angegebener User invalide").setEphemeral(true).queue();
|
event.reply("Angegebener User invalide").setEphemeral(true).queue();
|
||||||
return;
|
return;
|
||||||
@ -56,7 +54,6 @@ public class UnbanCommand extends BasicDiscordCommand {
|
|||||||
}
|
}
|
||||||
|
|
||||||
target.punish(Punishment.PunishmentType.Ban, Timestamp.from(new Date().toInstant()), "Unban", sender.getId(), false);
|
target.punish(Punishment.PunishmentType.Ban, Timestamp.from(new Date().toInstant()), "Unban", sender.getId(), false);
|
||||||
BannedUserIPs.unbanIPs(target.getId());
|
|
||||||
event.reply("Erfolgreich " + target.getUserName() + " entbannt").setEphemeral(true).queue();
|
event.reply("Erfolgreich " + target.getUserName() + " entbannt").setEphemeral(true).queue();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,9 +19,9 @@
|
|||||||
|
|
||||||
package de.steamwar.bungeecore.bot.commands;
|
package de.steamwar.bungeecore.bot.commands;
|
||||||
|
|
||||||
import de.steamwar.sql.Punishment;
|
import de.steamwar.bungeecore.sql.Punishment;
|
||||||
import de.steamwar.sql.SteamwarUser;
|
import de.steamwar.bungeecore.sql.SteamwarUser;
|
||||||
import de.steamwar.sql.Team;
|
import de.steamwar.bungeecore.sql.Team;
|
||||||
import net.dv8tion.jda.api.EmbedBuilder;
|
import net.dv8tion.jda.api.EmbedBuilder;
|
||||||
import net.dv8tion.jda.api.events.interaction.SlashCommandEvent;
|
import net.dv8tion.jda.api.events.interaction.SlashCommandEvent;
|
||||||
import net.dv8tion.jda.api.interactions.commands.OptionType;
|
import net.dv8tion.jda.api.interactions.commands.OptionType;
|
||||||
@ -72,7 +72,7 @@ public class WhoisCommand extends BasicDiscordCommand {
|
|||||||
EmbedBuilder embedBuilder = new EmbedBuilder();
|
EmbedBuilder embedBuilder = new EmbedBuilder();
|
||||||
embedBuilder.setTitle("Whois: " + user.getUserName());
|
embedBuilder.setTitle("Whois: " + user.getUserName());
|
||||||
StringBuilder st = new StringBuilder();
|
StringBuilder st = new StringBuilder();
|
||||||
st.append("UUID: ").append(user.getUUID()).append("\n");
|
st.append("UUID: ").append(user.getUuid()).append("\n");
|
||||||
st.append("ID: ").append(user.getId()).append("\n");
|
st.append("ID: ").append(user.getId()).append("\n");
|
||||||
if (user.getDiscordId() != null) {
|
if (user.getDiscordId() != null) {
|
||||||
st.append("DiscordID: ").append(user.getDiscordId()).append("\n");
|
st.append("DiscordID: ").append(user.getDiscordId()).append("\n");
|
||||||
|
@ -19,7 +19,7 @@
|
|||||||
|
|
||||||
package de.steamwar.bungeecore.bot.config;
|
package de.steamwar.bungeecore.bot.config;
|
||||||
|
|
||||||
import de.steamwar.sql.UserPerm;
|
import de.steamwar.bungeecore.sql.UserGroup;
|
||||||
import net.md_5.bungee.config.Configuration;
|
import net.md_5.bungee.config.Configuration;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@ -52,7 +52,7 @@ public class SteamwarDiscordBotConfig {
|
|||||||
public static String TICKET_CREATED;
|
public static String TICKET_CREATED;
|
||||||
public static String TICKET_LOG;
|
public static String TICKET_LOG;
|
||||||
public static Map<String, DiscordTicketType> TICKET_TYPES;
|
public static Map<String, DiscordTicketType> TICKET_TYPES;
|
||||||
public static Map<UserPerm, String> RANKS;
|
public static Map<UserGroup, String> RANKS;
|
||||||
|
|
||||||
public static void loadConfig(Configuration config) {
|
public static void loadConfig(Configuration config) {
|
||||||
TOKEN = config.getString("token");
|
TOKEN = config.getString("token");
|
||||||
@ -109,7 +109,7 @@ public class SteamwarDiscordBotConfig {
|
|||||||
RANKS = new HashMap<>();
|
RANKS = new HashMap<>();
|
||||||
Configuration ranksSections = config.getSection("ranks");
|
Configuration ranksSections = config.getSection("ranks");
|
||||||
for (String type : ranksSections.getKeys()) {
|
for (String type : ranksSections.getKeys()) {
|
||||||
RANKS.put(UserPerm.valueOf(type.toUpperCase()), ranksSections.getString(type));
|
RANKS.put(UserGroup.getUsergroup(type), ranksSections.getString(type));
|
||||||
}
|
}
|
||||||
loaded = true;
|
loaded = true;
|
||||||
}
|
}
|
||||||
|
@ -21,10 +21,10 @@ package de.steamwar.bungeecore.bot.events;
|
|||||||
|
|
||||||
import de.steamwar.bungeecore.bot.SteamwarDiscordBot;
|
import de.steamwar.bungeecore.bot.SteamwarDiscordBot;
|
||||||
import de.steamwar.bungeecore.bot.config.SteamwarDiscordBotConfig;
|
import de.steamwar.bungeecore.bot.config.SteamwarDiscordBotConfig;
|
||||||
import de.steamwar.sql.EventFight;
|
import de.steamwar.bungeecore.sql.Event;
|
||||||
import de.steamwar.sql.Team;
|
import de.steamwar.bungeecore.sql.EventFight;
|
||||||
import de.steamwar.sql.TeamTeilnahme;
|
import de.steamwar.bungeecore.sql.Team;
|
||||||
import de.steamwar.sql.Event;
|
import de.steamwar.bungeecore.sql.TeamTeilnahme;
|
||||||
import lombok.experimental.UtilityClass;
|
import lombok.experimental.UtilityClass;
|
||||||
import net.dv8tion.jda.api.EmbedBuilder;
|
import net.dv8tion.jda.api.EmbedBuilder;
|
||||||
import net.dv8tion.jda.api.MessageBuilder;
|
import net.dv8tion.jda.api.MessageBuilder;
|
||||||
|
@ -22,7 +22,7 @@ package de.steamwar.bungeecore.bot.events;
|
|||||||
import de.steamwar.bungeecore.bot.SteamwarDiscordBot;
|
import de.steamwar.bungeecore.bot.SteamwarDiscordBot;
|
||||||
import de.steamwar.bungeecore.bot.config.SteamwarDiscordBotConfig;
|
import de.steamwar.bungeecore.bot.config.SteamwarDiscordBotConfig;
|
||||||
import de.steamwar.bungeecore.commands.CheckCommand;
|
import de.steamwar.bungeecore.commands.CheckCommand;
|
||||||
import de.steamwar.sql.SteamwarUser;
|
import de.steamwar.bungeecore.sql.SteamwarUser;
|
||||||
import lombok.experimental.UtilityClass;
|
import lombok.experimental.UtilityClass;
|
||||||
import net.dv8tion.jda.api.EmbedBuilder;
|
import net.dv8tion.jda.api.EmbedBuilder;
|
||||||
import net.dv8tion.jda.api.MessageBuilder;
|
import net.dv8tion.jda.api.MessageBuilder;
|
||||||
|
@ -21,7 +21,7 @@ package de.steamwar.bungeecore.bot.listeners;
|
|||||||
|
|
||||||
import de.steamwar.bungeecore.bot.AuthManager;
|
import de.steamwar.bungeecore.bot.AuthManager;
|
||||||
import de.steamwar.bungeecore.bot.config.SteamwarDiscordBotConfig;
|
import de.steamwar.bungeecore.bot.config.SteamwarDiscordBotConfig;
|
||||||
import de.steamwar.sql.SteamwarUser;
|
import de.steamwar.bungeecore.sql.SteamwarUser;
|
||||||
import net.dv8tion.jda.api.entities.ChannelType;
|
import net.dv8tion.jda.api.entities.ChannelType;
|
||||||
import net.dv8tion.jda.api.events.interaction.GenericComponentInteractionCreateEvent;
|
import net.dv8tion.jda.api.events.interaction.GenericComponentInteractionCreateEvent;
|
||||||
import net.dv8tion.jda.api.interactions.InteractionType;
|
import net.dv8tion.jda.api.interactions.InteractionType;
|
||||||
|
@ -22,8 +22,8 @@ package de.steamwar.bungeecore.bot.listeners;
|
|||||||
import de.steamwar.bungeecore.bot.SteamwarDiscordBot;
|
import de.steamwar.bungeecore.bot.SteamwarDiscordBot;
|
||||||
import de.steamwar.bungeecore.bot.config.SteamwarDiscordBotConfig;
|
import de.steamwar.bungeecore.bot.config.SteamwarDiscordBotConfig;
|
||||||
import de.steamwar.bungeecore.listeners.ChatListener;
|
import de.steamwar.bungeecore.listeners.ChatListener;
|
||||||
import de.steamwar.sql.Punishment;
|
import de.steamwar.bungeecore.sql.Punishment;
|
||||||
import de.steamwar.sql.SteamwarUser;
|
import de.steamwar.bungeecore.sql.SteamwarUser;
|
||||||
import de.steamwar.messages.ChatSender;
|
import de.steamwar.messages.ChatSender;
|
||||||
import net.dv8tion.jda.api.MessageBuilder;
|
import net.dv8tion.jda.api.MessageBuilder;
|
||||||
import net.dv8tion.jda.api.entities.Member;
|
import net.dv8tion.jda.api.entities.Member;
|
||||||
|
@ -21,10 +21,10 @@ package de.steamwar.bungeecore.bot.listeners;
|
|||||||
|
|
||||||
import de.steamwar.bungeecore.bot.config.SteamwarDiscordBotConfig;
|
import de.steamwar.bungeecore.bot.config.SteamwarDiscordBotConfig;
|
||||||
import de.steamwar.bungeecore.bot.events.EventManager;
|
import de.steamwar.bungeecore.bot.events.EventManager;
|
||||||
import de.steamwar.sql.SteamwarUser;
|
import de.steamwar.bungeecore.sql.Event;
|
||||||
import de.steamwar.sql.Team;
|
import de.steamwar.bungeecore.sql.SteamwarUser;
|
||||||
import de.steamwar.sql.TeamTeilnahme;
|
import de.steamwar.bungeecore.sql.Team;
|
||||||
import de.steamwar.sql.Event;
|
import de.steamwar.bungeecore.sql.TeamTeilnahme;
|
||||||
import net.dv8tion.jda.api.events.interaction.SelectionMenuEvent;
|
import net.dv8tion.jda.api.events.interaction.SelectionMenuEvent;
|
||||||
import net.dv8tion.jda.api.interactions.components.Component;
|
import net.dv8tion.jda.api.interactions.components.Component;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
@ -19,12 +19,11 @@
|
|||||||
|
|
||||||
package de.steamwar.bungeecore.bot.listeners;
|
package de.steamwar.bungeecore.bot.listeners;
|
||||||
|
|
||||||
import de.steamwar.bungeecore.VelocityCore;
|
import de.steamwar.bungeecore.BungeeCore;
|
||||||
import de.steamwar.bungeecore.Message;
|
import de.steamwar.bungeecore.Message;
|
||||||
import de.steamwar.bungeecore.bot.config.DiscordTicketType;
|
import de.steamwar.bungeecore.bot.config.DiscordTicketType;
|
||||||
import de.steamwar.bungeecore.bot.config.SteamwarDiscordBotConfig;
|
import de.steamwar.bungeecore.bot.config.SteamwarDiscordBotConfig;
|
||||||
import de.steamwar.sql.SteamwarUser;
|
import de.steamwar.bungeecore.sql.SteamwarUser;
|
||||||
import de.steamwar.sql.UserPerm;
|
|
||||||
import net.dv8tion.jda.api.EmbedBuilder;
|
import net.dv8tion.jda.api.EmbedBuilder;
|
||||||
import net.dv8tion.jda.api.MessageBuilder;
|
import net.dv8tion.jda.api.MessageBuilder;
|
||||||
import net.dv8tion.jda.api.Permission;
|
import net.dv8tion.jda.api.Permission;
|
||||||
@ -137,15 +136,15 @@ public class DiscordTicketListener extends BasicDiscordListener {
|
|||||||
public void onGuildMessageReceived(@NotNull GuildMessageReceivedEvent event) {
|
public void onGuildMessageReceived(@NotNull GuildMessageReceivedEvent event) {
|
||||||
if(event.getChannel().getParent() != null && event.getChannel().getParent().getId().equals(SteamwarDiscordBotConfig.TICKET_CATEGORY)) {
|
if(event.getChannel().getParent() != null && event.getChannel().getParent().getId().equals(SteamwarDiscordBotConfig.TICKET_CATEGORY)) {
|
||||||
if(!event.getChannel().getId().equals(SteamwarDiscordBotConfig.TICKET_CHANNEL) && !event.getChannel().getId().equals(SteamwarDiscordBotConfig.TICKET_LOG)) {
|
if(!event.getChannel().getId().equals(SteamwarDiscordBotConfig.TICKET_CHANNEL) && !event.getChannel().getId().equals(SteamwarDiscordBotConfig.TICKET_LOG)) {
|
||||||
VelocityCore.get().getProxy().getPlayers().forEach(player -> {
|
BungeeCore.get().getProxy().getPlayers().forEach(player -> {
|
||||||
if(event.getAuthor().isBot() || event.getAuthor().isSystem()) return;
|
if(event.getAuthor().isBot() || event.getAuthor().isSystem()) return;
|
||||||
SteamwarUser user = SteamwarUser.get(player.getUniqueId());
|
SteamwarUser user = SteamwarUser.get(player);
|
||||||
boolean sendMessage;
|
boolean sendMessage;
|
||||||
if(user.getDiscordId() == null) {
|
if(user.getDiscordId() == null) {
|
||||||
sendMessage = user.hasPerm(UserPerm.CHECK);
|
sendMessage = user.getUserGroup().isCheckSchematics();
|
||||||
} else {
|
} else {
|
||||||
if(event.getAuthor().getId().equals(user.getDiscordId())) return;
|
if(event.getAuthor().getId().equals(user.getDiscordId())) return;
|
||||||
sendMessage = user.getDiscordId().equals(event.getChannel().getTopic()) || user.hasPerm(UserPerm.CHECK);
|
sendMessage = user.getDiscordId().equals(event.getChannel().getTopic()) || user.getUserGroup().isCheckSchematics();
|
||||||
}
|
}
|
||||||
if(sendMessage) {
|
if(sendMessage) {
|
||||||
Message.sendPrefixless("DISCORD_TICKET_MESSAGE", player, "Zur nachricht", new ClickEvent(ClickEvent.Action.OPEN_URL, event.getMessage().getJumpUrl()), event.getChannel().getName(), event.getAuthor().getName(), event.getMessage().getContentRaw());
|
Message.sendPrefixless("DISCORD_TICKET_MESSAGE", player, "Zur nachricht", new ClickEvent(ClickEvent.Action.OPEN_URL, event.getMessage().getJumpUrl()), event.getChannel().getName(), event.getAuthor().getName(), event.getMessage().getContentRaw());
|
||||||
|
@ -18,16 +18,13 @@
|
|||||||
|
|
||||||
package de.steamwar.bungeecore.bot.listeners;
|
package de.steamwar.bungeecore.bot.listeners;
|
||||||
|
|
||||||
import de.steamwar.bungeecore.VelocityCore;
|
import de.steamwar.bungeecore.BungeeCore;
|
||||||
import de.steamwar.sql.NodeData;
|
import de.steamwar.bungeecore.sql.Punishment;
|
||||||
import de.steamwar.sql.Punishment;
|
import de.steamwar.bungeecore.sql.SchematicNode;
|
||||||
import de.steamwar.sql.SchematicNode;
|
import de.steamwar.bungeecore.sql.SteamwarUser;
|
||||||
import de.steamwar.sql.SteamwarUser;
|
|
||||||
import net.dv8tion.jda.api.entities.Message;
|
import net.dv8tion.jda.api.entities.Message;
|
||||||
import net.dv8tion.jda.api.events.message.priv.PrivateMessageReceivedEvent;
|
import net.dv8tion.jda.api.events.message.priv.PrivateMessageReceivedEvent;
|
||||||
|
|
||||||
import java.io.InputStream;
|
|
||||||
|
|
||||||
public class PrivateMessageListener extends BasicDiscordListener {
|
public class PrivateMessageListener extends BasicDiscordListener {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -60,19 +57,17 @@ public class PrivateMessageListener extends BasicDiscordListener {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
SchematicNode node = SchematicNode.getSchematicNode(user.getId(), name, (Integer) null);
|
SchematicNode node = SchematicNode.getSchematicNode(user.getId(), name, 0);
|
||||||
if(node == null) {
|
if(node == null) {
|
||||||
node = SchematicNode.createSchematic(user.getId(), name, null);
|
node = SchematicNode.createSchematic(user.getId(), name, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
InputStream in = attachment.retrieveInputStream().get();
|
node.saveFromStream(attachment.retrieveInputStream().get(), newFormat);
|
||||||
NodeData.get(node).saveFromStream(in, newFormat);
|
|
||||||
in.close();
|
|
||||||
event.getMessage().reply("`" + name + "` wurde erfolgreich hochgeladen").queue();
|
event.getMessage().reply("`" + name + "` wurde erfolgreich hochgeladen").queue();
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
event.getMessage().reply("`" + name + "` konnte nicht hochgeladen werden, bitte versuche es später nochmal oder wende dich an einen Developer").queue();
|
event.getMessage().reply("`" + name + "` konnte nicht hochgeladen werden, bitte versuche es später nochmal oder wende dich an einen Developer").queue();
|
||||||
VelocityCore.log("Could not Upload Schem \"" + name + "\" from User \"" + user.getUserName() + "\"", e);
|
BungeeCore.log("Could not Upload Schem \"" + name + "\" from User \"" + user.getUserName() + "\"" + e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -21,7 +21,7 @@ package de.steamwar.bungeecore.bot.util;
|
|||||||
|
|
||||||
import de.steamwar.bungeecore.bot.SteamwarDiscordBot;
|
import de.steamwar.bungeecore.bot.SteamwarDiscordBot;
|
||||||
import de.steamwar.bungeecore.bot.config.SteamwarDiscordBotConfig;
|
import de.steamwar.bungeecore.bot.config.SteamwarDiscordBotConfig;
|
||||||
import de.steamwar.sql.SteamwarUser;
|
import de.steamwar.bungeecore.sql.SteamwarUser;
|
||||||
import lombok.experimental.UtilityClass;
|
import lombok.experimental.UtilityClass;
|
||||||
import net.dv8tion.jda.api.entities.Guild;
|
import net.dv8tion.jda.api.entities.Guild;
|
||||||
import net.dv8tion.jda.api.entities.Role;
|
import net.dv8tion.jda.api.entities.Role;
|
||||||
@ -42,7 +42,7 @@ public class DiscordRanks {
|
|||||||
guild.retrieveMemberById(steamwarUser.getDiscordId()).queue(member -> {
|
guild.retrieveMemberById(steamwarUser.getDiscordId()).queue(member -> {
|
||||||
List<Role> roleList = member.getRoles();
|
List<Role> roleList = member.getRoles();
|
||||||
Set<String> strings = new HashSet<>(SteamwarDiscordBotConfig.RANKS.values());
|
Set<String> strings = new HashSet<>(SteamwarDiscordBotConfig.RANKS.values());
|
||||||
String needed = SteamwarDiscordBotConfig.RANKS.get(steamwarUser.prefix());
|
String needed = SteamwarDiscordBotConfig.RANKS.get(steamwarUser.getUserGroup());
|
||||||
for (Role role : roleList) {
|
for (Role role : roleList) {
|
||||||
if (!strings.contains(role.getId())) {
|
if (!strings.contains(role.getId())) {
|
||||||
continue;
|
continue;
|
||||||
|
@ -20,8 +20,8 @@
|
|||||||
package de.steamwar.bungeecore.bot.util;
|
package de.steamwar.bungeecore.bot.util;
|
||||||
|
|
||||||
import de.steamwar.bungeecore.bot.SteamwarDiscordBot;
|
import de.steamwar.bungeecore.bot.SteamwarDiscordBot;
|
||||||
import de.steamwar.sql.SchematicNode;
|
import de.steamwar.bungeecore.sql.SchematicNode;
|
||||||
import de.steamwar.sql.SteamwarUser;
|
import de.steamwar.bungeecore.sql.SteamwarUser;
|
||||||
import lombok.experimental.UtilityClass;
|
import lombok.experimental.UtilityClass;
|
||||||
import net.dv8tion.jda.api.EmbedBuilder;
|
import net.dv8tion.jda.api.EmbedBuilder;
|
||||||
import net.dv8tion.jda.api.MessageBuilder;
|
import net.dv8tion.jda.api.MessageBuilder;
|
||||||
|
@ -21,29 +21,49 @@ package de.steamwar.bungeecore.commands;
|
|||||||
|
|
||||||
import de.steamwar.bungeecore.Message;
|
import de.steamwar.bungeecore.Message;
|
||||||
import de.steamwar.bungeecore.bot.SteamwarDiscordBot;
|
import de.steamwar.bungeecore.bot.SteamwarDiscordBot;
|
||||||
import de.steamwar.bungeecore.listeners.ConnectionListener;
|
|
||||||
import de.steamwar.command.SWCommand;
|
|
||||||
import de.steamwar.messages.ChatSender;
|
|
||||||
import net.md_5.bungee.api.ChatColor;
|
import net.md_5.bungee.api.ChatColor;
|
||||||
import net.md_5.bungee.api.CommandSender;
|
import net.md_5.bungee.api.CommandSender;
|
||||||
|
|
||||||
public class AlertCommand extends SWCommand {
|
public class AlertCommand extends BasicCommand {
|
||||||
|
|
||||||
public AlertCommand() {
|
public AlertCommand() {
|
||||||
super("alert", ConnectionListener.ALERT_PERMISSION, "broadcast", "bbc");
|
super("alert", "bungeecore.alert", "broadcast", "bbc");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register(description = "USAGE_ALERT")
|
@Override
|
||||||
public void broadcast(CommandSender sender, @OptionalValue("") @StaticValue("-discord") String sendToDiscord, String... message) {
|
public void execute(CommandSender sender, String[] args) {
|
||||||
if (message.length == 0) {
|
if(args.length == 0){
|
||||||
ChatSender.of(sender).system(new Message("USAGE_ALERT"));
|
Message.send("USAGE_ALERT", sender);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
String s = String.join(" ", message);
|
String s;
|
||||||
|
boolean discordAnnounce = false;
|
||||||
|
if (args[0].equals("-discord")) {
|
||||||
|
if (args.length == 1) {
|
||||||
|
Message.send("USAGE_ALERT", sender);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
discordAnnounce = true;
|
||||||
|
s = join(1, args);
|
||||||
|
} else {
|
||||||
|
s = join(0, args);
|
||||||
|
}
|
||||||
|
|
||||||
Message.broadcast("ALERT", ChatColor.translateAlternateColorCodes('&', s));
|
Message.broadcast("ALERT", ChatColor.translateAlternateColorCodes('&', s));
|
||||||
if ("-discord".equals(sendToDiscord) && SteamwarDiscordBot.instance() != null) {
|
if (discordAnnounce && SteamwarDiscordBot.instance() != null) {
|
||||||
SteamwarDiscordBot.instance().getAnnouncementListener().announce(s);
|
SteamwarDiscordBot.instance().getAnnouncementListener().announce(s);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private String join(int startIndex, String... strings) {
|
||||||
|
StringBuilder st = new StringBuilder();
|
||||||
|
for (int i = startIndex; i < strings.length; i++) {
|
||||||
|
if (i != startIndex) {
|
||||||
|
st.append(" ");
|
||||||
|
}
|
||||||
|
st.append(strings[i]);
|
||||||
|
}
|
||||||
|
return st.toString();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,53 +19,33 @@
|
|||||||
|
|
||||||
package de.steamwar.bungeecore.commands;
|
package de.steamwar.bungeecore.commands;
|
||||||
|
|
||||||
|
import de.steamwar.bungeecore.Message;
|
||||||
import de.steamwar.bungeecore.Servertype;
|
import de.steamwar.bungeecore.Servertype;
|
||||||
import de.steamwar.bungeecore.Subserver;
|
import de.steamwar.bungeecore.Subserver;
|
||||||
import de.steamwar.command.SWCommand;
|
|
||||||
import de.steamwar.command.TypeMapper;
|
|
||||||
import net.md_5.bungee.api.CommandSender;
|
import net.md_5.bungee.api.CommandSender;
|
||||||
import net.md_5.bungee.api.ProxyServer;
|
import net.md_5.bungee.api.ProxyServer;
|
||||||
|
import net.md_5.bungee.api.config.ServerInfo;
|
||||||
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
||||||
|
|
||||||
import java.util.Collection;
|
public class ArenaCommand extends BasicCommand {
|
||||||
import java.util.List;
|
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
public class ArenaCommand extends SWCommand {
|
|
||||||
|
|
||||||
public ArenaCommand() {
|
public ArenaCommand() {
|
||||||
super("arena");
|
super("arena", null);
|
||||||
}
|
|
||||||
|
|
||||||
@Register
|
|
||||||
public void arenaJoin(ProxiedPlayer player, Subserver server) {
|
|
||||||
TpCommand.teleport(player, server.getServer());
|
|
||||||
}
|
|
||||||
|
|
||||||
@ClassMapper(value = Subserver.class, local = true)
|
|
||||||
public TypeMapper<Subserver> serverInfoTypeMapper() {
|
|
||||||
return new TypeMapper<Subserver>() {
|
|
||||||
@Override
|
|
||||||
public Subserver map(CommandSender commandSender, String[] previousArguments, String s) {
|
|
||||||
return Subserver.getSubserver(ProxyServer.getInstance().getServerInfo(s));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean validate(CommandSender sender, Subserver value, MessageSender messageSender) {
|
public void execute(CommandSender sender, String[] args) {
|
||||||
if (value == null || value.getType() != Servertype.ARENA) {
|
if(!(sender instanceof ProxiedPlayer))
|
||||||
messageSender.send("ARENA_NOT_FOUND");
|
return;
|
||||||
return false;
|
ProxiedPlayer player = (ProxiedPlayer) sender;
|
||||||
}
|
|
||||||
return true;
|
ServerInfo server = ProxyServer.getInstance().getServerInfo(String.join(" ", args));
|
||||||
|
Subserver subserver = Subserver.getSubserver(server);
|
||||||
|
if(server == null || subserver == null || subserver.getType() != Servertype.ARENA) {
|
||||||
|
Message.send("ARENA_NOT_FOUND", player);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
TpCommand.teleport(player, server);
|
||||||
public Collection<String> tabCompletes(CommandSender sender, String[] previousArguments, String s) {
|
|
||||||
List<Subserver> subserverList = Subserver.getServerList();
|
|
||||||
synchronized (subserverList) {
|
|
||||||
return subserverList.stream().filter(subserver -> subserver.getType() == Servertype.ARENA).map(subserver -> subserver.getServer().getName()).collect(Collectors.toList());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
69
src/de/steamwar/bungeecore/commands/BasicCommand.java
Normale Datei
69
src/de/steamwar/bungeecore/commands/BasicCommand.java
Normale Datei
@ -0,0 +1,69 @@
|
|||||||
|
/*
|
||||||
|
This file is a part of the SteamWar software.
|
||||||
|
|
||||||
|
Copyright (C) 2020 SteamWar.de-Serverteam
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Affero General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Affero General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Affero General Public License
|
||||||
|
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.steamwar.bungeecore.commands;
|
||||||
|
|
||||||
|
import de.steamwar.bungeecore.BungeeCore;
|
||||||
|
import de.steamwar.bungeecore.Message;
|
||||||
|
import de.steamwar.bungeecore.sql.SteamwarUser;
|
||||||
|
import net.md_5.bungee.api.CommandSender;
|
||||||
|
import net.md_5.bungee.api.ProxyServer;
|
||||||
|
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
||||||
|
import net.md_5.bungee.api.plugin.Command;
|
||||||
|
import net.md_5.bungee.api.plugin.TabExecutor;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
abstract class BasicCommand extends Command implements TabExecutor {
|
||||||
|
|
||||||
|
public BasicCommand(String name, String permission, String... aliases) {
|
||||||
|
super(name, permission, aliases);
|
||||||
|
BungeeCore.commands.put("/" + name, permission);
|
||||||
|
ProxyServer.getInstance().getPluginManager().registerCommand(BungeeCore.get(), this);
|
||||||
|
}
|
||||||
|
|
||||||
|
Iterable<String> allPlayers(String begin) {
|
||||||
|
List<String> suggestions = new ArrayList<>();
|
||||||
|
for(ProxiedPlayer player : ProxyServer.getInstance().getPlayers()){
|
||||||
|
String playerName = player.getName();
|
||||||
|
if(playerName.startsWith(begin))
|
||||||
|
suggestions.add(playerName);
|
||||||
|
}
|
||||||
|
return suggestions;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Iterable<String> onTabComplete(CommandSender commandSender, String[] args) {
|
||||||
|
return new ArrayList<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected SteamwarUser existingUser(CommandSender sender, String arg){
|
||||||
|
SteamwarUser target = SteamwarUser.get(arg);
|
||||||
|
if(target == null)
|
||||||
|
Message.send("UNKNOWN_PLAYER", sender);
|
||||||
|
return target;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected SteamwarUser unsafeUser(CommandSender sender, String arg){
|
||||||
|
SteamwarUser target = SteamwarUser.getOrCreateOfflinePlayer(arg);
|
||||||
|
if(target == null)
|
||||||
|
Message.send("UNKNOWN_PLAYER", sender);
|
||||||
|
return target;
|
||||||
|
}
|
||||||
|
}
|
@ -20,260 +20,221 @@
|
|||||||
package de.steamwar.bungeecore.commands;
|
package de.steamwar.bungeecore.commands;
|
||||||
|
|
||||||
import de.steamwar.bungeecore.*;
|
import de.steamwar.bungeecore.*;
|
||||||
|
import de.steamwar.bungeecore.comms.packets.BaumemberUpdatePacket;
|
||||||
import de.steamwar.bungeecore.inventory.SWInventory;
|
import de.steamwar.bungeecore.inventory.SWInventory;
|
||||||
import de.steamwar.bungeecore.inventory.SWItem;
|
import de.steamwar.bungeecore.inventory.SWItem;
|
||||||
import de.steamwar.bungeecore.network.NetworkSender;
|
import de.steamwar.bungeecore.sql.BauweltMember;
|
||||||
import de.steamwar.bungeecore.util.BauLock;
|
import de.steamwar.bungeecore.sql.SteamwarUser;
|
||||||
import de.steamwar.bungeecore.util.BauLockState;
|
import de.steamwar.messages.ChatSender;
|
||||||
import de.steamwar.bungeecore.util.Chat19;
|
|
||||||
import de.steamwar.command.PreviousArguments;
|
|
||||||
import de.steamwar.command.SWCommand;
|
|
||||||
import de.steamwar.command.TypeMapper;
|
|
||||||
import de.steamwar.command.TypeValidator;
|
|
||||||
import de.steamwar.network.packets.server.BaumemberUpdatePacket;
|
|
||||||
import de.steamwar.sql.BauweltMember;
|
|
||||||
import de.steamwar.sql.SteamwarUser;
|
|
||||||
import net.md_5.bungee.api.CommandSender;
|
import net.md_5.bungee.api.CommandSender;
|
||||||
import net.md_5.bungee.api.ProxyServer;
|
import net.md_5.bungee.api.ProxyServer;
|
||||||
import net.md_5.bungee.api.config.ServerInfo;
|
import net.md_5.bungee.api.config.ServerInfo;
|
||||||
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
||||||
|
|
||||||
import java.util.Collection;
|
public class BauCommand extends BasicCommand {
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
public class BauCommand extends SWCommand {
|
public BauCommand(){
|
||||||
|
|
||||||
private final HelpCommand command;
|
|
||||||
|
|
||||||
public BauCommand(HelpCommand command){
|
|
||||||
super("bau", null, "b", "build", "gs");
|
super("bau", null, "b", "build", "gs");
|
||||||
this.command = command;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Register(noTabComplete = true)
|
|
||||||
public void genericHelp(ProxiedPlayer p, String... args) {
|
|
||||||
this.command.sendBauHelp(p);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Register
|
|
||||||
public void toBau(ProxiedPlayer p, @Mapper("version") @OptionalValue(value = "", onlyUINIG = true) ServerStarter.Version version) {
|
|
||||||
new ServerStarter().build(version, p.getUniqueId()).send(p).start();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Mapper(value = "version", local = true)
|
|
||||||
public TypeMapper<ServerStarter.Version> versionMapper() {
|
|
||||||
Map<String, ServerStarter.Version> versionMap = new HashMap<>();
|
|
||||||
versionMap.put("20", ServerStarter.Version.PAPER_20);
|
|
||||||
versionMap.put("1.20", ServerStarter.Version.PAPER_20);
|
|
||||||
versionMap.put("as", ServerStarter.Version.PAPER_20);
|
|
||||||
versionMap.put("airship", ServerStarter.Version.PAPER_20);
|
|
||||||
versionMap.put("wg", ServerStarter.Version.PAPER_20);
|
|
||||||
versionMap.put("wargear", ServerStarter.Version.PAPER_20);
|
|
||||||
versionMap.put("ws", ServerStarter.Version.PAPER_20);
|
|
||||||
versionMap.put("warship", ServerStarter.Version.PAPER_20);
|
|
||||||
|
|
||||||
versionMap.put("19", ServerStarter.Version.PAPER_19);
|
|
||||||
versionMap.put("1.19", ServerStarter.Version.PAPER_19);
|
|
||||||
versionMap.put("mwg", ServerStarter.Version.PAPER_19);
|
|
||||||
versionMap.put("miniwargear", ServerStarter.Version.PAPER_19);
|
|
||||||
|
|
||||||
versionMap.put("15", ServerStarter.Version.SPIGOT_15);
|
|
||||||
versionMap.put("1.15", ServerStarter.Version.SPIGOT_15);
|
|
||||||
|
|
||||||
versionMap.put("12", ServerStarter.Version.SPIGOT_12);
|
|
||||||
versionMap.put("1.12", ServerStarter.Version.SPIGOT_12);
|
|
||||||
|
|
||||||
return new TypeMapper<ServerStarter.Version>() {
|
|
||||||
@Override
|
|
||||||
public ServerStarter.Version map(CommandSender commandSender, String[] previousArguments, String s) {
|
|
||||||
if (commandSender == null) return null;
|
|
||||||
ProxiedPlayer player = (ProxiedPlayer) commandSender;
|
|
||||||
if (s.isEmpty()) {
|
|
||||||
int version = player.getPendingConnection().getVersion();
|
|
||||||
if (version > 762) { // Version > 1.19.4
|
|
||||||
return ServerStarter.Version.PAPER_20;
|
|
||||||
} else if (version > 578) { // Version > 1.15.2
|
|
||||||
return ServerStarter.Version.PAPER_19;
|
|
||||||
} else if (version > 340) { // Version > 1.12.2
|
|
||||||
return ServerStarter.Version.SPIGOT_15;
|
|
||||||
} else {
|
|
||||||
return ServerStarter.Version.SPIGOT_12;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return versionMap.get(s.toLowerCase());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Collection<String> tabCompletes(CommandSender sender, String[] previousArguments, String s) {
|
public void execute(CommandSender sender, String[] args) {
|
||||||
return versionMap.keySet();
|
if(!(sender instanceof ProxiedPlayer)) {
|
||||||
}
|
return;
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register(value = "addmember", description = "BAU_ADDMEMBER_USAGE")
|
ProxiedPlayer p = (ProxiedPlayer) sender;
|
||||||
public void addmember(ProxiedPlayer p, @Validator("addMemberTarget") SteamwarUser target) {
|
|
||||||
BauweltMember.addMember(p.getUniqueId(), target.getUUID());
|
versionSelector(p, args, 0,
|
||||||
|
() -> new ServerStarter().build18(p.getUniqueId()).send(p).start(),
|
||||||
|
() -> new ServerStarter().build15(p.getUniqueId()).send(p).start(),
|
||||||
|
() -> new ServerStarter().build12(p.getUniqueId()).send(p).start(),
|
||||||
|
() -> {
|
||||||
|
switch (args[0].toLowerCase()) {
|
||||||
|
case "addmember":
|
||||||
|
addmember(p, args);
|
||||||
|
break;
|
||||||
|
case "tp":
|
||||||
|
case "teleport":
|
||||||
|
teleport(p, args);
|
||||||
|
break;
|
||||||
|
case "info":
|
||||||
|
p.chat("/bauinfo");
|
||||||
|
break;
|
||||||
|
case "togglewe":
|
||||||
|
togglewe(p, args);
|
||||||
|
break;
|
||||||
|
case "toggleworld":
|
||||||
|
toggleworld(p, args);
|
||||||
|
break;
|
||||||
|
case "delmember":
|
||||||
|
delmember(p, args);
|
||||||
|
break;
|
||||||
|
case "resetall":
|
||||||
|
case "delete":
|
||||||
|
delete(p, args);
|
||||||
|
break;
|
||||||
|
case "testarena":
|
||||||
|
case "test":
|
||||||
|
testarena(p, args);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
HelpCommand.sendBauHelp(ChatSender.of(p));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void addmember(ProxiedPlayer p, String[] args){
|
||||||
|
if (args.length == 1) {
|
||||||
|
Message.send("BAU_ADDMEMBER_USAGE", p);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
SteamwarUser target = SteamwarUser.get(args[1]);
|
||||||
|
if (target == null) {
|
||||||
|
Message.send("UNKNOWN_PLAYER", p);
|
||||||
|
return;
|
||||||
|
}else if(target.getUuid().equals(p.getUniqueId())) {
|
||||||
|
Message.send("BAU_ADDMEMBER_SELFADD", p);
|
||||||
|
return;
|
||||||
|
}else if (BauweltMember.getBauMember(p.getUniqueId(), target.getUuid()) != null) {
|
||||||
|
Message.send("BAU_ADDMEMBER_ISADDED", p);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
new BauweltMember(p.getUniqueId(), target.getUuid(), false, false);
|
||||||
Message.send("BAU_ADDMEMBER_ADDED", p);
|
Message.send("BAU_ADDMEMBER_ADDED", p);
|
||||||
|
|
||||||
ProxiedPlayer z = ProxyServer.getInstance().getPlayer(target.getUUID());
|
ProxiedPlayer z = ProxyServer.getInstance().getPlayer(target.getUuid());
|
||||||
if(z != null)
|
if(z != null)
|
||||||
Message.send("BAU_ADDMEMBER_ADDED_TARGET", z, p.getName());
|
Message.send("BAU_ADDMEMBER_ADDED_TARGET", z, p.getName());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Validator(value = "addMemberTarget", local = true)
|
private static void teleport(ProxiedPlayer p, String[] args){
|
||||||
public TypeValidator<SteamwarUser> addMemberTargetValidator() {
|
if (args.length == 1) {
|
||||||
return (sender, value, messageSender) -> {
|
Message.send("BAU_TP_USAGE", p);
|
||||||
if (value == null) {
|
|
||||||
messageSender.send("UNKNOWN_PLAYER");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (((ProxiedPlayer) sender).getUniqueId().equals(value.getUUID())) {
|
|
||||||
messageSender.send("BAU_ADDMEMBER_SELFADD");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (BauweltMember.getBauMember(((ProxiedPlayer) sender).getUniqueId(), value.getUUID()) != null) {
|
|
||||||
messageSender.send("BAU_ADDMEMBER_ISADDED");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
@Register(value = "tp", description = "BAU_TP_USAGE")
|
|
||||||
@Register("teleport")
|
|
||||||
public void teleport(ProxiedPlayer p, @Validator("teleportTarget") SteamwarUser worldOwner, @Mapper("version") @OptionalValue(value = "", onlyUINIG = true) ServerStarter.Version version) {
|
|
||||||
new ServerStarter().build(version, worldOwner.getUUID()).send(p).start();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Validator(value = "teleportTarget", local = true)
|
|
||||||
public TypeValidator<SteamwarUser> teleportTargetValidator() {
|
|
||||||
return (sender, value, messageSender) -> {
|
|
||||||
if (value == null) {
|
|
||||||
messageSender.send("UNKNOWN_PLAYER");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
ProxiedPlayer p = (ProxiedPlayer) sender;
|
|
||||||
if (!p.getUniqueId().equals(value.getUUID()) && BauweltMember.getBauMember(value.getUUID(), p.getUniqueId()) == null) {
|
|
||||||
SubserverSystem.sendDeniedMessage(p, value.getUUID());
|
|
||||||
messageSender.send("BAU_TP_NOALLOWED");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return !BauLock.checkNotifyLocked(value, p);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
@Register("info")
|
|
||||||
public void info(ProxiedPlayer p) {
|
|
||||||
Chat19.chat(p, "/bauinfo");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Register("setspectator")
|
|
||||||
public void setSpectator(ProxiedPlayer p, @Mapper("addedUsers") @AllowNull @OptionalValue("") SteamwarUser user) {
|
|
||||||
if (user == null) {
|
|
||||||
Message.send("BAU_MEMBER_SET_USAGE", p, "setspectator");
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
BauweltMember target = member(p, user);
|
|
||||||
if (target == null)
|
SteamwarUser worldOwner = SteamwarUser.get(args[1]);
|
||||||
|
if (worldOwner == null) {
|
||||||
|
Message.send("UNKNOWN_PLAYER", p);
|
||||||
|
return;
|
||||||
|
}else if (!p.getUniqueId().equals(worldOwner.getUuid()) && BauweltMember.getBauMember(worldOwner.getUuid(), p.getUniqueId()) == null){
|
||||||
|
SubserverSystem.sendDeniedMessage(p, worldOwner.getUuid());
|
||||||
|
Message.send("BAU_TP_NOALLOWED", p);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
versionSelector(p, args, 2,
|
||||||
|
() -> new ServerStarter().build18(worldOwner.getUuid()).send(p).start(),
|
||||||
|
() -> new ServerStarter().build15(worldOwner.getUuid()).send(p).start(),
|
||||||
|
() -> new ServerStarter().build12(worldOwner.getUuid()).send(p).start(),
|
||||||
|
() -> HelpCommand.sendBauHelp(ChatSender.of(p)));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void versionSelector(ProxiedPlayer p, String[] args, int pos, Runnable run18, Runnable run15, Runnable run12, Runnable runElse) {
|
||||||
|
if(args.length <= pos) {
|
||||||
|
int version = p.getPendingConnection().getVersion();
|
||||||
|
if(version > 340) { // Version > 1.12.2
|
||||||
|
run15.run();
|
||||||
|
} else {
|
||||||
|
run12.run();
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (args[pos].toLowerCase()) {
|
||||||
|
case "18":
|
||||||
|
case "1.18":
|
||||||
|
run18.run();
|
||||||
|
break;
|
||||||
|
case "ws":
|
||||||
|
case "warship":
|
||||||
|
case "as":
|
||||||
|
case "airship":
|
||||||
|
case "mwg":
|
||||||
|
case "miniwargear":
|
||||||
|
case "wg":
|
||||||
|
case "wargear":
|
||||||
|
case "15":
|
||||||
|
case "1.15":
|
||||||
|
run15.run();
|
||||||
|
break;
|
||||||
|
case "12":
|
||||||
|
case "1.12":
|
||||||
|
run12.run();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
runElse.run();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void togglewe(ProxiedPlayer p, String[] args){
|
||||||
|
BauweltMember target = toggle(p, args, "togglewe");
|
||||||
|
if(target == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
target.setBuild(false);
|
target.setWorldEdit(!target.isWorldEdit());
|
||||||
target.setSupervisor(false);
|
|
||||||
clearMembercache(p);
|
clearMembercache(p);
|
||||||
sendPermissionUpdate(p, target, "BAU_MEMBER_SET_SPECTATOR");
|
isAllowedTo(target.isWorldEdit(), p, target, "BAU_MEMBER_TOGGLE_WORLD_EDIT");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register("setbuild")
|
private static void toggleworld(ProxiedPlayer p, String[] args){
|
||||||
public void setBuild(ProxiedPlayer p, @Mapper("addedUsers") @AllowNull @OptionalValue("") SteamwarUser user) {
|
BauweltMember target = toggle(p, args, "toggleworld");
|
||||||
if (user == null) {
|
if(target == null)
|
||||||
Message.send("BAU_MEMBER_SET_USAGE", p, "setbuild");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
BauweltMember target = member(p, user);
|
|
||||||
if (target == null)
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
target.setBuild(true);
|
target.setWorld(!target.isWorld());
|
||||||
target.setSupervisor(false);
|
|
||||||
clearMembercache(p);
|
clearMembercache(p);
|
||||||
sendPermissionUpdate(p, target, "BAU_MEMBER_SET_BUILDER");
|
isAllowedTo(target.isWorld(), p, target, "BAU_MEMBER_TOGGLE_WORLD");
|
||||||
}
|
|
||||||
|
|
||||||
@Register("setsupervisor")
|
|
||||||
public void setSupervisor(ProxiedPlayer p, @Mapper("addedUsers") @AllowNull @OptionalValue("") SteamwarUser user) {
|
|
||||||
if (user == null) {
|
|
||||||
Message.send("BAU_MEMBER_SET_USAGE", p, "setsupervisor");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
BauweltMember target = member(p, user);
|
|
||||||
if (target == null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
target.setBuild(true);
|
|
||||||
target.setSupervisor(true);
|
|
||||||
clearMembercache(p);
|
|
||||||
sendPermissionUpdate(p, target, "BAU_MEMBER_SET_SUPERVISOR");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void clearMembercache(ProxiedPlayer p){
|
private static void clearMembercache(ProxiedPlayer p){
|
||||||
for(ServerInfo info : ProxyServer.getInstance().getServers().values()){
|
for(ServerInfo info : ProxyServer.getInstance().getServers().values()){
|
||||||
Subserver server = Subserver.getSubserver(info);
|
Subserver server = Subserver.getSubserver(info);
|
||||||
if(server != null && server.getType() == Servertype.BAUSERVER && ((Bauserver)server).getOwner().equals(p.getUniqueId())){
|
if(server != null && server.getType() == Servertype.BAUSERVER && ((Bauserver)server).getOwner().equals(p.getUniqueId())){
|
||||||
info.getPlayers().stream().findAny().ifPresent(player -> NetworkSender.send(player, new BaumemberUpdatePacket()));
|
info.getPlayers().stream().findAny().ifPresent(player -> new BaumemberUpdatePacket().send(player));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register(value = "delmember", description = "BAU_DELMEMBER_USAGE")
|
private static void delmember(ProxiedPlayer p, String[] args){
|
||||||
public void delmember(ProxiedPlayer p, @Mapper("addedUsers") SteamwarUser user) {
|
if (args.length == 1) {
|
||||||
BauweltMember target = member(p, user);
|
Message.send("BAU_DELMEMBER_USAGE", p);
|
||||||
if (target == null)
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
BauweltMember target = member(p, SteamwarUser.get(args[1]));
|
||||||
|
if(target == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if(SteamwarUser.get(target.getMemberID()).getUUID().equals(p.getUniqueId())) {
|
if(SteamwarUser.get(target.getMemberID()).getUuid().equals(p.getUniqueId())) {
|
||||||
Message.send("BAU_DELMEMBER_SELFDEL", p);
|
Message.send("BAU_DELMEMBER_SELFDEL", p);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
target.remove();
|
target.remove();
|
||||||
ProxiedPlayer toRemove = ProxyServer.getInstance().getPlayer(SteamwarUser.get(target.getMemberID()).getUUID());
|
ProxiedPlayer toRemove = ProxyServer.getInstance().getPlayer(SteamwarUser.get(target.getMemberID()).getUuid());
|
||||||
if(toRemove != null){
|
if(toRemove != null){
|
||||||
Message.send("BAU_DELMEMBER_DELETED_TARGET", toRemove, p.getName());
|
Message.send("BAU_DELMEMBER_DELETED_TARGET", toRemove, p.getName());
|
||||||
Subserver currentServer = Subserver.getSubserver(toRemove.getServer().getInfo());
|
Subserver currentServer = Subserver.getSubserver(toRemove.getServer().getInfo());
|
||||||
if (currentServer != null && currentServer.getType() == Servertype.BAUSERVER && ((Bauserver) currentServer).getOwner().equals(p.getUniqueId())) {
|
if (currentServer != null && currentServer.getType() == Servertype.BAUSERVER && ((Bauserver) currentServer).getOwner().equals(p.getUniqueId())) {
|
||||||
toRemove.connect(ProxyServer.getInstance().getServerInfo(VelocityCore.LOBBY_SERVER));
|
toRemove.connect(ProxyServer.getInstance().getServerInfo(BungeeCore.LOBBY_SERVER));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Message.send("BAU_DELMEMBER_DELETED", p);
|
Message.send("BAU_DELMEMBER_DELETED", p);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Mapper(value = "addedUsers", local = true)
|
private static void delete(ProxiedPlayer p, String[] args){
|
||||||
public TypeMapper<SteamwarUser> addedUsers() {
|
SteamwarUser user = SteamwarUser.get(p.getUniqueId());
|
||||||
return new TypeMapper<SteamwarUser>() {
|
versionSelector(p, args, 1,
|
||||||
@Override
|
() -> deleteConfirmation(p, () -> deleteWorld(p, ServerStarter.WORLDS18_PATH + user.getId())),
|
||||||
public SteamwarUser map(CommandSender commandSender, String[] previousArguments, String s) {
|
() -> deleteConfirmation(p, () -> deleteWorld(p, BungeeCore.USERWORLDS15 + user.getId())),
|
||||||
return SteamwarUser.get(s);
|
() -> deleteConfirmation(p, () -> deleteWorld(p, BungeeCore.WORLD_FOLDER + p.getUniqueId().toString())),
|
||||||
}
|
() -> HelpCommand.sendBauHelp(ChatSender.of(p)));
|
||||||
|
|
||||||
@Override
|
|
||||||
public Collection<String> tabCompletes(CommandSender sender, PreviousArguments previousArguments, String s) {
|
|
||||||
if (!(sender instanceof ProxiedPlayer)) return Collections.emptyList();
|
|
||||||
return BauweltMember.getMembers(((ProxiedPlayer) sender).getUniqueId()).stream()
|
|
||||||
.map(bauweltMember -> SteamwarUser.get(bauweltMember.getMemberID()))
|
|
||||||
.map(steamwarUser -> steamwarUser.getUserName())
|
|
||||||
.collect(Collectors.toList());
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
@Register("resetall")
|
|
||||||
@Register("delete")
|
|
||||||
public void delete(ProxiedPlayer p, @Mapper("version") @OptionalValue(value = "", onlyUINIG = true) ServerStarter.Version version) {
|
|
||||||
deleteConfirmation(p, () -> deleteWorld(p, version.getWorldFolder(ServerStarter.WORLDS_BASE_PATH) + (version != ServerStarter.Version.SPIGOT_12 ? SteamwarUser.get(p.getUniqueId()).getId() : p.getUniqueId().toString())));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void deleteConfirmation(ProxiedPlayer p, Runnable worldDeletion) {
|
private static void deleteConfirmation(ProxiedPlayer p, Runnable worldDeletion) {
|
||||||
@ -281,40 +242,27 @@ public class BauCommand extends SWCommand {
|
|||||||
inventory.addItem(8, new SWItem(Message.parse("BAU_DELETE_GUI_CANCEL", p), 1), click ->
|
inventory.addItem(8, new SWItem(Message.parse("BAU_DELETE_GUI_CANCEL", p), 1), click ->
|
||||||
inventory.close()
|
inventory.close()
|
||||||
);
|
);
|
||||||
inventory.addItem(0, new SWItem(Message.parse("BAU_DELETE_GUI_DELETE", p), 10), click -> {
|
inventory.addItem(0, new SWItem(Message.parse("BAU_DELETE_GUI_DELETE", p), 10), click ->
|
||||||
worldDeletion.run();
|
worldDeletion.run()
|
||||||
inventory.close();
|
);
|
||||||
});
|
|
||||||
inventory.open();
|
inventory.open();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void deleteWorld(ProxiedPlayer player, String world) {
|
private static void deleteWorld(ProxiedPlayer player, String world) {
|
||||||
ProxyServer.getInstance().getScheduler().runAsync(VelocityCore.get(), () -> {
|
ProxyServer.getInstance().getScheduler().runAsync(BungeeCore.get(), () -> {
|
||||||
Bauserver subserver = Bauserver.get(player.getUniqueId());
|
for (Subserver subserver : Subserver.getServerList()) {
|
||||||
if(subserver != null)
|
if (subserver.getType() == Servertype.BAUSERVER && ((Bauserver) subserver).getOwner().equals(player.getUniqueId())) {
|
||||||
subserver.stop();
|
subserver.stop();
|
||||||
|
break;
|
||||||
SubserverSystem.deleteFolder(VelocityCore.local, world);
|
}
|
||||||
|
}
|
||||||
|
SubserverSystem.deleteFolder(Node.local, world);
|
||||||
Message.send("BAU_DELETE_DELETED", player);
|
Message.send("BAU_DELETE_DELETED", player);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register("test")
|
private static void testarena(ProxiedPlayer p, String[] args){
|
||||||
@Register("testarena")
|
FightCommand.createArena(p, "/bau testarena ", false, args, 1, false, (player, mode, map) -> ProxyServer.getInstance().getScheduler().runAsync(BungeeCore.get(), () -> new ServerStarter().test(mode, map, p).start()));
|
||||||
public void testarena(ProxiedPlayer p, @Mapper("nonHistoricArenaMode") @OptionalValue("") @AllowNull ArenaMode arenaMode, @Mapper("arenaMap") @OptionalValue("") @AllowNull String map) {
|
|
||||||
FightCommand.createArena(p, "/bau testarena ", false, arenaMode, map, false, (player, mode, m) -> {
|
|
||||||
ProxyServer.getInstance().getScheduler().runAsync(VelocityCore.get(), () -> new ServerStarter().test(mode, m, p).start());
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
@Register(value = "lock", description = "BAU_LOCKED_OPTIONS")
|
|
||||||
public void lock(ProxiedPlayer p, BauLockState bauLockState) {
|
|
||||||
BauLock.setLocked(p, bauLockState);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Register("unlock")
|
|
||||||
public void unlock(ProxiedPlayer p) {
|
|
||||||
BauLock.setLocked(p, BauLockState.OPEN);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static BauweltMember member(ProxiedPlayer p, SteamwarUser member){
|
private static BauweltMember member(ProxiedPlayer p, SteamwarUser member){
|
||||||
@ -323,7 +271,7 @@ public class BauCommand extends SWCommand {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
BauweltMember target = BauweltMember.getBauMember(p.getUniqueId(), member.getUUID());
|
BauweltMember target = BauweltMember.getBauMember(p.getUniqueId(), member.getUuid());
|
||||||
if (target == null) {
|
if (target == null) {
|
||||||
Message.send("BAU_MEMBER_NOMEMBER", p);
|
Message.send("BAU_MEMBER_NOMEMBER", p);
|
||||||
return null;
|
return null;
|
||||||
@ -331,10 +279,27 @@ public class BauCommand extends SWCommand {
|
|||||||
return target;
|
return target;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void sendPermissionUpdate(ProxiedPlayer p, BauweltMember target, String what){
|
private static BauweltMember toggle(ProxiedPlayer p, String[] args, String subcommand){
|
||||||
ProxiedPlayer player = ProxyServer.getInstance().getPlayer(SteamwarUser.get(target.getMemberID()).getUUID());
|
if (args.length == 1) {
|
||||||
|
Message.send("BAU_MEMBER_TOGGLE_USAGE", p, subcommand);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
SteamwarUser member = SteamwarUser.get(args[1]);
|
||||||
|
return member(p, member);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void isAllowedTo(boolean permission, ProxiedPlayer p, BauweltMember target, String what){
|
||||||
|
ProxiedPlayer player = ProxyServer.getInstance().getPlayer(SteamwarUser.get(target.getMemberID()).getUuid());
|
||||||
|
|
||||||
|
if(permission){
|
||||||
if(player != null)
|
if(player != null)
|
||||||
Message.send("BAU_MEMBER_SET_TARGET", player, p.getName(), Message.parse(what, player));
|
Message.send("BAU_MEMBER_TOGGLE_TARGET", player, p.getName(), Message.parse(what, player));
|
||||||
Message.send("BAU_MEMBER_SET", p, Message.parse(what, p));
|
Message.send("BAU_MEMBER_TOGGLE", p, Message.parse(what, p));
|
||||||
|
}else{
|
||||||
|
if(player != null)
|
||||||
|
Message.send("BAU_MEMBER_TOGGLE_TARGET_OFF", player, p.getName(), Message.parse(what, player));
|
||||||
|
Message.send("BAU_MEMBER_TOGGLE_OFF", p, Message.parse(what, p));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,22 +19,27 @@
|
|||||||
|
|
||||||
package de.steamwar.bungeecore.commands;
|
package de.steamwar.bungeecore.commands;
|
||||||
|
|
||||||
import de.steamwar.sql.SWException;
|
import de.steamwar.bungeecore.Message;
|
||||||
import de.steamwar.sql.SteamwarUser;
|
import de.steamwar.bungeecore.sql.SWException;
|
||||||
import de.steamwar.command.SWCommand;
|
import de.steamwar.bungeecore.sql.SteamwarUser;
|
||||||
import de.steamwar.messages.ChatSender;
|
import net.md_5.bungee.api.CommandSender;
|
||||||
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
||||||
|
|
||||||
public class BugCommand extends SWCommand {
|
public class BugCommand extends BasicCommand {
|
||||||
public BugCommand() {
|
public BugCommand() {
|
||||||
super("bug", null);
|
super("bug", null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register
|
@Override
|
||||||
public void bugMessage(ProxiedPlayer player, String... message) {
|
public void execute(CommandSender sender, String[] args) {
|
||||||
|
if(!(sender instanceof ProxiedPlayer))
|
||||||
|
return;
|
||||||
|
|
||||||
|
ProxiedPlayer player = (ProxiedPlayer) sender;
|
||||||
String server = player.getServer().getInfo().getName();
|
String server = player.getServer().getInfo().getName();
|
||||||
|
String message = String.join(" ", args);
|
||||||
SteamwarUser user = SteamwarUser.get(player.getUniqueId());
|
SteamwarUser user = SteamwarUser.get(player.getUniqueId());
|
||||||
SWException.log(String.join(" ", message), server + " " + player.getName() + " " + user.getId());
|
SWException.log(server, message, player.getName() + " " + user.getId());
|
||||||
ChatSender.of(player).system("BUG_MESSAGE");
|
Message.send("BUG_MESSAGE", player);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,174 +0,0 @@
|
|||||||
package de.steamwar.bungeecore.commands;
|
|
||||||
|
|
||||||
import de.steamwar.bungeecore.ArenaMode;
|
|
||||||
import de.steamwar.bungeecore.VelocityCore;
|
|
||||||
import de.steamwar.bungeecore.ServerStarter;
|
|
||||||
import de.steamwar.bungeecore.listeners.ConnectionListener;
|
|
||||||
import de.steamwar.command.SWCommand;
|
|
||||||
import de.steamwar.command.TypeMapper;
|
|
||||||
import de.steamwar.messages.ChatSender;
|
|
||||||
import net.md_5.bungee.api.CommandSender;
|
|
||||||
import net.md_5.bungee.api.ProxyServer;
|
|
||||||
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.nio.file.Files;
|
|
||||||
import java.util.*;
|
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
public class BuilderCloudCommand extends SWCommand {
|
|
||||||
|
|
||||||
private final Map<String, ServerStarter.Version> versionMap = new HashMap<>();
|
|
||||||
|
|
||||||
public BuilderCloudCommand() {
|
|
||||||
super("buildercloud", ConnectionListener.BUILDERCLOUD_PERMISSION, "builder");
|
|
||||||
|
|
||||||
versionMap.put("15", ServerStarter.Version.SPIGOT_15);
|
|
||||||
versionMap.put("1.15", ServerStarter.Version.SPIGOT_15);
|
|
||||||
versionMap.put("1.15.2", ServerStarter.Version.SPIGOT_15);
|
|
||||||
versionMap.put("19", ServerStarter.Version.PAPER_19);
|
|
||||||
versionMap.put("1.19", ServerStarter.Version.PAPER_19);
|
|
||||||
versionMap.put("1.19.2", ServerStarter.Version.PAPER_19);
|
|
||||||
versionMap.put("20", ServerStarter.Version.PAPER_20);
|
|
||||||
versionMap.put("1.20", ServerStarter.Version.PAPER_20);
|
|
||||||
versionMap.put("1.20.1", ServerStarter.Version.PAPER_20);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Register(value = "create", description = "BUILDERCLOUD_CREATE_USAGE")
|
|
||||||
public void create(ProxiedPlayer player, @ErrorMessage("BUILDERCLOUD_VERSION") ServerStarter.Version version, @Mapper("map") String map, @OptionalValue("") @Mapper("generator") @AllowNull File generator) {
|
|
||||||
mapFile(version, map).mkdir();
|
|
||||||
new ServerStarter().builder(version, map, generator).send(player).start();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Register(description = "BUILDERCLOUD_USAGE")
|
|
||||||
public void start(ProxiedPlayer player, @ErrorMessage("BUILDERCLOUD_VERSION") ServerStarter.Version version, @Mapper("map") String map) {
|
|
||||||
if(!mapFile(version, map).exists()) {
|
|
||||||
ChatSender.of(player).system("BUILDERCLOUD_UNKNOWN_MAP");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
new ServerStarter().builder(version, map, null).send(player).start();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Register(value = "rename", description = "BUILDERCLOUD_RENAME_USAGE")
|
|
||||||
public void rename(ProxiedPlayer player, @ErrorMessage("BUILDERCLOUD_VERSION") ServerStarter.Version version, @Mapper("map") String oldName, String newName) {
|
|
||||||
File oldMap = mapFile(version, oldName);
|
|
||||||
if(!oldMap.exists()) {
|
|
||||||
ChatSender.of(player).system("BUILDERCLOUD_UNKNOWN_MAP");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
File newMap = mapFile(version, newName);
|
|
||||||
if(newMap.exists()) {
|
|
||||||
ChatSender.of(player).system("BUILDERCLOUD_EXISTING_MAP");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
Files.move(oldMap.toPath(), newMap.toPath());
|
|
||||||
} catch (IOException e) {
|
|
||||||
throw new SecurityException(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
ChatSender.of(player).system("BUILDERCLOUD_RENAMED");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Register(value = "deploy", description = "BUILDERCLOUD_DEPLOY_USAGE")
|
|
||||||
public void deploy(ProxiedPlayer player, @Mapper("nonHistoricArenaMode") ArenaMode arenaMode, @ErrorMessage("BUILDERCLOUD_VERSION") ServerStarter.Version version, @Mapper("map") String map) {
|
|
||||||
if(!mapFile(version, map).exists()) {
|
|
||||||
ChatSender.of(player).system("BUILDERCLOUD_UNKNOWN_MAP");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
ProxyServer.getInstance().getScheduler().runAsync(VelocityCore.get(), () -> {
|
|
||||||
VelocityCore.local.execute("/binarys/deployarena.py", arenaMode.getConfig(), Integer.toString(version.getVersionSuffix()), map);
|
|
||||||
ArenaMode.init();
|
|
||||||
ChatSender.of(player).system("BUILDERCLOUD_DEPLOY_FINISHED");
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
@ClassMapper(value = ServerStarter.Version.class, local = true)
|
|
||||||
private TypeMapper<ServerStarter.Version> versionTypeMapper() {
|
|
||||||
return new TypeMapper<ServerStarter.Version>() {
|
|
||||||
@Override
|
|
||||||
public ServerStarter.Version map(CommandSender commandSender, String[] previousArguments, String s) {
|
|
||||||
return versionMap.get(s);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Collection<String> tabCompletes(CommandSender sender, String[] previousArguments, String s) {
|
|
||||||
return versionMap.keySet();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
@Cached(global = true)
|
|
||||||
@Mapper(value = "map", local = true)
|
|
||||||
private TypeMapper<String> mapTypeMapper() {
|
|
||||||
|
|
||||||
return new TypeMapper<String>() {
|
|
||||||
@Override
|
|
||||||
public String map(CommandSender commandSender, String[] previousArguments, String s) {
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Collection<String> tabCompletes(CommandSender sender, String[] previousArguments, String s) {
|
|
||||||
File folder = getWorldFolder(previousArguments, 1);
|
|
||||||
|
|
||||||
String[] files;
|
|
||||||
if(folder == null || (files = folder.list()) == null)
|
|
||||||
return Collections.emptyList();
|
|
||||||
|
|
||||||
return Arrays.stream(files).filter(file -> new File(folder, file).isDirectory()).filter(file -> s.startsWith(".") || !file.startsWith(".")).collect(Collectors.toList());
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
@Cached(global = true)
|
|
||||||
@Mapper(value = "generator", local = true)
|
|
||||||
private TypeMapper<File> generatorTypeMapper() {
|
|
||||||
|
|
||||||
return new TypeMapper<File>() {
|
|
||||||
@Override
|
|
||||||
public File map(CommandSender commandSender, String[] previousArguments, String s) {
|
|
||||||
if(s.equals(""))
|
|
||||||
return null;
|
|
||||||
|
|
||||||
File folder = getWorldFolder(previousArguments, 2);
|
|
||||||
|
|
||||||
if(folder == null)
|
|
||||||
throw new SecurityException();
|
|
||||||
|
|
||||||
File generator = new File(folder, s + ".dat");
|
|
||||||
if(!generator.exists() || !generator.isFile())
|
|
||||||
throw new SecurityException();
|
|
||||||
|
|
||||||
return generator;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Collection<String> tabCompletes(CommandSender sender, String[] previousArguments, String s) {
|
|
||||||
File folder = getWorldFolder(previousArguments, 2);
|
|
||||||
|
|
||||||
String[] files;
|
|
||||||
if(folder == null || (files = folder.list()) == null)
|
|
||||||
return Collections.emptyList();
|
|
||||||
|
|
||||||
return Arrays.stream(files).filter(file -> new File(folder, file).isFile()).filter(file -> file.endsWith(".dat")).map(file -> file.substring(0, file.length() - 4)).collect(Collectors.toList());
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
private File mapFile(ServerStarter.Version version, String map) {
|
|
||||||
return new File(version.getWorldFolder(ServerStarter.BUILDER_BASE_PATH), map);
|
|
||||||
}
|
|
||||||
|
|
||||||
private File getWorldFolder(String[] previousArguments, int offset) {
|
|
||||||
ServerStarter.Version v = versionMap.get(previousArguments[previousArguments.length - offset]);
|
|
||||||
if(v == null)
|
|
||||||
return null;
|
|
||||||
return new File(v.getWorldFolder(ServerStarter.BUILDER_BASE_PATH));
|
|
||||||
}
|
|
||||||
}
|
|
@ -20,73 +20,88 @@
|
|||||||
package de.steamwar.bungeecore.commands;
|
package de.steamwar.bungeecore.commands;
|
||||||
|
|
||||||
import de.steamwar.bungeecore.*;
|
import de.steamwar.bungeecore.*;
|
||||||
import de.steamwar.sql.IgnoreSystem;
|
import de.steamwar.bungeecore.listeners.mods.ModLoaderBlocker;
|
||||||
import de.steamwar.command.SWCommand;
|
import de.steamwar.bungeecore.sql.IgnoreSystem;
|
||||||
import de.steamwar.command.TypeValidator;
|
import net.md_5.bungee.api.CommandSender;
|
||||||
|
import net.md_5.bungee.api.ProxyServer;
|
||||||
import net.md_5.bungee.api.chat.ClickEvent;
|
import net.md_5.bungee.api.chat.ClickEvent;
|
||||||
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
|
|
||||||
import static de.steamwar.bungeecore.Storage.challenges;
|
import static de.steamwar.bungeecore.Storage.challenges;
|
||||||
|
|
||||||
public class ChallengeCommand extends SWCommand {
|
public class ChallengeCommand extends BasicCommand {
|
||||||
|
|
||||||
public ChallengeCommand() {
|
public ChallengeCommand() {
|
||||||
super("challenge");
|
super("challenge", "");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register(description = "CHALLENGE_USAGE")
|
@Override
|
||||||
public void challenge(@Validator("arenaPlayer") ProxiedPlayer player, @Validator("target") ProxiedPlayer target, @Mapper("nonHistoricArenaMode") @OptionalValue("") @AllowNull ArenaMode arenaMode, @Mapper("arenaMap") @OptionalValue("") @AllowNull String map) {
|
public void execute(CommandSender sender, String[] args) {
|
||||||
FightCommand.createArena(player, "/challenge " + target.getName() + " ", false, arenaMode, map, false, (p, mode, m) -> {
|
if(args.length < 1){
|
||||||
if(challenges.containsKey(target) && challenges.get(target).contains(p)){
|
Message.send("CHALLENGE_USAGE", sender);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(sender instanceof ProxiedPlayer))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if(ModLoaderBlocker.isFabric((ProxiedPlayer) sender)) {
|
||||||
|
Message.send("MODLOADER_DENIED", sender);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ProxiedPlayer target = ProxyServer.getInstance().getPlayer(args[0]);
|
||||||
|
if(target == null){
|
||||||
|
Message.send("CHALLENGE_OFFLINE", sender);
|
||||||
|
return;
|
||||||
|
}else if(target == sender){
|
||||||
|
Message.send("CHALLENGE_SELF", sender);
|
||||||
|
return;
|
||||||
|
}else if (IgnoreSystem.isIgnored(target, (ProxiedPlayer) sender)) {
|
||||||
|
Message.send("CHALLENGE_IGNORED", sender);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Subserver subserver = Subserver.getSubserver(target);
|
||||||
|
if(subserver != null && subserver.getType() == Servertype.ARENA){
|
||||||
|
Message.send("CHALLENGE_INARENA", sender);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
FightCommand.createArena(sender, "/challenge " + target.getName() + " ", false, args, 1, false, (player, mode, map) -> {
|
||||||
|
if(challenges.containsKey(target) && challenges.get(target).contains(player)){
|
||||||
challenges.remove(target);
|
challenges.remove(target);
|
||||||
challenges.remove(p);
|
challenges.remove(player);
|
||||||
|
|
||||||
new ServerStarter().arena(mode, map).blueLeader(player).redLeader(target).callback(
|
Subserver arena = new ServerStarter().arena(mode, map).blueLeader(player).redLeader(target).start();
|
||||||
arena -> Message.broadcast("CHALLENGE_BROADCAST", "CHALLENGE_BROADCAST_HOVER", new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/arena " + arena.getServer().getName()), mode.getDisplayName(), p.getName(), target.getName())
|
Message.broadcast("CHALLENGE_BROADCAST", "CHALLENGE_BROADCAST_HOVER",
|
||||||
).start();
|
new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/arena " + arena.getServer().getName()), mode.getDisplayName(), player.getName(), target.getName());
|
||||||
}else{
|
}else{
|
||||||
if(!challenges.containsKey(p)){
|
if(!challenges.containsKey(player)){
|
||||||
challenges.put(p, new LinkedList<>());
|
challenges.put(player, new LinkedList<>());
|
||||||
}
|
}
|
||||||
|
|
||||||
challenges.get(p).add(target);
|
challenges.get(player).add(target);
|
||||||
|
|
||||||
Message.send("CHALLENGE_CHALLENGED", p, target.getName(), mode.getDisplayName());
|
Message.send("CHALLENGE_CHALLENGED", player, target.getName(), mode.getDisplayName());
|
||||||
Message.send("CHALLENGE_CHALLENGED_TARGET", target, p.getName(), mode.getDisplayName(), mode.getMaps().size() != 1 ? Message.parse("CHALLENGE_CHALLENGED_MAP", target, m) : "");
|
Message.send("CHALLENGE_CHALLENGED_TARGET", target, player.getName(), mode.getDisplayName(), mode.getMaps().size()!=1?Message.parse("CHALLENGE_CHALLENGED_MAP", target, map):"");
|
||||||
|
|
||||||
Message.send("CHALLENGE_ACCEPT", target, Message.parse("CHALLENGE_ACCEPT_HOVER", target), new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/challenge " + p.getName() + " " + mode.getChatName() + " " + m));
|
Message.send("CHALLENGE_ACCEPT", target, Message.parse("CHALLENGE_ACCEPT_HOVER", target), new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/challenge " + player.getName() + " " + mode.getChatName() + " " + map));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Validator(value = "target", local = true)
|
|
||||||
public TypeValidator<ProxiedPlayer> targetValidator() {
|
|
||||||
return (sender, value, messageSender) -> {
|
|
||||||
if (value == null) {
|
|
||||||
messageSender.send("CHALLENGE_OFFLINE");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (sender == value) {
|
|
||||||
messageSender.send("CHALLENGE_SELF");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (IgnoreSystem.isIgnored(value.getUniqueId(), ((ProxiedPlayer) sender).getUniqueId())) {
|
|
||||||
messageSender.send("CHALLENGE_IGNORED");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
Subserver subserver = Subserver.getSubserver(value);
|
|
||||||
if (subserver != null && subserver.getType() == Servertype.ARENA) {
|
|
||||||
messageSender.send("CHALLENGE_INARENA");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void remove(ProxiedPlayer player){
|
public static void remove(ProxiedPlayer player){
|
||||||
challenges.remove(player);
|
challenges.remove(player);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Iterable<String> onTabComplete(CommandSender commandSender, String[] args) {
|
||||||
|
if(args.length == 2)
|
||||||
|
return ArenaMode.getAllChatNames(false);
|
||||||
|
return new ArrayList<>();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,23 +19,29 @@
|
|||||||
|
|
||||||
package de.steamwar.bungeecore.commands;
|
package de.steamwar.bungeecore.commands;
|
||||||
|
|
||||||
import com.velocitypowered.api.proxy.Player;
|
|
||||||
import de.steamwar.bungeecore.*;
|
import de.steamwar.bungeecore.*;
|
||||||
import de.steamwar.bungeecore.bot.util.DiscordSchemAlert;
|
import de.steamwar.bungeecore.bot.util.DiscordSchemAlert;
|
||||||
import de.steamwar.bungeecore.listeners.ConnectionListener;
|
import de.steamwar.bungeecore.listeners.ConnectionListener;
|
||||||
import de.steamwar.sql.*;
|
import de.steamwar.bungeecore.sql.CheckedSchematic;
|
||||||
import de.steamwar.command.SWCommand;
|
import de.steamwar.bungeecore.sql.SchematicNode;
|
||||||
import net.kyori.adventure.text.event.ClickEvent;
|
import de.steamwar.bungeecore.sql.SchematicType;
|
||||||
import org.simpleyaml.configuration.Configuration;
|
import de.steamwar.bungeecore.sql.SteamwarUser;
|
||||||
|
import net.md_5.bungee.api.ChatColor;
|
||||||
|
import net.md_5.bungee.api.CommandSender;
|
||||||
|
import net.md_5.bungee.api.ProxyServer;
|
||||||
|
import net.md_5.bungee.api.chat.ClickEvent;
|
||||||
|
import net.md_5.bungee.api.chat.TextComponent;
|
||||||
|
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
||||||
|
import net.md_5.bungee.config.Configuration;
|
||||||
|
|
||||||
import java.sql.Timestamp;
|
import java.sql.Timestamp;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
|
import java.time.format.DateTimeFormatter;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
|
|
||||||
public class CheckCommand extends SWCommand {
|
public class CheckCommand extends BasicCommand {
|
||||||
private static final Map<SchematicType, SchematicType> fightTypes = new HashMap<>();
|
|
||||||
private static Map<SchematicType, List<String>> checkQuestions = new HashMap<>();
|
private static Map<SchematicType, List<String>> checkQuestions = new HashMap<>();
|
||||||
private static Map<SchematicType, List<String>> ranks = new HashMap<>();
|
private static Map<SchematicType, List<String>> ranks = new HashMap<>();
|
||||||
|
|
||||||
@ -48,35 +54,78 @@ public class CheckCommand extends SWCommand {
|
|||||||
ranks.put(checkType, config.getStringList("Ranks"));
|
ranks.put(checkType, config.getStringList("Ranks"));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void addFightType(SchematicType checkType, SchematicType fightType) {
|
public static boolean isChecking(ProxiedPlayer player){
|
||||||
fightTypes.put(checkType, fightType);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean isChecking(Player player){
|
|
||||||
return currentCheckers.containsKey(player.getUniqueId());
|
return currentCheckers.containsKey(player.getUniqueId());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static SchematicNode getCheckingSchem(Player player) {
|
public static SchematicNode getCheckingSchem(ProxiedPlayer player) {
|
||||||
return currentCheckers.get(player.getUniqueId()).schematic;
|
return currentCheckers.get(player.getUniqueId()).schematic;
|
||||||
}
|
}
|
||||||
|
|
||||||
public CheckCommand() {
|
public CheckCommand() {
|
||||||
super("check", ConnectionListener.CHECK_PERMISSION);
|
super("check", ConnectionListener.CHECK_PERMISSION);
|
||||||
|
|
||||||
VelocityCore.get().getProxyServer().getScheduler().buildTask(VelocityCore.get(), () -> {
|
ProxyServer.getInstance().getScheduler().schedule(BungeeCore.get(), () -> {
|
||||||
List<SchematicNode> schematics = getSchemsToCheck();
|
List<SchematicNode> schematics = getSchemsToCheck();
|
||||||
if(schematics.size() != currentCheckers.size())
|
if(schematics.size() != currentCheckers.size())
|
||||||
Message.team("CHECK_REMINDER", "CHECK_REMINDER_HOVER", ClickEvent.runCommand("/check list"), schematics.size() - currentCheckers.size());
|
Message.team("CHECK_REMINDER", "CHECK_REMINDER_HOVER", new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/check list"), schematics.size() - currentCheckers.size());
|
||||||
}).repeat(10, TimeUnit.MINUTES).schedule();
|
}, 10, 10, TimeUnit.MINUTES);
|
||||||
}
|
}
|
||||||
public static void sendReminder(Player player) {
|
public static void sendReminder(ProxiedPlayer player) {
|
||||||
List<SchematicNode> schematics = getSchemsToCheck();
|
List<SchematicNode> schematics = getSchemsToCheck();
|
||||||
if(schematics.size() != currentCheckers.size())
|
if(schematics.size() != currentCheckers.size())
|
||||||
Message.send("CHECK_REMINDER", player, Message.parse("CHECK_REMINDER_HOVER", player), ClickEvent.runCommand("/check list"), schematics.size() - currentCheckers.size());
|
Message.send("CHECK_REMINDER", player, Message.parse("CHECK_REMINDER_HOVER", player), new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/check list"), schematics.size() - currentCheckers.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register(value = "list", description = "CHECK_HELP_LIST")
|
@Override
|
||||||
public void list(ProxiedPlayer player) {
|
public void execute(CommandSender sender, String[] args) {
|
||||||
|
if(!(sender instanceof ProxiedPlayer))
|
||||||
|
return;
|
||||||
|
ProxiedPlayer player = (ProxiedPlayer) sender;
|
||||||
|
|
||||||
|
if(args.length == 0){
|
||||||
|
help(sender);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch(args[0].toLowerCase()){
|
||||||
|
case "list":
|
||||||
|
list(player);
|
||||||
|
break;
|
||||||
|
case "schematic":
|
||||||
|
schematic(player, args[1]);
|
||||||
|
break;
|
||||||
|
case "next":
|
||||||
|
case "accept":
|
||||||
|
next(player, args);
|
||||||
|
break;
|
||||||
|
case "cancel":
|
||||||
|
abort(player);
|
||||||
|
break;
|
||||||
|
case "decline":
|
||||||
|
decline(player, args);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
help(player);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static List<SchematicNode> getSchemsToCheck(){
|
||||||
|
List<SchematicNode> schematicList = new LinkedList<>();
|
||||||
|
|
||||||
|
for (SchematicType type : SchematicType.values()) {
|
||||||
|
if (type.check())
|
||||||
|
schematicList.addAll(SchematicNode.getAllSchematicsOfType(type.toDB()));
|
||||||
|
}
|
||||||
|
return schematicList;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getChecker(SchematicNode schematic) {
|
||||||
|
if (currentSchems.get(schematic.getId()) == null) return null;
|
||||||
|
return currentSchems.get(schematic.getId()).checker.getName();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void list(ProxiedPlayer player) {
|
||||||
List<SchematicNode> schematicList = getSchemsToCheck();
|
List<SchematicNode> schematicList = getSchemsToCheck();
|
||||||
|
|
||||||
Message.sendPrefixless("CHECK_LIST_HEADER", player, schematicList.size());
|
Message.sendPrefixless("CHECK_LIST_HEADER", player, schematicList.size());
|
||||||
@ -104,82 +153,24 @@ public class CheckCommand extends SWCommand {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register(value = "schematic", noTabComplete = true)
|
private void schematic(ProxiedPlayer player, String schemID){
|
||||||
public void schematic(ProxiedPlayer player, String schemID) {
|
|
||||||
if(isChecking(player)){
|
if(isChecking(player)){
|
||||||
Message.send("CHECK_SCHEMATIC_ALREADY_CHECKING", player);
|
Message.send("CHECK_SCHEMATIC_ALREADY_CHECKING", player);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
SteamwarUser checkingUser = SteamwarUser.get(player.getUniqueId());
|
|
||||||
SchematicNode schem = SchematicNode.getSchematicNode(Integer.parseInt(schemID));
|
SchematicNode schem = SchematicNode.getSchematicNode(Integer.parseInt(schemID));
|
||||||
if(!schem.getSchemtype().check()){
|
if(!schem.getSchemtype().check()){
|
||||||
ProxyServer.getInstance().getLogger().log(Level.SEVERE, player.getName() + " tried to check an uncheckable schematic!");
|
ProxyServer.getInstance().getLogger().log(Level.SEVERE, player.getName() + " tried to check an uncheckable schematic!");
|
||||||
return;
|
return;
|
||||||
}else if(schem.getOwner() == checkingUser.getId()) {
|
}else if(schem.getOwner() == SteamwarUser.get(player.getUniqueId()).getId()) {
|
||||||
Message.send("CHECK_SCHEMATIC_OWN", player);
|
Message.send("CHECK_SCHEMATIC_OWN", player);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
int playerTeam = checkingUser.hasPerm(UserPerm.MODERATION) ? 0 : checkingUser.getTeam();
|
|
||||||
if (playerTeam != 0 && SteamwarUser.get(schem.getOwner()).getTeam() == playerTeam) {
|
|
||||||
Message.send("CHECK_SCHEMATIC_OWN_TEAM", player);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
new CheckSession(player, schem);
|
new CheckSession(player, schem);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register(value = "cancel", description = "CHECK_HELP_CANCEL")
|
|
||||||
@Register("abort")
|
|
||||||
public void abortCommand(ProxiedPlayer player) {
|
|
||||||
abort(player);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void abort(ProxiedPlayer player) {
|
|
||||||
if(notChecking(player))
|
|
||||||
return;
|
|
||||||
|
|
||||||
Message.send("CHECK_ABORT", player);
|
|
||||||
currentCheckers.get(player.getUniqueId()).abort();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Register(value = "next", description = "CHECK_HELP_NEXT")
|
|
||||||
public void next(ProxiedPlayer player) {
|
|
||||||
next(player, new String[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Register(value = "accept")
|
|
||||||
public void accept(ProxiedPlayer player, @OptionalValue("") String rank) {
|
|
||||||
if (rank.equals("")) {
|
|
||||||
next(player, new String[0]);
|
|
||||||
} else {
|
|
||||||
next(player, new String[]{rank});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Register(value = "decline", description = "CHECK_HELP_DECLINE")
|
|
||||||
public void decline(ProxiedPlayer player, String... message) {
|
|
||||||
if(notChecking(player))
|
|
||||||
return;
|
|
||||||
|
|
||||||
currentCheckers.get(player.getUniqueId()).decline(String.join(" ", message));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static List<SchematicNode> getSchemsToCheck(){
|
|
||||||
List<SchematicNode> schematicList = new LinkedList<>();
|
|
||||||
|
|
||||||
for (SchematicType type : SchematicType.values()) {
|
|
||||||
if (type.check())
|
|
||||||
schematicList.addAll(SchematicNode.getAllSchematicsOfType(type.toDB()));
|
|
||||||
}
|
|
||||||
return schematicList;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static String getChecker(SchematicNode schematic) {
|
|
||||||
if (currentSchems.get(schematic.getId()) == null) return null;
|
|
||||||
return currentSchems.get(schematic.getId()).checker.getName();
|
|
||||||
}
|
|
||||||
|
|
||||||
private static boolean notChecking(ProxiedPlayer player){
|
private static boolean notChecking(ProxiedPlayer player){
|
||||||
if(!isChecking(player)){
|
if(!isChecking(player)){
|
||||||
Message.send("CHECK_NOT_CHECKING", player);
|
Message.send("CHECK_NOT_CHECKING", player);
|
||||||
@ -193,9 +184,9 @@ public class CheckCommand extends SWCommand {
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
int rank = 0;
|
int rank = 0;
|
||||||
if(args.length > 0){
|
if(args.length > 1){
|
||||||
try{
|
try{
|
||||||
rank = Integer.parseInt(args[0]);
|
rank = Integer.parseInt(args[1]);
|
||||||
}catch(NumberFormatException e){
|
}catch(NumberFormatException e){
|
||||||
Message.send("CHECK_INVALID_RANK", player);
|
Message.send("CHECK_INVALID_RANK", player);
|
||||||
return;
|
return;
|
||||||
@ -205,6 +196,37 @@ public class CheckCommand extends SWCommand {
|
|||||||
currentCheckers.get(player.getUniqueId()).next(rank);
|
currentCheckers.get(player.getUniqueId()).next(rank);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void abort(ProxiedPlayer player){
|
||||||
|
if(notChecking(player))
|
||||||
|
return;
|
||||||
|
|
||||||
|
Message.send("CHECK_ABORT", player);
|
||||||
|
currentCheckers.get(player.getUniqueId()).abort();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void decline(ProxiedPlayer player, String[] args){
|
||||||
|
if(notChecking(player))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if(args.length < 2) {
|
||||||
|
help(player);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
StringBuilder message = new StringBuilder();
|
||||||
|
for (int i = 1; i < args.length; i++)
|
||||||
|
message.append(args[i]).append(" ");
|
||||||
|
|
||||||
|
currentCheckers.get(player.getUniqueId()).decline(message.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void help(CommandSender sender){
|
||||||
|
Message.sendPrefixless("CHECK_HELP_LIST", sender);
|
||||||
|
Message.sendPrefixless("CHECK_HELP_NEXT", sender);
|
||||||
|
Message.sendPrefixless("CHECK_HELP_DECLINE", sender);
|
||||||
|
Message.sendPrefixless("CHECK_HELP_CANCEL", sender);
|
||||||
|
}
|
||||||
|
|
||||||
private static class CheckSession{
|
private static class CheckSession{
|
||||||
private final ProxiedPlayer checker;
|
private final ProxiedPlayer checker;
|
||||||
private final SchematicNode schematic;
|
private final SchematicNode schematic;
|
||||||
@ -217,9 +239,9 @@ public class CheckCommand extends SWCommand {
|
|||||||
this.startTime = Timestamp.from(Instant.now());
|
this.startTime = Timestamp.from(Instant.now());
|
||||||
this.checkList = checkQuestions.get(schematic.getSchemtype()).listIterator();
|
this.checkList = checkQuestions.get(schematic.getSchemtype()).listIterator();
|
||||||
|
|
||||||
ProxyServer.getInstance().getScheduler().runAsync(VelocityCore.get(), () -> {
|
ProxyServer.getInstance().getScheduler().runAsync(BungeeCore.get(), () -> {
|
||||||
ArenaMode mode = ArenaMode.getBySchemType(fightTypes.get(schematic.getSchemtype()));
|
ArenaMode mode = ArenaMode.getBySchemType(schematic.getSchemtype().fightType());
|
||||||
if(!new ServerStarter().test(mode, mode.getRandomMap(), checker).check(schematic.getId()).start()) {
|
if(new ServerStarter().test(mode, mode.getRandomMap(), checker).check(schematic.getId()).start() == null) {
|
||||||
remove();
|
remove();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -268,7 +290,6 @@ public class CheckCommand extends SWCommand {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void accept(int rank){
|
private void accept(int rank){
|
||||||
if(createLog("freigegeben")) {
|
|
||||||
if(ranks.containsKey(schematic.getSchemtype())){
|
if(ranks.containsKey(schematic.getSchemtype())){
|
||||||
if(rank <= 0 || ranks.get(schematic.getSchemtype()).size() < rank){
|
if(rank <= 0 || ranks.get(schematic.getSchemtype()).size() < rank){
|
||||||
Message.send("CHECK_INVALID_RANK", checker);
|
Message.send("CHECK_INVALID_RANK", checker);
|
||||||
@ -277,23 +298,23 @@ public class CheckCommand extends SWCommand {
|
|||||||
schematic.setRank(rank);
|
schematic.setRank(rank);
|
||||||
}
|
}
|
||||||
|
|
||||||
schematic.setType(fightTypes.get(schematic.getSchemtype()).toDB());
|
schematic.setType(schematic.getSchemtype().fightType().toDB());
|
||||||
|
CheckedSchematic.create(schematic, SteamwarUser.get(checker.getUniqueId()).getId(), startTime, Timestamp.from(Instant.now()), "freigegeben");
|
||||||
SteamwarUser user = SteamwarUser.get(schematic.getOwner());
|
SteamwarUser user = SteamwarUser.get(schematic.getOwner());
|
||||||
ProxiedPlayer player = ProxyServer.getInstance().getPlayer(user.getUUID());
|
ProxiedPlayer player = ProxyServer.getInstance().getPlayer(user.getUuid());
|
||||||
if(player != null) {
|
if(player != null) {
|
||||||
Message.send("CHECK_ACCEPTED", player, schematic.getSchemtype().name(), schematic.getName());
|
Message.send("CHECK_ACCEPTED", player, schematic.getSchemtype().name(), schematic.getName());
|
||||||
} else {
|
} else {
|
||||||
DiscordSchemAlert.sendAccept(schematic, user);
|
DiscordSchemAlert.sendAccept(schematic, user);
|
||||||
}
|
}
|
||||||
Message.team("CHECK_ACCEPTED_TEAM", schematic.getName(), user.getUserName());
|
Message.team("CHECK_ACCEPTED_TEAM", schematic.getName(), user.getUserName());
|
||||||
}
|
|
||||||
stop();
|
stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void decline(String reason){
|
private void decline(String reason){
|
||||||
if(createLog(reason)) {
|
CheckedSchematic.create(schematic, SteamwarUser.get(checker.getUniqueId()).getId(), startTime, Timestamp.from(Instant.now()), reason);
|
||||||
SteamwarUser user = SteamwarUser.get(schematic.getOwner());
|
SteamwarUser user = SteamwarUser.get(schematic.getOwner());
|
||||||
ProxiedPlayer player = ProxyServer.getInstance().getPlayer(user.getUUID());
|
ProxiedPlayer player = ProxyServer.getInstance().getPlayer(user.getUuid());
|
||||||
if(player != null) {
|
if(player != null) {
|
||||||
Message.send("CHECK_DECLINED", player, schematic.getSchemtype().name(), schematic.getName(), reason);
|
Message.send("CHECK_DECLINED", player, schematic.getSchemtype().name(), schematic.getName(), reason);
|
||||||
} else {
|
} else {
|
||||||
@ -301,23 +322,24 @@ public class CheckCommand extends SWCommand {
|
|||||||
}
|
}
|
||||||
Message.team("CHECK_DECLINED_TEAM", schematic.getName(), user.getUserName(), reason);
|
Message.team("CHECK_DECLINED_TEAM", schematic.getName(), user.getUserName(), reason);
|
||||||
schematic.setType(SchematicType.Normal.toDB());
|
schematic.setType(SchematicType.Normal.toDB());
|
||||||
}
|
|
||||||
|
|
||||||
stop();
|
stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void abort(){
|
private void abort(){
|
||||||
createLog("Prüfvorgang abgebrochen");
|
CheckedSchematic.create(schematic, SteamwarUser.get(checker.getUniqueId()).getId(), startTime, Timestamp.from(Instant.now()), "Prüfvorgang abgebrochen");
|
||||||
stop();
|
stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void stop(){
|
private void stop(){
|
||||||
currentCheckers.remove(checker.getUniqueId());
|
currentCheckers.remove(checker.getUniqueId());
|
||||||
currentSchems.remove(schematic.getId());
|
currentSchems.remove(schematic.getId());
|
||||||
ProxyServer.getInstance().getScheduler().runAsync(VelocityCore.get(), () -> {
|
ProxyServer.getInstance().getScheduler().runAsync(BungeeCore.get(), () -> {
|
||||||
Bauserver subserver = Bauserver.get(checker.getUniqueId());
|
for (Subserver subserver : Subserver.getServerList()) {
|
||||||
if(subserver != null)
|
if (subserver.getType() == Servertype.BAUSERVER && ((Bauserver) subserver).getOwner().equals(checker.getUniqueId())) {
|
||||||
subserver.stop();
|
subserver.stop();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -325,13 +347,5 @@ public class CheckCommand extends SWCommand {
|
|||||||
currentCheckers.remove(checker.getUniqueId());
|
currentCheckers.remove(checker.getUniqueId());
|
||||||
currentSchems.remove(schematic.getId());
|
currentSchems.remove(schematic.getId());
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean createLog(String reason) {
|
|
||||||
if(SchematicNode.getSchematicNode(schematic.getId()) == null) // Schematic was deleted
|
|
||||||
return false;
|
|
||||||
|
|
||||||
CheckedSchematic.create(schematic, SteamwarUser.get(checker.getUniqueId()).getId(), startTime, Timestamp.from(Instant.now()), reason);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,41 +19,47 @@
|
|||||||
|
|
||||||
package de.steamwar.bungeecore.commands;
|
package de.steamwar.bungeecore.commands;
|
||||||
|
|
||||||
import de.steamwar.bungeecore.Message;
|
import de.steamwar.bungeecore.sql.Punishment;
|
||||||
import de.steamwar.sql.Punishment;
|
import de.steamwar.bungeecore.sql.SteamwarUser;
|
||||||
import de.steamwar.sql.SteamwarUser;
|
|
||||||
import de.steamwar.command.*;
|
|
||||||
import de.steamwar.messages.ChatSender;
|
import de.steamwar.messages.ChatSender;
|
||||||
|
import net.md_5.bungee.api.CommandSender;
|
||||||
import net.md_5.bungee.api.ProxyServer;
|
import net.md_5.bungee.api.ProxyServer;
|
||||||
import net.md_5.bungee.api.config.ServerInfo;
|
import net.md_5.bungee.api.config.ServerInfo;
|
||||||
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.net.InetSocketAddress;
|
import java.net.InetSocketAddress;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
public class DevCommand extends SWCommand {
|
public class DevCommand extends BasicCommand {
|
||||||
|
|
||||||
private final File devServerDir = new File("/configs/DevServer");
|
private final File devServerDir = new File("/configs/DevServer");
|
||||||
private final Map<String, ServerInfo> devServers = new HashMap<>();
|
private final Map<String, ServerInfo> devServers = new HashMap<>();
|
||||||
|
|
||||||
public DevCommand() {
|
public DevCommand() {
|
||||||
super("dev");
|
super("dev", "");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register
|
@Override
|
||||||
public void simpleCommand(@Validator ProxiedPlayer player) {
|
public void execute(CommandSender s, String[] args) {
|
||||||
updateDevServers();
|
if (!(s instanceof ProxiedPlayer))
|
||||||
ChatSender sender = ChatSender.of(player);
|
|
||||||
if (devServers.isEmpty()) {
|
|
||||||
sender.system("DEV_NO_SERVER");
|
|
||||||
return;
|
return;
|
||||||
|
ProxiedPlayer player = (ProxiedPlayer) s;
|
||||||
|
|
||||||
|
ChatSender sender = ChatSender.of(player);
|
||||||
|
if (sender.user().isPunishedWithMessage(sender, Punishment.PunishmentType.NoDevServer)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
updateDevServers();
|
||||||
|
if(devServers.isEmpty()) {
|
||||||
|
sender.system("DEV_NO_SERVER");
|
||||||
} else if (devServers.size() == 1) {
|
} else if (devServers.size() == 1) {
|
||||||
player.connect(devServers.values().stream().findAny().get());
|
player.connect(devServers.values().stream().findAny().get());
|
||||||
return;
|
} else if (args.length == 0) {
|
||||||
}
|
|
||||||
|
|
||||||
ServerInfo info = devServers.get(player.getName().toLowerCase());
|
ServerInfo info = devServers.get(player.getName().toLowerCase());
|
||||||
if (info == null) {
|
if (info == null) {
|
||||||
sender.system("DEV_UNKNOWN_SERVER");
|
sender.system("DEV_UNKNOWN_SERVER");
|
||||||
@ -61,13 +67,8 @@ public class DevCommand extends SWCommand {
|
|||||||
}
|
}
|
||||||
|
|
||||||
player.connect(info);
|
player.connect(info);
|
||||||
}
|
} else {
|
||||||
|
ServerInfo info = devServers.get(args[0].toLowerCase());
|
||||||
@Register
|
|
||||||
public void selectedCommand(@Validator ProxiedPlayer player, @Mapper("dev") String name) {
|
|
||||||
updateDevServers();
|
|
||||||
ChatSender sender = ChatSender.of(player);
|
|
||||||
ServerInfo info = devServers.get(name.toLowerCase());
|
|
||||||
if (info == null) {
|
if (info == null) {
|
||||||
sender.system("DEV_NO_SERVER");
|
sender.system("DEV_NO_SERVER");
|
||||||
return;
|
return;
|
||||||
@ -75,41 +76,34 @@ public class DevCommand extends SWCommand {
|
|||||||
|
|
||||||
player.connect(info);
|
player.connect(info);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ClassValidator(value = ProxiedPlayer.class, local = true)
|
|
||||||
public TypeValidator<ProxiedPlayer> punishmentGuardChecker() {
|
|
||||||
return (sender, value, messageSender) -> {
|
|
||||||
SteamwarUser user = SteamwarUser.get(value.getUniqueId());
|
|
||||||
if (user.isPunished(Punishment.PunishmentType.NoDevServer)) {
|
|
||||||
Message message = PunishmentCommand.punishmentMessage(user, Punishment.PunishmentType.NoDevServer);
|
|
||||||
messageSender.send(message.getFormat(), message.getParams());
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Mapper(value = "dev", local = true)
|
@Override
|
||||||
public TypeMapper<String> devServers() {
|
public Iterable<String> onTabComplete(CommandSender sender, String[] args) {
|
||||||
return SWCommandUtils.createMapper(s -> s, s -> {
|
if (!(sender instanceof ProxiedPlayer) || args.length > 1) {
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
|
|
||||||
updateDevServers();
|
updateDevServers();
|
||||||
return devServers.keySet();
|
return devServers.keySet().stream().filter(s -> {
|
||||||
});
|
if (args.length == 0) return true;
|
||||||
|
return s.startsWith(args[0].toLowerCase());
|
||||||
|
}).collect(Collectors.toList());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateDevServers() {
|
private void updateDevServers() {
|
||||||
String[] serverFiles = devServerDir.list();
|
String[] serverFiles = devServerDir.list();
|
||||||
|
|
||||||
Map<String, Integer> devServerFiles = new HashMap<>();
|
Map<String, Integer> devServerFiles = new HashMap<>();
|
||||||
if (serverFiles != null) {
|
if(serverFiles != null) {
|
||||||
for (String serverFile : serverFiles) {
|
for(String serverFile : serverFiles) {
|
||||||
String[] server = serverFile.split("\\.");
|
String[] server = serverFile.split("\\.");
|
||||||
devServerFiles.put(server[0], Integer.parseInt(server[1]));
|
devServerFiles.put(server[0], Integer.parseInt(server[1]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
devServers.entrySet().removeIf(entry -> {
|
devServers.entrySet().removeIf(entry -> {
|
||||||
if (!devServerFiles.containsKey(entry.getKey())) {
|
if(!devServerFiles.containsKey(entry.getKey())) {
|
||||||
ProxyServer.getInstance().getServers().remove(entry.getValue().getName());
|
ProxyServer.getInstance().getServers().remove(entry.getValue().getName());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -20,35 +20,58 @@
|
|||||||
package de.steamwar.bungeecore.commands;
|
package de.steamwar.bungeecore.commands;
|
||||||
|
|
||||||
import de.steamwar.bungeecore.*;
|
import de.steamwar.bungeecore.*;
|
||||||
import de.steamwar.messages.ChatSender;
|
import de.steamwar.bungeecore.sql.Event;
|
||||||
import de.steamwar.sql.*;
|
import de.steamwar.bungeecore.sql.EventFight;
|
||||||
import de.steamwar.command.SWCommand;
|
import de.steamwar.bungeecore.sql.Team;
|
||||||
import de.steamwar.command.SWCommandUtils;
|
import de.steamwar.bungeecore.sql.TeamTeilnahme;
|
||||||
import de.steamwar.command.TypeMapper;
|
import net.md_5.bungee.api.CommandSender;
|
||||||
import de.steamwar.command.TypeValidator;
|
|
||||||
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
||||||
|
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.time.format.DateTimeFormatter;
|
import java.time.format.DateTimeFormatter;
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
public class EventCommand extends SWCommand {
|
public class EventCommand extends BasicCommand {
|
||||||
|
|
||||||
public EventCommand() {
|
public EventCommand() {
|
||||||
super("event");
|
super("event", "");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Validator("noEvent")
|
@Override
|
||||||
public TypeValidator<ProxiedPlayer> noEventValidator() {
|
public void execute(CommandSender sender, String[] args) {
|
||||||
return (sender, value, messageSender) -> Event.get() == null;
|
if(!(sender instanceof ProxiedPlayer))
|
||||||
|
return;
|
||||||
|
ProxiedPlayer player = (ProxiedPlayer) sender;
|
||||||
|
|
||||||
|
Event currentEvent = Event.get();
|
||||||
|
|
||||||
|
if(currentEvent == null) {
|
||||||
|
noCurrentEvent(player);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register
|
if(args.length != 1){
|
||||||
public void noCurrentEvent(@Validator("noEvent") ProxiedPlayer player){
|
eventOverview(player, currentEvent);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Team team = Team.get(args[0]);
|
||||||
|
if(team == null){
|
||||||
|
Message.send("EVENT_NO_TEAM", player);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Subserver eventArena = EventStarter.getEventServer().get(team.getTeamId());
|
||||||
|
if(eventArena == null || !Subserver.getServerList().contains(eventArena)){
|
||||||
|
Message.send("EVENT_NO_FIGHT_TEAM", player);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
SubserverSystem.sendPlayer(eventArena, player);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void noCurrentEvent(ProxiedPlayer player){
|
||||||
Message.send("EVENT_NO_CURRENT", player);
|
Message.send("EVENT_NO_CURRENT", player);
|
||||||
List<Event> coming = Event.getComing();
|
List<Event> coming = Event.getComing();
|
||||||
Instant now = Instant.now();
|
Instant now = Instant.now();
|
||||||
@ -61,12 +84,6 @@ public class EventCommand extends SWCommand {
|
|||||||
if(now.isBefore(e.getDeadline().toInstant())) {
|
if(now.isBefore(e.getDeadline().toInstant())) {
|
||||||
Message.send("EVENT_COMING_DEADLINE", player, e.getDeadline());
|
Message.send("EVENT_COMING_DEADLINE", player, e.getDeadline());
|
||||||
}
|
}
|
||||||
SchematicType schemType = e.getSchematicType();
|
|
||||||
if (schemType != null) {
|
|
||||||
if (schemType.getDeadline() != null && now.isBefore(schemType.getDeadline().toInstant())) {
|
|
||||||
Message.send("EVENT_COMING_SCHEM_DEADLINE", player, e.getDeadline());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(!teams.isEmpty()){
|
if(!teams.isEmpty()){
|
||||||
StringBuilder tline = new StringBuilder();
|
StringBuilder tline = new StringBuilder();
|
||||||
for(Team t : teams){
|
for(Team t : teams){
|
||||||
@ -78,9 +95,7 @@ public class EventCommand extends SWCommand {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register
|
private void eventOverview(ProxiedPlayer player, Event currentEvent){
|
||||||
public void eventOverview(@Validator(value = "noEvent", invert = true) ProxiedPlayer player) {
|
|
||||||
Event currentEvent = Event.get();
|
|
||||||
Message.send("EVENT_USAGE", player);
|
Message.send("EVENT_USAGE", player);
|
||||||
|
|
||||||
List<EventFight> fights = EventFight.getEvent(currentEvent.getEventID());
|
List<EventFight> fights = EventFight.getEvent(currentEvent.getEventID());
|
||||||
@ -107,32 +122,7 @@ public class EventCommand extends SWCommand {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
VelocityCore.send(player, fline.toString());
|
BungeeCore.send(player, fline.toString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register
|
|
||||||
public void eventWithTeam(@Validator(value = "noEvent", invert = true) ProxiedPlayer player, @ErrorMessage("EVENT_NO_TEAM") Team team) {
|
|
||||||
Subserver eventArena = EventStarter.getEventServer().get(team.getTeamId());
|
|
||||||
if(eventArena == null || !Subserver.getServerList().contains(eventArena)){
|
|
||||||
Message.send("EVENT_NO_FIGHT_TEAM", player);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
ChatSender sender = ChatSender.of(player);
|
|
||||||
if (!PunishmentCommand.isPunishedWithMessage(sender, Punishment.PunishmentType.NoFightServer)) {
|
|
||||||
SubserverSystem.sendPlayer(eventArena, player);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@ClassMapper(Team.class)
|
|
||||||
@Cached(cacheDuration = 10, global = true)
|
|
||||||
public TypeMapper<Team> teamMapper() {
|
|
||||||
return SWCommandUtils.createMapper(Team::get, s -> EventStarter.getEventServer()
|
|
||||||
.keySet()
|
|
||||||
.stream()
|
|
||||||
.map(Team::get)
|
|
||||||
.map(t -> Arrays.asList(t.getTeamKuerzel(), t.getTeamColor()))
|
|
||||||
.flatMap(Collection::stream)
|
|
||||||
.collect(Collectors.toList()));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -20,33 +20,38 @@
|
|||||||
package de.steamwar.bungeecore.commands;
|
package de.steamwar.bungeecore.commands;
|
||||||
|
|
||||||
import de.steamwar.bungeecore.Message;
|
import de.steamwar.bungeecore.Message;
|
||||||
import de.steamwar.bungeecore.listeners.ConnectionListener;
|
import de.steamwar.bungeecore.sql.Event;
|
||||||
import de.steamwar.sql.EventFight;
|
import de.steamwar.bungeecore.sql.EventFight;
|
||||||
import de.steamwar.sql.Team;
|
import de.steamwar.bungeecore.sql.Team;
|
||||||
import de.steamwar.command.SWCommand;
|
|
||||||
import de.steamwar.command.TypeMapper;
|
|
||||||
import de.steamwar.sql.Event;
|
|
||||||
import net.md_5.bungee.api.CommandSender;
|
import net.md_5.bungee.api.CommandSender;
|
||||||
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
||||||
|
|
||||||
import java.sql.Timestamp;
|
import java.sql.Timestamp;
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.ListIterator;
|
import java.util.ListIterator;
|
||||||
import java.util.stream.Collectors;
|
|
||||||
import java.util.stream.Stream;
|
|
||||||
|
|
||||||
public class EventRescheduleCommand extends SWCommand {
|
public class EventRescheduleCommand extends BasicCommand {
|
||||||
|
|
||||||
public EventRescheduleCommand() {
|
public EventRescheduleCommand() {
|
||||||
super("eventreschedule", ConnectionListener.EVENTRELOAD_PERMISSION);
|
super("eventreschedule", "bungeecore.softreload");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register
|
@Override
|
||||||
public void reschedule(ProxiedPlayer player, Team teamBlue, Team teamRed) {
|
public void execute(CommandSender sender, String[] args) {
|
||||||
|
if(!(sender instanceof ProxiedPlayer))
|
||||||
|
return;
|
||||||
|
ProxiedPlayer player = (ProxiedPlayer) sender;
|
||||||
|
|
||||||
|
if(args.length != 2){
|
||||||
|
Message.send("EVENTRESCHEDULE_USAGE", player);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Team teamBlue = Team.get(args[0]);
|
||||||
|
Team teamRed = Team.get(args[1]);
|
||||||
Event event = Event.get();
|
Event event = Event.get();
|
||||||
if(event == null){
|
if(teamBlue == null || teamRed == null || event == null){
|
||||||
Message.send("EVENTRESCHEDULE_UNKNOWN_TEAM", player);
|
Message.send("EVENTRESCHEDULE_UNKNOWN_TEAM", player);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -69,22 +74,4 @@ public class EventRescheduleCommand extends SWCommand {
|
|||||||
|
|
||||||
Message.send("EVENTRESCHEDULE_NO_FIGHT", player);
|
Message.send("EVENTRESCHEDULE_NO_FIGHT", player);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ClassMapper(value = Team.class, local = true)
|
|
||||||
public TypeMapper<Team> teamTypeMapper() {
|
|
||||||
return new TypeMapper<Team>() {
|
|
||||||
@Override
|
|
||||||
public Team map(CommandSender commandSender, String[] previousArguments, String s) {
|
|
||||||
return Team.get(s);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Collection<String> tabCompletes(CommandSender sender, String[] previousArguments, String s) {
|
|
||||||
Event event = Event.get();
|
|
||||||
if (event == null) return null;
|
|
||||||
List<EventFight> fights = EventFight.getEvent(event.getEventID());
|
|
||||||
return fights.stream().flatMap(fight -> Stream.of(fight.getTeamBlue(), fight.getTeamRed())).map(Team::get).map(Team::getTeamKuerzel).distinct().collect(Collectors.toList());
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -19,18 +19,16 @@
|
|||||||
|
|
||||||
package de.steamwar.bungeecore.commands;
|
package de.steamwar.bungeecore.commands;
|
||||||
|
|
||||||
import de.steamwar.bungeecore.listeners.ConnectionListener;
|
import de.steamwar.bungeecore.sql.EventFight;
|
||||||
import de.steamwar.sql.EventFight;
|
|
||||||
import de.steamwar.command.SWCommand;
|
|
||||||
import net.md_5.bungee.api.CommandSender;
|
import net.md_5.bungee.api.CommandSender;
|
||||||
|
|
||||||
public class EventreloadCommand extends SWCommand {
|
public class EventreloadCommand extends BasicCommand {
|
||||||
public EventreloadCommand() {
|
public EventreloadCommand() {
|
||||||
super("eventreload", ConnectionListener.EVENTRELOAD_PERMISSION);
|
super("eventreload", "bungeecore.softreload");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register
|
@Override
|
||||||
public void execute(CommandSender sender) {
|
public void execute(CommandSender sender, String[] args) {
|
||||||
EventFight.loadAllComingFights();
|
EventFight.loadAllComingFights();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -22,16 +22,20 @@ package de.steamwar.bungeecore.commands;
|
|||||||
import de.steamwar.bungeecore.*;
|
import de.steamwar.bungeecore.*;
|
||||||
import de.steamwar.bungeecore.inventory.SWInventory;
|
import de.steamwar.bungeecore.inventory.SWInventory;
|
||||||
import de.steamwar.bungeecore.inventory.SWItem;
|
import de.steamwar.bungeecore.inventory.SWItem;
|
||||||
import de.steamwar.command.SWCommand;
|
import de.steamwar.bungeecore.listeners.mods.ModLoaderBlocker;
|
||||||
|
import de.steamwar.bungeecore.sql.Punishment;
|
||||||
import de.steamwar.messages.ChatSender;
|
import de.steamwar.messages.ChatSender;
|
||||||
import net.md_5.bungee.api.ChatColor;
|
import net.md_5.bungee.api.ChatColor;
|
||||||
import net.md_5.bungee.api.ChatMessageType;
|
import net.md_5.bungee.api.ChatMessageType;
|
||||||
|
import net.md_5.bungee.api.CommandSender;
|
||||||
import net.md_5.bungee.api.chat.ClickEvent;
|
import net.md_5.bungee.api.chat.ClickEvent;
|
||||||
import net.md_5.bungee.api.chat.HoverEvent;
|
import net.md_5.bungee.api.chat.HoverEvent;
|
||||||
import net.md_5.bungee.api.chat.TextComponent;
|
import net.md_5.bungee.api.chat.TextComponent;
|
||||||
import net.md_5.bungee.api.chat.hover.content.Text;
|
import net.md_5.bungee.api.chat.hover.content.Text;
|
||||||
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
||||||
|
|
||||||
|
import java.util.LinkedList;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Jeder Fightcommand (auch bau testarena und challenge) haben folgende Optionskette:
|
* Jeder Fightcommand (auch bau testarena und challenge) haben folgende Optionskette:
|
||||||
*
|
*
|
||||||
@ -41,7 +45,7 @@ import net.md_5.bungee.api.connection.ProxiedPlayer;
|
|||||||
* Sollte die Map fehlen, kann sie mit getMap() bestimmt werden.
|
* Sollte die Map fehlen, kann sie mit getMap() bestimmt werden.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public class FightCommand extends SWCommand {
|
public class FightCommand extends BasicCommand {
|
||||||
|
|
||||||
public FightCommand() {
|
public FightCommand() {
|
||||||
super("fight", "", "f");
|
super("fight", "", "f");
|
||||||
@ -87,6 +91,34 @@ public class FightCommand extends SWCommand {
|
|||||||
sender.sendMessage(ChatMessageType.SYSTEM, start);
|
sender.sendMessage(ChatMessageType.SYSTEM, start);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void getMaps(ChatSender sender, String precommand, ArenaMode mode){
|
||||||
|
TextComponent start = new TextComponent();
|
||||||
|
TextComponent current = start;
|
||||||
|
if(mode.getMaps().size() > 1){
|
||||||
|
String command = precommand + mode.getChatName() + " Random";
|
||||||
|
start.setBold(true);
|
||||||
|
start.setColor(ChatColor.GRAY);
|
||||||
|
start.setText(sender.parseToLegacy("FIGHT_ARENA_RANDOM") + " ");
|
||||||
|
start.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new Text("§e" + command)));
|
||||||
|
start.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, command));
|
||||||
|
current = new TextComponent();
|
||||||
|
}
|
||||||
|
|
||||||
|
for(String map : mode.getMaps()){
|
||||||
|
String command = precommand + mode.getChatName() + " " + map;
|
||||||
|
current.setBold(true);
|
||||||
|
current.setColor(ChatColor.GRAY);
|
||||||
|
current.setText(map + " ");
|
||||||
|
current.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new Text("§e" + command)));
|
||||||
|
current.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, command));
|
||||||
|
if(current != start)
|
||||||
|
start.addExtra(current);
|
||||||
|
current = new TextComponent();
|
||||||
|
}
|
||||||
|
|
||||||
|
sender.sendMessage(ChatMessageType.SYSTEM, start);
|
||||||
|
}
|
||||||
|
|
||||||
private static boolean alreadyInArena(ProxiedPlayer player){
|
private static boolean alreadyInArena(ProxiedPlayer player){
|
||||||
Subserver subserver = Subserver.getSubserver(player);
|
Subserver subserver = Subserver.getSubserver(player);
|
||||||
if(subserver != null && subserver.getType() == Servertype.ARENA){
|
if(subserver != null && subserver.getType() == Servertype.ARENA){
|
||||||
@ -97,24 +129,51 @@ public class FightCommand extends SWCommand {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void createArena(ProxiedPlayer player, String precommand, boolean allowMerging, ArenaMode arenaMode, String map, boolean historic, FightCallback callback) {
|
static void createArena(CommandSender s, String precommand, boolean allowMerging, String[] args, int startArg, boolean historic, FightCallback callback){
|
||||||
|
if(!(s instanceof ProxiedPlayer))
|
||||||
|
return;
|
||||||
|
|
||||||
|
ProxiedPlayer player = (ProxiedPlayer) s;
|
||||||
|
|
||||||
ChatSender sender = ChatSender.of(player);
|
ChatSender sender = ChatSender.of(player);
|
||||||
|
if (sender.user().isPunishedWithMessage(sender, Punishment.PunishmentType.NoFightServer)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if(alreadyInArena(player))
|
if(alreadyInArena(player))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (arenaMode == null) {
|
if(ModLoaderBlocker.isFabric(player) && !precommand.equals("/bau testarena ")) {
|
||||||
|
sender.system("MODLOADER_DENIED");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(args.length < startArg+1){
|
||||||
getModes(sender, precommand, historic);
|
getModes(sender, precommand, historic);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (map == null)
|
ArenaMode mode = getMode(sender, args[startArg]);
|
||||||
map = arenaMode.getRandomMap();
|
if(mode == null)
|
||||||
|
return;
|
||||||
|
|
||||||
if (!allowMerging) {
|
String map;
|
||||||
callback.run(player, arenaMode, map);
|
if(mode.getMaps().size() == 1){
|
||||||
|
map = mode.getRandomMap();
|
||||||
|
}else if(args.length < startArg+2){
|
||||||
|
getMaps(sender, precommand, mode);
|
||||||
|
return;
|
||||||
|
}else{
|
||||||
|
map = getMap(sender, mode, args[startArg+1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(map == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if(!allowMerging) {
|
||||||
|
callback.run(player, mode, map);
|
||||||
} else {
|
} else {
|
||||||
suggestMerging(player, arenaMode, map, callback);
|
suggestMerging(player, mode, map, callback);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -124,7 +183,7 @@ public class FightCommand extends SWCommand {
|
|||||||
for (Subserver subserver : Subserver.getServerList()) {
|
for (Subserver subserver : Subserver.getServerList()) {
|
||||||
if(subserver instanceof Arenaserver) {
|
if(subserver instanceof Arenaserver) {
|
||||||
Arenaserver arenaserver = (Arenaserver) subserver;
|
Arenaserver arenaserver = (Arenaserver) subserver;
|
||||||
if(mode.getInternalName().equals(arenaserver.getMode()) && arenaserver.isAllowMerge() && arenaserver.getServer().getPlayers().size() == 1) {
|
if(mode.getInternalName().equals(arenaserver.getMode()) && map.equals(arenaserver.getMap()) && arenaserver.isAllowMerge() && arenaserver.getServer().getPlayers().size() == 1) {
|
||||||
mergable = arenaserver;
|
mergable = arenaserver;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -157,13 +216,26 @@ public class FightCommand extends SWCommand {
|
|||||||
inventory.open();
|
inventory.open();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register
|
@Override
|
||||||
public void fight(@Validator("arenaPlayer") ProxiedPlayer player, @Mapper("nonHistoricArenaMode") @OptionalValue("") @AllowNull ArenaMode arenaMode, @Mapper("arenaMap") @OptionalValue("") @AllowNull String map) {
|
public void execute(CommandSender sender, String[] args) {
|
||||||
createArena(player, "/fight ", true, arenaMode, map, false,
|
createArena(sender, "/fight ", true, args, 0, false, (player, mode, map) -> {
|
||||||
(p, mode, m) -> new ServerStarter().arena(mode, m).blueLeader(p).callback(
|
Subserver arena = new ServerStarter().arena(mode, map).blueLeader(player).start();
|
||||||
arena -> Message.broadcast("FIGHT_BROADCAST", "FIGHT_BROADCAST_HOVER", new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/arena " + arena.getServer().getName()), mode.getDisplayName(), p.getName())
|
Message.broadcast("FIGHT_BROADCAST", "FIGHT_BROADCAST_HOVER"
|
||||||
).start()
|
, new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/arena " + arena.getServer().getName()), mode.getDisplayName(), player.getName());
|
||||||
);
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Iterable<String> onTabComplete(CommandSender commandSender, String[] args) {
|
||||||
|
if(args.length == 1){
|
||||||
|
return ArenaMode.getAllChatNames(false);
|
||||||
|
}else if(args.length == 2){
|
||||||
|
ArenaMode mode = ArenaMode.getByChat(args[1]);
|
||||||
|
if(mode == null)
|
||||||
|
return new LinkedList<>();
|
||||||
|
return mode.getMaps();
|
||||||
|
}
|
||||||
|
return new LinkedList<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1,37 +1,36 @@
|
|||||||
package de.steamwar.bungeecore.commands;
|
package de.steamwar.bungeecore.commands;
|
||||||
|
|
||||||
import de.steamwar.bungeecore.VelocityCore;
|
import de.steamwar.bungeecore.BungeeCore;
|
||||||
import de.steamwar.bungeecore.Message;
|
import de.steamwar.bungeecore.Message;
|
||||||
import de.steamwar.sql.internal.Statement;
|
import de.steamwar.bungeecore.sql.Statement;
|
||||||
import de.steamwar.sql.SteamwarUser;
|
import de.steamwar.bungeecore.sql.SteamwarUser;
|
||||||
import de.steamwar.command.SWCommand;
|
|
||||||
import net.md_5.bungee.BungeeCord;
|
import net.md_5.bungee.BungeeCord;
|
||||||
|
import net.md_5.bungee.api.CommandSender;
|
||||||
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.util.zip.ZipEntry;
|
import java.util.zip.ZipEntry;
|
||||||
import java.util.zip.ZipOutputStream;
|
import java.util.zip.ZipOutputStream;
|
||||||
|
|
||||||
public class GDPRQuery extends SWCommand {
|
public class GDPRQuery extends BasicCommand {
|
||||||
|
|
||||||
public GDPRQuery() {
|
public GDPRQuery() {
|
||||||
super("gdprquery", "bungeecore.softreload");
|
super("gdprquery", "bungeecore.softreload");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register
|
@Override
|
||||||
public void generate(ProxiedPlayer player) {
|
public void execute(CommandSender sender, String[] args) {
|
||||||
generate(player, player);
|
if(!(sender instanceof ProxiedPlayer))
|
||||||
}
|
return;
|
||||||
|
|
||||||
@Register
|
ProxiedPlayer player = (ProxiedPlayer) sender;
|
||||||
public void generate(ProxiedPlayer player, ProxiedPlayer forPlayer) {
|
SteamwarUser user = args.length == 0 ? SteamwarUser.get(player.getUniqueId()) : SteamwarUser.get(args[0]);
|
||||||
SteamwarUser user = SteamwarUser.get(forPlayer.getUniqueId());
|
|
||||||
if(user == null) {
|
if(user == null) {
|
||||||
Message.send("UNKNOWN_PLAYER", player);
|
Message.send("UNKNOWN_PLAYER", player);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
BungeeCord.getInstance().getScheduler().runAsync(VelocityCore.get(), () -> {
|
BungeeCord.getInstance().getScheduler().runAsync(BungeeCore.get(), () -> {
|
||||||
try {
|
try {
|
||||||
createZip(player, user);
|
createZip(player, user);
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
@ -49,7 +48,7 @@ public class GDPRQuery extends SWCommand {
|
|||||||
copy(getClass().getClassLoader().getResourceAsStream("GDPRQueryREADME.md"), out, "README.txt");
|
copy(getClass().getClassLoader().getResourceAsStream("GDPRQueryREADME.md"), out, "README.txt");
|
||||||
|
|
||||||
printUpdate(player, "GDPR_STATUS_WORLD");
|
printUpdate(player, "GDPR_STATUS_WORLD");
|
||||||
copyBauwelt(user, out, "/home/minecraft/userworlds/" + user.getUUID().toString(), "BuildWorld12");
|
copyBauwelt(user, out, "/home/minecraft/userworlds/" + user.getUuid().toString(), "BuildWorld12");
|
||||||
copyBauwelt(user, out, "/home/minecraft/userworlds15/" + user.getId(), "BuildWorld15");
|
copyBauwelt(user, out, "/home/minecraft/userworlds15/" + user.getId(), "BuildWorld15");
|
||||||
|
|
||||||
printUpdate(player, "GDPR_STATUS_INVENTORIES");
|
printUpdate(player, "GDPR_STATUS_INVENTORIES");
|
||||||
@ -214,14 +213,14 @@ public class GDPRQuery extends SWCommand {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
File playerdata = new File(world, "playerdata/" + user.getUUID().toString() + ".dat");
|
File playerdata = new File(world, "playerdata/" + user.getUuid().toString() + ".dat");
|
||||||
if(playerdata.exists())
|
if(playerdata.exists())
|
||||||
copy(playerdata, out, outDir + "/playerdata/" + user.getUUID().toString() + ".dat");
|
copy(playerdata, out, outDir + "/playerdata/" + user.getUuid().toString() + ".dat");
|
||||||
}
|
}
|
||||||
|
|
||||||
private void copyPlayerdata(SteamwarUser user, ZipOutputStream out, String inDir, String outDir) throws IOException {
|
private void copyPlayerdata(SteamwarUser user, ZipOutputStream out, String inDir, String outDir) throws IOException {
|
||||||
File worlds = new File(inDir);
|
File worlds = new File(inDir);
|
||||||
String path = "playerdata/" + user.getUUID().toString() + ".dat";
|
String path = "playerdata/" + user.getUuid().toString() + ".dat";
|
||||||
|
|
||||||
int i = 0;
|
int i = 0;
|
||||||
for(File world : worlds.listFiles()) {
|
for(File world : worlds.listFiles()) {
|
||||||
@ -229,7 +228,7 @@ public class GDPRQuery extends SWCommand {
|
|||||||
if(!playerdata.exists())
|
if(!playerdata.exists())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
copy(playerdata, out, outDir + "/" + (i++) + "/" + user.getUUID().toString() + ".dat");
|
copy(playerdata, out, outDir + "/" + (i++) + "/" + user.getUuid().toString() + ".dat");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -20,84 +20,88 @@
|
|||||||
package de.steamwar.bungeecore.commands;
|
package de.steamwar.bungeecore.commands;
|
||||||
|
|
||||||
import de.steamwar.bungeecore.Message;
|
import de.steamwar.bungeecore.Message;
|
||||||
import de.steamwar.command.SWCommand;
|
|
||||||
import de.steamwar.messages.ChatSender;
|
import de.steamwar.messages.ChatSender;
|
||||||
|
import net.md_5.bungee.api.CommandSender;
|
||||||
import net.md_5.bungee.api.chat.ClickEvent;
|
import net.md_5.bungee.api.chat.ClickEvent;
|
||||||
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
|
||||||
|
|
||||||
public class HelpCommand extends SWCommand {
|
public class HelpCommand extends BasicCommand {
|
||||||
|
|
||||||
public HelpCommand() {
|
public HelpCommand() {
|
||||||
super("help", "", "?");
|
super("help", "", "?");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register
|
@Override
|
||||||
public void genericCommand(ProxiedPlayer player) {
|
public void execute(CommandSender s, String[] args) {
|
||||||
ChatSender sender = ChatSender.of(player);
|
ChatSender sender = ChatSender.of(s);
|
||||||
|
if (args.length < 1) {
|
||||||
printPage(sender, ClickEvent.Action.RUN_COMMAND,
|
printPage(sender, ClickEvent.Action.RUN_COMMAND,
|
||||||
"HELP_LOBBY", "/l",
|
"HELP_LOBBY", "/l",
|
||||||
"HELP_BAU", "/build",
|
"HELP_BAU", "/bau",
|
||||||
"HELP_BAUSERVER", "/help build",
|
"HELP_BAUSERVER", "/help bau",
|
||||||
"HELP_FIGHT", "/fight",
|
"HELP_FIGHT", "/fight",
|
||||||
"HELP_CHALLENGE", "/challenge",
|
"HELP_CHALLENGE", "/challenge",
|
||||||
"HELP_HISTORIC", "/historic",
|
"HELP_HISTORIC", "/historic",
|
||||||
"HELP_TEAM", "/team",
|
"HELP_TEAM", "/team",
|
||||||
"HELP_JOIN", "/join",
|
"HELP_JOIN", "/join",
|
||||||
"HELP_LOCAL", "/local");
|
"HELP_LOCAL", "/local");
|
||||||
|
}else if (args[0].equalsIgnoreCase("bauserver")) {
|
||||||
|
sendBauHelp(sender);
|
||||||
|
}else if (args[0].equalsIgnoreCase("bau")) {
|
||||||
|
bauHelpGroup(sender, args);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register({"build","world"})
|
private static void bauHelpGroup(ChatSender sender, String[] args) {
|
||||||
public void buildWorld(ProxiedPlayer player) {
|
if (args.length < 2) {
|
||||||
printPage(ChatSender.of(player), "HELP_BAU_GROUP_WORLD_TITLE", "HELP_TNT", "HELP_FIRE", "HELP_FREEZE", "HELP_TPSLIMIT", "HELP_PROTECT", "HELP_RESET");
|
sendBauHelpGroup(sender);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register({"build","player"})
|
switch (args[1].toLowerCase()) {
|
||||||
public void buildPlayer(ProxiedPlayer player) {
|
case "admin":
|
||||||
printPage(ChatSender.of(player), "HELP_BAU_GROUP_PLAYER_TITLE", "HELP_SPEED", "HELP_NV", "HELP_WV", "HELP_DEBUGSTICK", "HELP_TRACE", "HELP_LOADER");
|
case "owner":
|
||||||
}
|
case "bauwelt":
|
||||||
|
sender.system("HELP_BAU_GROUP_ADMIN_TITLE");
|
||||||
@Register({"build","worldedit"})
|
sendBauHelp(sender);
|
||||||
@Register({"build","we"})
|
return;
|
||||||
@Register({"build","world-edit"})
|
case "world":
|
||||||
@Register({"build","edit"})
|
printPage(sender, "HELP_BAU_GROUP_WORLD_TITLE", "HELP_TNT", "HELP_FIRE", "HELP_FREEZE", "HELP_TPSLIMIT", "HELP_PROTECT", "HELP_RESET");
|
||||||
public void buildWorldedit(ProxiedPlayer player) {
|
return;
|
||||||
printPage(ChatSender.of(player), "HELP_BAU_GROUP_WE_TITLE", "HELP_WE_POS1", "HELP_WE_POS2", "HELP_WE_COPY", "HELP_WE_PASTE", "HELP_WE_FLOPY", "HELP_WE_FLOPYP", "HELP_WE_ROTATE_90", "HELP_WE_ROTATE_180", "HELP_WE_ROTATE_N90");
|
case "player":
|
||||||
}
|
printPage(sender, "HELP_BAU_GROUP_PLAYER_TITLE", "HELP_SPEED", "HELP_NV", "HELP_WV", "HELP_DEBUGSTICK", "HELP_TRACE", "HELP_LOADER");
|
||||||
|
return;
|
||||||
@Register({"build","other"})
|
case "worldedit":
|
||||||
public void buildOther(ProxiedPlayer player) {
|
case "we":
|
||||||
ChatSender sender = ChatSender.of(player);
|
case "world-edit":
|
||||||
|
case "edit":
|
||||||
|
printPage(sender, "HELP_BAU_GROUP_WE_TITLE", "HELP_WE_POS1", "HELP_WE_POS2", "HELP_WE_COPY", "HELP_WE_PASTE", "HELP_WE_FLOPY", "HELP_WE_FLOPYP", "HELP_WE_ROTATE_90", "HELP_WE_ROTATE_180", "HELP_WE_ROTATE_N90");
|
||||||
|
return;
|
||||||
|
case "other":
|
||||||
printPage(sender, "HELP_BAU_GROUP_OTHER_TITLE", "HELP_TESTBLOCK", "HELP_SKULL", "HELP_BAUINFO");
|
printPage(sender, "HELP_BAU_GROUP_OTHER_TITLE", "HELP_TESTBLOCK", "HELP_SKULL", "HELP_BAUINFO");
|
||||||
sender.prefixless("HELP_SCHEMSUBMIT", new Message("HELP_SCHEMSUBMIT_HOVER"), new ClickEvent(ClickEvent.Action.OPEN_URL, "https://www.youtube.com/watch?v=9QrQ3UBWveE"));
|
return;
|
||||||
|
default:
|
||||||
|
sendBauHelpGroup(sender);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register("build")
|
private static void sendBauHelpGroup(ChatSender sender) {
|
||||||
public void sendBauHelpGroup(ProxiedPlayer player) {
|
printPage(sender, ClickEvent.Action.RUN_COMMAND,
|
||||||
printPage(ChatSender.of(player), ClickEvent.Action.RUN_COMMAND,
|
"HELP_BAU_GROUP_ADMIN", "/help bau admin",
|
||||||
"HELP_BAU_GROUP_ADMIN", "/help build admin",
|
"HELP_BAU_GROUP_WORLD", "/help bau world",
|
||||||
"HELP_BAU_GROUP_WORLD", "/help build world",
|
"HELP_BAU_GROUP_PLAYER", "/help bau player",
|
||||||
"HELP_BAU_GROUP_PLAYER", "/help build player",
|
"HELP_BAU_GROUP_WE", "/help bau we",
|
||||||
"HELP_BAU_GROUP_WE", "/help build we",
|
"HELP_BAU_GROUP_OTHER", "/help bau other");
|
||||||
"HELP_BAU_GROUP_OTHER", "/help build other");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register("buildserver")
|
static void sendBauHelp(ChatSender sender) {
|
||||||
@Register({"build","admin"})
|
printPage(sender, ClickEvent.Action.SUGGEST_COMMAND,
|
||||||
@Register({"build","owner"})
|
"HELP_BAU_TP", "/bau tp ",
|
||||||
@Register({"build","bauwelt"})
|
"HELP_BAU_ADDMEMBER", "/bau addmember ",
|
||||||
public void sendBauHelp(ProxiedPlayer player) {
|
"HELP_BAU_DELMEMBER", "/bau delmember ",
|
||||||
printPage(ChatSender.of(player), ClickEvent.Action.SUGGEST_COMMAND,
|
"HELP_BAU_TOGGLEWE", "/bau togglewe ",
|
||||||
"HELP_BAU_TP", "/build tp ",
|
"HELP_BAU_TOGGLEWORLD", "/bau toggleworld ",
|
||||||
"HELP_BAU_ADDMEMBER", "/build addmember ",
|
"HELP_BAU_DELETE", "/bau delete ",
|
||||||
"HELP_BAU_DELMEMBER", "/build delmember ",
|
"HELP_BAU_TESTARENA", "/bau testarena ");
|
||||||
"HELP_BAU_SET_SPECTATOR", "/build setSpectator ",
|
|
||||||
"HELP_BAU_SET_BUILDER", "/build setBuilder ",
|
|
||||||
"HELP_BAU_SET_SUPERVISOR", "/build setSupervisor ",
|
|
||||||
"HELP_BAU_DELETE", "/build delete ",
|
|
||||||
"HELP_BAU_TESTARENA", "/build testarena ",
|
|
||||||
"HELP_BAU_LOCK", "/build lock ",
|
|
||||||
"HELP_BAU_UNLOCK", "/build unlock");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void printPage(ChatSender sender, ClickEvent.Action action, String... args) {
|
private static void printPage(ChatSender sender, ClickEvent.Action action, String... args) {
|
||||||
|
@ -22,21 +22,36 @@ package de.steamwar.bungeecore.commands;
|
|||||||
import de.steamwar.bungeecore.ArenaMode;
|
import de.steamwar.bungeecore.ArenaMode;
|
||||||
import de.steamwar.bungeecore.Message;
|
import de.steamwar.bungeecore.Message;
|
||||||
import de.steamwar.bungeecore.ServerStarter;
|
import de.steamwar.bungeecore.ServerStarter;
|
||||||
import de.steamwar.command.SWCommand;
|
import de.steamwar.bungeecore.Subserver;
|
||||||
|
import net.md_5.bungee.api.CommandSender;
|
||||||
import net.md_5.bungee.api.chat.ClickEvent;
|
import net.md_5.bungee.api.chat.ClickEvent;
|
||||||
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
|
||||||
|
|
||||||
public class HistoricCommand extends SWCommand {
|
import java.util.LinkedList;
|
||||||
|
|
||||||
|
public class HistoricCommand extends BasicCommand {
|
||||||
public HistoricCommand() {
|
public HistoricCommand() {
|
||||||
super("historic", null);
|
super("historic", null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register
|
@Override
|
||||||
public void historic(@Validator("arenaPlayer") ProxiedPlayer player, @Mapper("historicArenaMode") @OptionalValue("") @AllowNull ArenaMode arenaMode, @Mapper("arenaMap") @OptionalValue("") @AllowNull String map) {
|
public void execute(CommandSender sender, String[] args) {
|
||||||
FightCommand.createArena(player, "/historic ", true, arenaMode, map, true, (p, mode, m) -> {
|
FightCommand.createArena(sender, "/historic ", true, args, 0, true, (player, mode, map) -> {
|
||||||
new ServerStarter().arena(mode, m).blueLeader(p).callback(
|
Subserver arena = new ServerStarter().arena(mode, map).blueLeader(player).start();
|
||||||
arena -> Message.broadcast("HISTORIC_BROADCAST", "HISTORIC_BROADCAST_HOVER", new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/arena " + arena.getServer().getName()), mode.getDisplayName(), p.getName())
|
Message.broadcast("HISTORIC_BROADCAST", "HISTORIC_BROADCAST_HOVER"
|
||||||
).start();
|
, new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/arena " + arena.getServer().getName()), mode.getDisplayName(), player.getName());
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Iterable<String> onTabComplete(CommandSender commandSender, String[] args) {
|
||||||
|
if(args.length == 1){
|
||||||
|
return ArenaMode.getAllChatNames(true);
|
||||||
|
}else if(args.length == 2){
|
||||||
|
ArenaMode mode = ArenaMode.getByChat(args[1]);
|
||||||
|
if(mode == null)
|
||||||
|
return new LinkedList<>();
|
||||||
|
return mode.getMaps();
|
||||||
|
}
|
||||||
|
return new LinkedList<>();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -20,21 +20,34 @@
|
|||||||
package de.steamwar.bungeecore.commands;
|
package de.steamwar.bungeecore.commands;
|
||||||
|
|
||||||
import de.steamwar.bungeecore.Message;
|
import de.steamwar.bungeecore.Message;
|
||||||
import de.steamwar.command.SWCommand;
|
import de.steamwar.bungeecore.sql.IgnoreSystem;
|
||||||
import de.steamwar.sql.IgnoreSystem;
|
import de.steamwar.bungeecore.sql.SteamwarUser;
|
||||||
import de.steamwar.sql.SteamwarUser;
|
import net.md_5.bungee.api.CommandSender;
|
||||||
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
||||||
|
|
||||||
public class IgnoreCommand extends SWCommand {
|
public class IgnoreCommand extends BasicCommand {
|
||||||
|
|
||||||
public IgnoreCommand() {
|
public IgnoreCommand() {
|
||||||
super("ignore", null);
|
super("ignore", null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register(description = "USAGE_IGNORE")
|
@Override
|
||||||
public void genericCommand(ProxiedPlayer p, @ErrorMessage("UNKNOWN_PLAYER") SteamwarUser target) {
|
public void execute(CommandSender sender, String[] args) {
|
||||||
|
if(args.length < 1) {
|
||||||
|
Message.send("USAGE_IGNORE", sender);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(sender instanceof ProxiedPlayer))
|
||||||
|
return;
|
||||||
|
ProxiedPlayer p = (ProxiedPlayer) sender;
|
||||||
SteamwarUser user = SteamwarUser.get(p.getUniqueId());
|
SteamwarUser user = SteamwarUser.get(p.getUniqueId());
|
||||||
|
|
||||||
|
SteamwarUser target = SteamwarUser.get(args[0]);
|
||||||
|
if(target == null){
|
||||||
|
Message.send("UNKNOWN_PLAYER", p);
|
||||||
|
return;
|
||||||
|
}
|
||||||
if(target.equals(user)){
|
if(target.equals(user)){
|
||||||
Message.send("IGNORE_YOURSELF", p);
|
Message.send("IGNORE_YOURSELF", p);
|
||||||
return;
|
return;
|
||||||
|
@ -19,50 +19,75 @@
|
|||||||
|
|
||||||
package de.steamwar.bungeecore.commands;
|
package de.steamwar.bungeecore.commands;
|
||||||
|
|
||||||
import de.steamwar.bungeecore.Message;
|
import de.steamwar.bungeecore.*;
|
||||||
import de.steamwar.bungeecore.Subserver;
|
import de.steamwar.bungeecore.sql.BauweltMember;
|
||||||
import de.steamwar.command.SWCommand;
|
import net.md_5.bungee.api.CommandSender;
|
||||||
import de.steamwar.command.TypeValidator;
|
import net.md_5.bungee.api.ProxyServer;
|
||||||
import de.steamwar.sql.SteamwarUser;
|
|
||||||
import de.steamwar.sql.UserPerm;
|
|
||||||
import net.md_5.bungee.api.chat.ClickEvent;
|
import net.md_5.bungee.api.chat.ClickEvent;
|
||||||
|
import net.md_5.bungee.api.config.ServerInfo;
|
||||||
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
||||||
|
|
||||||
public class JoinmeCommand extends SWCommand {
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
public class JoinmeCommand extends BasicCommand {
|
||||||
|
|
||||||
public JoinmeCommand() {
|
public JoinmeCommand() {
|
||||||
super("joinme");
|
super("joinme", "");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register(description = "JOINME_USAGE")
|
@Override
|
||||||
public void genericCommand(ProxiedPlayer player) {
|
public void execute(CommandSender sender, String[] args) {
|
||||||
if (!SteamwarUser.get(player.getUniqueId()).hasPerm(UserPerm.TEAM)) {
|
if(sender instanceof ProxiedPlayer) {
|
||||||
Message.send("JOINME_USAGE", player);
|
ProxiedPlayer player = (ProxiedPlayer) sender;
|
||||||
|
|
||||||
|
if (args.length == 0 && player.hasPermission("bungeecore.joinme")) {
|
||||||
|
Message.broadcast("JOINME_BROADCAST", "JOINME_BROADCAST_HOVER"
|
||||||
|
, new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/join " + player.getName()), player.getName(), player.getServer().getInfo().getName());
|
||||||
|
} else if (args.length == 1) {
|
||||||
|
ProxiedPlayer target = ProxyServer.getInstance().getPlayer(args[0]);
|
||||||
|
if(target == null || !target.isConnected()){
|
||||||
|
Message.send("JOINME_PLAYER_OFFLINE", player);
|
||||||
return;
|
return;
|
||||||
}
|
}else if(target.equals(player)){
|
||||||
Message.broadcast("JOINME_BROADCAST", "JOINME_BROADCAST_HOVER",
|
|
||||||
new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/join " + player.getName()), player.getName(), player.getServer().getInfo().getName());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Register
|
|
||||||
public void genericCommand(ProxiedPlayer player, @Validator ProxiedPlayer target) {
|
|
||||||
if (target.equals(player)){
|
|
||||||
Message.send("JOINME_PLAYER_SELF", player);
|
Message.send("JOINME_PLAYER_SELF", player);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
ServerInfo server = target.getServer().getInfo();
|
||||||
|
String serverPerm = BungeeCore.serverPermissions.get(server.getName());
|
||||||
Subserver subserver = Subserver.getSubserver(target);
|
Subserver subserver = Subserver.getSubserver(target);
|
||||||
TpCommand.teleport(player, subserver != null ? subserver.getServer() : target.getServer().getInfo());
|
|
||||||
|
if(subserver != null) {
|
||||||
|
Servertype type = subserver.getType();
|
||||||
|
if (type == Servertype.ARENA) {
|
||||||
|
SubserverSystem.sendPlayer(subserver, player);
|
||||||
|
} else if (type == Servertype.BAUSERVER) {
|
||||||
|
Bauserver bauserver = (Bauserver) subserver;
|
||||||
|
if (bauserver.getOwner().equals(player.getUniqueId()) ||
|
||||||
|
BauweltMember.getBauMember(bauserver.getOwner(), player.getUniqueId()) != null) {
|
||||||
|
SubserverSystem.sendPlayer(subserver, player);
|
||||||
|
} else {
|
||||||
|
SubserverSystem.sendDeniedMessage(player, bauserver.getOwner());
|
||||||
|
Message.send("JOIN_PLAYER_BLOCK", player);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}else if(serverPerm != null && !player.hasPermission(serverPerm)){
|
||||||
|
Message.send("JOIN_PLAYER_BLOCK", player);
|
||||||
|
}else if(serverPerm == null && !player.getGroups().contains("team")) {
|
||||||
|
Message.send("JOIN_PLAYER_BLOCK", player);
|
||||||
|
}else{
|
||||||
|
player.connect(server);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Message.send("JOINME_USAGE", player);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ClassValidator(ProxiedPlayer.class)
|
@Override
|
||||||
public TypeValidator<ProxiedPlayer> playerMapper() {
|
public Iterable<String> onTabComplete(CommandSender commandSender, String[] args) {
|
||||||
return (sender, value, messageSender) -> {
|
if(args.length == 1){
|
||||||
if (value == null || !value.isConnected()) {
|
return allPlayers(args[0]);
|
||||||
messageSender.send("JOINME_PLAYER_OFFLINE", sender);
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
return true;
|
return new ArrayList<>();
|
||||||
};
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,26 +19,50 @@
|
|||||||
|
|
||||||
package de.steamwar.bungeecore.commands;
|
package de.steamwar.bungeecore.commands;
|
||||||
|
|
||||||
import de.steamwar.bungeecore.VelocityCore;
|
import de.steamwar.bungeecore.BungeeCore;
|
||||||
import de.steamwar.bungeecore.Message;
|
import de.steamwar.bungeecore.Message;
|
||||||
import de.steamwar.bungeecore.listeners.ConnectionListener;
|
|
||||||
import de.steamwar.command.SWCommand;
|
|
||||||
import net.md_5.bungee.api.CommandSender;
|
import net.md_5.bungee.api.CommandSender;
|
||||||
|
import net.md_5.bungee.api.ProxyServer;
|
||||||
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
||||||
|
|
||||||
public class KickCommand extends SWCommand {
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
public class KickCommand extends BasicCommand {
|
||||||
|
|
||||||
public KickCommand() {
|
public KickCommand() {
|
||||||
super("kick", ConnectionListener.KICK_PERMISSION);
|
super("kick", "bungeecore.kick");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register(description = "KICK_USAGE")
|
@Override
|
||||||
public void genericCommand(CommandSender sender, @ErrorMessage("KICK_OFFLINE") ProxiedPlayer target, String... message) {
|
public void execute(CommandSender sender, String[] args) {
|
||||||
if (message.length == 0) {
|
if(args.length == 0){
|
||||||
|
Message.send("KICK_USAGE", sender);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ProxiedPlayer target = ProxyServer.getInstance().getPlayer(args[0]);
|
||||||
|
if(target == null){
|
||||||
|
Message.send("KICK_OFFLINE", sender);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(args.length == 1){
|
||||||
target.disconnect(Message.parseToComponent("KICK_NORMAL", true, target));
|
target.disconnect(Message.parseToComponent("KICK_NORMAL", true, target));
|
||||||
} else {
|
}else{
|
||||||
target.disconnect(VelocityCore.stringToText(VelocityCore.CHAT_PREFIX + "§c" + String.join(" ", message)));
|
StringBuilder msgBuilder = new StringBuilder();
|
||||||
|
msgBuilder.append(BungeeCore.CHAT_PREFIX).append("§c");
|
||||||
|
for (int i = 1; i < args.length; i++){
|
||||||
|
msgBuilder.append(args[i]).append(" ");
|
||||||
|
}
|
||||||
|
target.disconnect(BungeeCore.stringToText(msgBuilder.toString()));
|
||||||
}
|
}
|
||||||
Message.send("KICK_CONFIRM", sender, target.getName());
|
Message.send("KICK_CONFIRM", sender, target.getName());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Iterable<String> onTabComplete(CommandSender commandSender, String[] args) {
|
||||||
|
if(args.length == 1)
|
||||||
|
return allPlayers(args[0]);
|
||||||
|
return new ArrayList<>();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -22,7 +22,6 @@ package de.steamwar.bungeecore.commands;
|
|||||||
import de.steamwar.bungeecore.Message;
|
import de.steamwar.bungeecore.Message;
|
||||||
import de.steamwar.bungeecore.Servertype;
|
import de.steamwar.bungeecore.Servertype;
|
||||||
import de.steamwar.bungeecore.Subserver;
|
import de.steamwar.bungeecore.Subserver;
|
||||||
import de.steamwar.command.SWCommand;
|
|
||||||
import net.md_5.bungee.api.CommandSender;
|
import net.md_5.bungee.api.CommandSender;
|
||||||
import net.md_5.bungee.api.ProxyServer;
|
import net.md_5.bungee.api.ProxyServer;
|
||||||
import net.md_5.bungee.api.config.ServerInfo;
|
import net.md_5.bungee.api.config.ServerInfo;
|
||||||
@ -34,7 +33,7 @@ import java.util.List;
|
|||||||
import java.util.TreeMap;
|
import java.util.TreeMap;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
public class ListCommand extends SWCommand {
|
public class ListCommand extends BasicCommand {
|
||||||
|
|
||||||
public ListCommand() {
|
public ListCommand() {
|
||||||
super("list", "");
|
super("list", "");
|
||||||
@ -61,8 +60,8 @@ public class ListCommand extends SWCommand {
|
|||||||
return playerMap;
|
return playerMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register
|
@Override
|
||||||
public void genericCommand(CommandSender commandSender) {
|
public void execute(CommandSender commandSender, String[] strings) {
|
||||||
TreeMap<String, List<ProxiedPlayer>> playerMap = getCustomTablist();
|
TreeMap<String, List<ProxiedPlayer>> playerMap = getCustomTablist();
|
||||||
for (String server : playerMap.navigableKeySet()) {
|
for (String server : playerMap.navigableKeySet()) {
|
||||||
String serverName = server;
|
String serverName = server;
|
||||||
|
@ -20,18 +20,20 @@
|
|||||||
package de.steamwar.bungeecore.commands;
|
package de.steamwar.bungeecore.commands;
|
||||||
|
|
||||||
import de.steamwar.bungeecore.listeners.ChatListener;
|
import de.steamwar.bungeecore.listeners.ChatListener;
|
||||||
import de.steamwar.command.SWCommand;
|
|
||||||
import net.md_5.bungee.api.CommandSender;
|
import net.md_5.bungee.api.CommandSender;
|
||||||
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
||||||
|
|
||||||
public class LocalCommand extends SWCommand {
|
public class LocalCommand extends BasicCommand {
|
||||||
|
|
||||||
public LocalCommand() {
|
public LocalCommand() {
|
||||||
super("local", null, "bc", "bauchat");
|
super("local", null, "bc", "bauchat");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register
|
@Override
|
||||||
public void genericCommand(ProxiedPlayer player, String... message) {
|
public void execute(CommandSender sender, String[] args) {
|
||||||
ChatListener.localChat(player, String.join(" ", message));
|
if(!(sender instanceof ProxiedPlayer))
|
||||||
|
return;
|
||||||
|
|
||||||
|
ChatListener.localChat((ProxiedPlayer) sender, String.join(" ", args));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,148 +0,0 @@
|
|||||||
/*
|
|
||||||
This file is a part of the SteamWar software.
|
|
||||||
|
|
||||||
Copyright (C) 2023 SteamWar.de-Serverteam
|
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU Affero General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU Affero General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Affero General Public License
|
|
||||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.steamwar.bungeecore.commands;
|
|
||||||
|
|
||||||
import de.steamwar.bungeecore.Message;
|
|
||||||
import de.steamwar.bungeecore.inventory.SWInventory;
|
|
||||||
import de.steamwar.bungeecore.inventory.SWItem;
|
|
||||||
import de.steamwar.bungeecore.inventory.SWListInv;
|
|
||||||
import de.steamwar.bungeecore.inventory.SWStreamInv;
|
|
||||||
import de.steamwar.bungeecore.listeners.ConnectionListener;
|
|
||||||
import de.steamwar.command.SWCommand;
|
|
||||||
import de.steamwar.sql.Mod;
|
|
||||||
import net.md_5.bungee.api.chat.ClickEvent;
|
|
||||||
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
public class ModCommand extends SWCommand {
|
|
||||||
|
|
||||||
public ModCommand() {
|
|
||||||
super("mod", ConnectionListener.MOD_PERMISSION, "mods");
|
|
||||||
}
|
|
||||||
|
|
||||||
public static final Map<ProxiedPlayer, Mod.ModType> playerFilterType = new HashMap<>();
|
|
||||||
|
|
||||||
@Register
|
|
||||||
public void genericCommand(ProxiedPlayer p) {
|
|
||||||
playerFilterType.putIfAbsent(p,Mod.ModType.UNKLASSIFIED);
|
|
||||||
openGui(p);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void openGui(ProxiedPlayer p) {
|
|
||||||
SWStreamInv<Mod> swStreamInv = new SWStreamInv<>(p,Message.parse("MOD_COMMAND_GUI_TITLE",p), (click, element) -> {
|
|
||||||
openClassificationGui(p,element);
|
|
||||||
},page -> {
|
|
||||||
Mod.ModType filtertype = playerFilterType.get(p);
|
|
||||||
return Mod.getAllModsFiltered(page,45, filtertype).stream().map(mod -> new SWListInv.SWListEntry<>(getModItem(mod),mod)).collect(Collectors.toList());
|
|
||||||
});
|
|
||||||
|
|
||||||
swStreamInv.addItem(52,new SWItem("NAME_TAG","Filter"), click -> {
|
|
||||||
swStreamInv.close();
|
|
||||||
openFilterGui(p);
|
|
||||||
});
|
|
||||||
|
|
||||||
swStreamInv.open();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void updateAndCloseGui(Mod.ModType modType, Mod mod, SWInventory toClose, ProxiedPlayer p) {
|
|
||||||
mod.setModType(modType);
|
|
||||||
toClose.close();
|
|
||||||
openGui(p);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void openFilterGui(ProxiedPlayer p) {
|
|
||||||
SWInventory inv = new SWInventory(p, 9, "Filter");
|
|
||||||
|
|
||||||
inv.addItem(1, new SWItem(Message.parse("MOD_UNCLASSIFIED",p),8), click -> playerFilterType.replace(p, Mod.ModType.UNKLASSIFIED));
|
|
||||||
inv.addItem(2, new SWItem(Message.parse("MOD_ALLOWED",p),2), click -> playerFilterType.replace(p, Mod.ModType.GREEN));
|
|
||||||
inv.addItem(3, new SWItem(Message.parse("MOD_FORBIDDEN",p), 11), click -> playerFilterType.replace(p, Mod.ModType.YELLOW));
|
|
||||||
inv.addItem(4, new SWItem(Message.parse("MOD_AUTOBAN",p),1), click -> playerFilterType.replace(p, Mod.ModType.RED));
|
|
||||||
inv.addItem(5, new SWItem(Message.parse("MOD_YT",p),13), click -> playerFilterType.replace(p, Mod.ModType.YOUTUBER_ONLY));
|
|
||||||
|
|
||||||
inv.addItem(8, new SWItem("ARROW", Message.parse("MOD_ITEM_BACK",p)), click -> {
|
|
||||||
inv.close();
|
|
||||||
openGui(p);
|
|
||||||
});
|
|
||||||
|
|
||||||
inv.open();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void openClassificationGui(ProxiedPlayer p,Mod element) {
|
|
||||||
SWInventory swInventory = new SWInventory(p,9,Message.parse("MOD_COMMAND_CLASSICIATION_GUI",p));
|
|
||||||
|
|
||||||
swInventory.addItem(2, new SWItem(Message.parse("MOD_UNCLASSIFIED",p),8), (click1 -> updateAndCloseGui(Mod.ModType.UNKLASSIFIED,element,swInventory,p)));
|
|
||||||
swInventory.addItem(3, new SWItem(Message.parse("MOD_ALLOWED",p), 2), (click1 -> updateAndCloseGui(Mod.ModType.GREEN,element,swInventory,p)));
|
|
||||||
swInventory.addItem(4, new SWItem(Message.parse("MOD_FORBIDDEN",p), 11), (click1 -> updateAndCloseGui(Mod.ModType.YELLOW,element,swInventory,p)));
|
|
||||||
swInventory.addItem(5, new SWItem(Message.parse("MOD_AUTOBAN",p),1), (click1 -> updateAndCloseGui(Mod.ModType.RED,element,swInventory,p)));
|
|
||||||
swInventory.addItem(6, new SWItem(Message.parse("MOD_YT",p), 13), (click1 -> updateAndCloseGui(Mod.ModType.YOUTUBER_ONLY,element,swInventory,p)));
|
|
||||||
|
|
||||||
swInventory.addItem(8,new SWItem("ARROW",Message.parse("MOD_ITEM_BACK",p)), click1 -> {
|
|
||||||
swInventory.close();
|
|
||||||
openGui(p);
|
|
||||||
});
|
|
||||||
|
|
||||||
swInventory.open();
|
|
||||||
}
|
|
||||||
|
|
||||||
private SWItem getModItem(Mod modEntry) {
|
|
||||||
SWItem item = new SWItem("NAME_TAG", modEntry.getModName());
|
|
||||||
|
|
||||||
item.addLore(modEntry.getPlatform().name());
|
|
||||||
|
|
||||||
return item;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Register(value = {"set"},description = "MOD_COMMAND_SET_USAGE")
|
|
||||||
public void set(ProxiedPlayer p,String modName,Mod.Platform platform,Mod.ModType newModType) {
|
|
||||||
Mod mod = Mod.get(modName, platform);
|
|
||||||
if(mod == null) {
|
|
||||||
Message.send("MOD_COMMAND_NOT_FOUND_IN_DATABASE",p,modName, platform.name());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
mod.setModType(newModType);
|
|
||||||
Message.send("MOD_CHANGED_TYPE",p,modName,platform.name(),newModType.name());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Register(value = {"get"},description = "MOD_COMMAND_GET_USAGE")
|
|
||||||
public void get(ProxiedPlayer p,String modName,Mod.Platform platform) {
|
|
||||||
Mod mod = Mod.get(modName, platform);
|
|
||||||
if(mod == null) {
|
|
||||||
Message.send("MOD_COMMAND_NOT_FOUND_IN_DATABASE", p, modName, platform.name());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Message.send("MOD_COMMAND_INFO", p, modName, platform.name(), mod.getModType().name());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Register(value = {"next"})
|
|
||||||
public void next(ProxiedPlayer p) {
|
|
||||||
Mod mod = Mod.findFirstMod();
|
|
||||||
if(mod == null) {
|
|
||||||
Message.send("MOD_NO_MORE_UNCLASSIFIED_MODS",p);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Message.send("MOD_FOUND_NEXT_MOD",p,"MOD_OPEN_GUI",new ClickEvent(ClickEvent.Action.RUN_COMMAND,""),mod.getModName(),mod.getPlatform().name());
|
|
||||||
}
|
|
||||||
}
|
|
@ -20,24 +20,35 @@
|
|||||||
package de.steamwar.bungeecore.commands;
|
package de.steamwar.bungeecore.commands;
|
||||||
|
|
||||||
import de.steamwar.bungeecore.listeners.ChatListener;
|
import de.steamwar.bungeecore.listeners.ChatListener;
|
||||||
import de.steamwar.sql.IgnoreSystem;
|
import de.steamwar.bungeecore.sql.IgnoreSystem;
|
||||||
import de.steamwar.command.SWCommand;
|
|
||||||
import de.steamwar.messages.ChatSender;
|
import de.steamwar.messages.ChatSender;
|
||||||
|
import net.md_5.bungee.api.CommandSender;
|
||||||
|
import net.md_5.bungee.api.ProxyServer;
|
||||||
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
import static de.steamwar.bungeecore.Storage.lastChats;
|
import static de.steamwar.bungeecore.Storage.lastChats;
|
||||||
|
|
||||||
public class MsgCommand extends SWCommand {
|
public class MsgCommand extends BasicCommand {
|
||||||
|
|
||||||
public MsgCommand() {
|
public MsgCommand() {
|
||||||
super("msg", "", "w", "tell");
|
super("msg", "", "w", "tell");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register(description = "MSG_USAGE")
|
@Override
|
||||||
public void genericCommand(ProxiedPlayer sender, @ErrorMessage(value = "MSG_OFFLINE") ProxiedPlayer target, @ErrorMessage(value = "MSG_USAGE", allowEAs = false) String... message) {
|
public void execute(CommandSender sender, String[] args) {
|
||||||
msg(sender, target, message);
|
if(!(sender instanceof ProxiedPlayer))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (args.length < 2) {
|
||||||
|
ChatSender.of(sender).system("MSG_USAGE");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
msg((ProxiedPlayer) sender, ProxyServer.getInstance().getPlayer(args[0]), Arrays.copyOfRange(args, 1, args.length));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void msg(ProxiedPlayer player, ProxiedPlayer target, String[] args) {
|
public static void msg(ProxiedPlayer player, ProxiedPlayer target, String[] args) {
|
||||||
@ -47,7 +58,7 @@ public class MsgCommand extends SWCommand {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (IgnoreSystem.isIgnored(target.getUniqueId(), player.getUniqueId())) {
|
if (IgnoreSystem.isIgnored(target, player)) {
|
||||||
sender.system("MSG_IGNORED");
|
sender.system("MSG_IGNORED");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -58,6 +69,14 @@ public class MsgCommand extends SWCommand {
|
|||||||
lastChats.put(target, player);
|
lastChats.put(target, player);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Iterable<String> onTabComplete(CommandSender commandSender, String[] args) {
|
||||||
|
if(args.length == 1){
|
||||||
|
return allPlayers(args[0]);
|
||||||
|
}
|
||||||
|
return new ArrayList<>();
|
||||||
|
}
|
||||||
|
|
||||||
public static void remove(ProxiedPlayer player){
|
public static void remove(ProxiedPlayer player){
|
||||||
lastChats.remove(player);
|
lastChats.remove(player);
|
||||||
}
|
}
|
||||||
|
@ -20,17 +20,20 @@
|
|||||||
package de.steamwar.bungeecore.commands;
|
package de.steamwar.bungeecore.commands;
|
||||||
|
|
||||||
import de.steamwar.bungeecore.Message;
|
import de.steamwar.bungeecore.Message;
|
||||||
import de.steamwar.command.SWCommand;
|
import net.md_5.bungee.api.CommandSender;
|
||||||
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
||||||
|
|
||||||
public class PingCommand extends SWCommand {
|
public class PingCommand extends BasicCommand {
|
||||||
|
|
||||||
public PingCommand() {
|
public PingCommand() {
|
||||||
super("ping");
|
super("ping", "");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register
|
@Override
|
||||||
public void genericCommand(ProxiedPlayer player) {
|
public void execute(CommandSender sender, String[] args) {
|
||||||
|
if(sender instanceof ProxiedPlayer){
|
||||||
|
ProxiedPlayer player = (ProxiedPlayer) sender;
|
||||||
Message.send("PING_RESPONSE", player, player.getPing());
|
Message.send("PING_RESPONSE", player, player.getPing());
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -20,25 +20,30 @@
|
|||||||
package de.steamwar.bungeecore.commands;
|
package de.steamwar.bungeecore.commands;
|
||||||
|
|
||||||
import de.steamwar.bungeecore.Message;
|
import de.steamwar.bungeecore.Message;
|
||||||
import de.steamwar.sql.SteamwarUser;
|
import de.steamwar.bungeecore.sql.SteamwarUser;
|
||||||
import de.steamwar.command.SWCommand;
|
import net.md_5.bungee.api.CommandSender;
|
||||||
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
||||||
|
import org.apache.commons.lang3.LocaleUtils;
|
||||||
|
|
||||||
|
import java.text.DecimalFormat;
|
||||||
import java.text.NumberFormat;
|
import java.text.NumberFormat;
|
||||||
|
import java.util.Locale;
|
||||||
|
|
||||||
public class PlaytimeCommand extends SWCommand {
|
public class PlaytimeCommand extends BasicCommand{
|
||||||
|
|
||||||
public PlaytimeCommand() {
|
public PlaytimeCommand() {
|
||||||
super("playtime");
|
super("playtime", null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register
|
@Override
|
||||||
public void genericCommand(ProxiedPlayer player) {
|
public void execute(CommandSender sender, String[] strings) {
|
||||||
SteamwarUser user = SteamwarUser.get(player.getUniqueId());
|
if(!(sender instanceof ProxiedPlayer))
|
||||||
NumberFormat format = NumberFormat.getNumberInstance(user.getLocale());
|
return;
|
||||||
format.setMaximumFractionDigits(2);
|
|
||||||
String formattedText = format.format((user.getOnlinetime() / (double) 3600));
|
|
||||||
|
|
||||||
Message.send("HOURS_PLAYED", player, formattedText);
|
NumberFormat format = NumberFormat.getNumberInstance(((ProxiedPlayer)sender).getLocale());
|
||||||
|
format.setMaximumFractionDigits(2);
|
||||||
|
String formattedText = format.format((SteamwarUser.get((ProxiedPlayer) sender).getOnlinetime() / (double) 3600));
|
||||||
|
|
||||||
|
Message.send("HOURS_PLAYED", sender, formattedText);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -21,28 +21,37 @@ package de.steamwar.bungeecore.commands;
|
|||||||
|
|
||||||
import de.steamwar.bungeecore.Message;
|
import de.steamwar.bungeecore.Message;
|
||||||
import de.steamwar.bungeecore.listeners.PollSystem;
|
import de.steamwar.bungeecore.listeners.PollSystem;
|
||||||
import de.steamwar.sql.PollAnswer;
|
import de.steamwar.bungeecore.sql.PollAnswer;
|
||||||
import de.steamwar.sql.SteamwarUser;
|
import de.steamwar.bungeecore.sql.SteamwarUser;
|
||||||
import de.steamwar.command.SWCommand;
|
import net.md_5.bungee.api.CommandSender;
|
||||||
import de.steamwar.command.TypeValidator;
|
|
||||||
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
||||||
|
|
||||||
public class PollCommand extends SWCommand {
|
public class PollCommand extends BasicCommand {
|
||||||
|
|
||||||
public PollCommand() {
|
public PollCommand() {
|
||||||
super("poll");
|
super("poll", "");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register
|
@Override
|
||||||
public void genericCommand(ProxiedPlayer player) {
|
public void execute(CommandSender sender, String[] args) {
|
||||||
|
if(!(sender instanceof ProxiedPlayer))
|
||||||
|
return;
|
||||||
|
|
||||||
|
ProxiedPlayer player = (ProxiedPlayer) sender;
|
||||||
|
|
||||||
|
if(PollSystem.noCurrentPoll()){
|
||||||
|
Message.send("POLL_NO_POLL", player);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(args.length == 0){
|
||||||
PollSystem.sendPoll(player);
|
PollSystem.sendPoll(player);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register(noTabComplete = true)
|
|
||||||
public void answerPoll(@Validator ProxiedPlayer player, String answerString) {
|
|
||||||
int answer;
|
int answer;
|
||||||
try {
|
try {
|
||||||
answer = Integer.parseUnsignedInt(answerString);
|
answer = Integer.parseUnsignedInt(args[0]);
|
||||||
if(answer < 1 || answer > PollSystem.answers())
|
if(answer < 1 || answer > PollSystem.answers())
|
||||||
throw new NumberFormatException();
|
throw new NumberFormatException();
|
||||||
}catch(NumberFormatException e){
|
}catch(NumberFormatException e){
|
||||||
@ -58,15 +67,4 @@ public class PollCommand extends SWCommand {
|
|||||||
|
|
||||||
pollAnswer.setAnswer(answer);
|
pollAnswer.setAnswer(answer);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ClassValidator(value = ProxiedPlayer.class, local = true)
|
|
||||||
public TypeValidator<ProxiedPlayer> noPoll() {
|
|
||||||
return (sender, value, messageSender) -> {
|
|
||||||
if(PollSystem.noCurrentPoll()){
|
|
||||||
messageSender.send("POLL_NO_POLL");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -20,38 +20,35 @@
|
|||||||
package de.steamwar.bungeecore.commands;
|
package de.steamwar.bungeecore.commands;
|
||||||
|
|
||||||
import de.steamwar.bungeecore.Message;
|
import de.steamwar.bungeecore.Message;
|
||||||
import de.steamwar.bungeecore.listeners.ConnectionListener;
|
|
||||||
import de.steamwar.bungeecore.listeners.PollSystem;
|
import de.steamwar.bungeecore.listeners.PollSystem;
|
||||||
import de.steamwar.sql.PollAnswer;
|
import de.steamwar.bungeecore.sql.PollAnswer;
|
||||||
import de.steamwar.command.SWCommand;
|
import net.md_5.bungee.api.CommandSender;
|
||||||
import de.steamwar.command.TypeValidator;
|
|
||||||
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
public class PollresultCommand extends SWCommand {
|
public class PollresultCommand extends BasicCommand {
|
||||||
|
|
||||||
public PollresultCommand() {
|
public PollresultCommand() {
|
||||||
super("pollresult", ConnectionListener.POLLRESULT_PERMISSION);
|
super("pollresult", "bungeecore.pollresults");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register
|
@Override
|
||||||
public void genericCommand(@Validator ProxiedPlayer player) {
|
public void execute(CommandSender sender, String[] strings) {
|
||||||
Map<Integer, Integer> voted = PollAnswer.getCurrentResults();
|
if(!(sender instanceof ProxiedPlayer))
|
||||||
Message.send("POLLRESULT_HEADER", player, voted.values().stream().reduce(Integer::sum).orElse(0), PollAnswer.getCurrentPoll());
|
return;
|
||||||
for (Map.Entry<Integer, Integer> e: voted.entrySet()) {
|
|
||||||
Message.send("POLLRESULT_LIST", player, PollSystem.getAnswer(e.getKey()), e.getValue());
|
if(PollSystem.noCurrentPoll()) {
|
||||||
}
|
Message.send("POLLRESULT_NOPOLL", sender);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ClassValidator(value = ProxiedPlayer.class, local = true)
|
ProxiedPlayer player = (ProxiedPlayer) sender;
|
||||||
public TypeValidator<ProxiedPlayer> noPoll() {
|
|
||||||
return (sender, value, messageSender) -> {
|
Map<String, Integer> voted = PollAnswer.getCurrentResults();
|
||||||
if (PollSystem.noCurrentPoll()) {
|
Message.send("POLLRESULT_HEADER", player, voted.values().stream().reduce(Integer::sum).orElse(0), PollSystem.getQuestion());
|
||||||
messageSender.send("POLL_NO_POLL");
|
for (Map.Entry<String, Integer> e: voted.entrySet()) {
|
||||||
return false;
|
Message.send("POLLRESULT_LIST", sender, e.getKey(), e.getValue());
|
||||||
}
|
}
|
||||||
return true;
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,228 +19,84 @@
|
|||||||
|
|
||||||
package de.steamwar.bungeecore.commands;
|
package de.steamwar.bungeecore.commands;
|
||||||
|
|
||||||
import com.google.gson.JsonParser;
|
|
||||||
import de.steamwar.bungeecore.VelocityCore;
|
|
||||||
import de.steamwar.bungeecore.Message;
|
import de.steamwar.bungeecore.Message;
|
||||||
import de.steamwar.bungeecore.listeners.ConnectionListener;
|
import de.steamwar.bungeecore.sql.Punishment;
|
||||||
import de.steamwar.bungeecore.listeners.IPSanitizer;
|
import de.steamwar.bungeecore.sql.SteamwarUser;
|
||||||
import de.steamwar.command.PreviousArguments;
|
|
||||||
import de.steamwar.command.SWCommand;
|
|
||||||
import de.steamwar.command.TypeMapper;
|
|
||||||
import de.steamwar.messages.ChatSender;
|
|
||||||
import de.steamwar.sql.BannedUserIPs;
|
|
||||||
import de.steamwar.sql.Punishment;
|
|
||||||
import de.steamwar.sql.SteamwarUser;
|
|
||||||
import de.steamwar.sql.UserPerm;
|
|
||||||
import net.md_5.bungee.BungeeCord;
|
|
||||||
import net.md_5.bungee.api.ChatMessageType;
|
|
||||||
import net.md_5.bungee.api.CommandSender;
|
import net.md_5.bungee.api.CommandSender;
|
||||||
import net.md_5.bungee.api.ProxyServer;
|
|
||||||
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.net.URL;
|
|
||||||
import java.sql.Timestamp;
|
import java.sql.Timestamp;
|
||||||
import java.text.ParseException;
|
import java.text.ParseException;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.time.Duration;
|
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.time.temporal.ChronoUnit;
|
import java.util.Date;
|
||||||
import java.util.*;
|
|
||||||
import java.util.logging.Level;
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
public class PunishmentCommand {
|
public class PunishmentCommand {
|
||||||
|
|
||||||
private static final String API_URL = "https://api.mojang.com/users/profiles/minecraft/";
|
|
||||||
private static final JsonParser jsonParser = new JsonParser();
|
|
||||||
|
|
||||||
public static SteamwarUser getOrCreateOfflinePlayer(String name) {
|
|
||||||
SteamwarUser user = SteamwarUser.get(name);
|
|
||||||
if (user != null) {
|
|
||||||
return user;
|
|
||||||
}
|
|
||||||
|
|
||||||
UUID uuid = getUUIDofOfflinePlayer(name);
|
|
||||||
if (uuid == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return SteamwarUser.getOrCreate(uuid, name, u -> {}, (o, n) -> {});
|
|
||||||
}
|
|
||||||
|
|
||||||
private static UUID getUUIDofOfflinePlayer(String playerName) {
|
|
||||||
try {
|
|
||||||
final URL url = new URL(API_URL + playerName);
|
|
||||||
String uuid = jsonParser.parse(new Scanner(url.openConnection().getInputStream()).nextLine()).getAsJsonObject().get("id").getAsString();
|
|
||||||
return UUID.fromString(uuid.replaceFirst("(\\w{8})(\\w{4})(\\w{4})(\\w{4})(\\w{12})", "$1-$2-$3-$4-$5"));
|
|
||||||
} catch (NoSuchElementException e) {
|
|
||||||
// ignore, player does not exist
|
|
||||||
} catch (IOException e) {
|
|
||||||
VelocityCore.get().getLogger().log(Level.SEVERE, "Could not get offline player UUID " + playerName, e);
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean isPunishedWithMessage(ChatSender player, Punishment.PunishmentType punishment) {
|
|
||||||
SteamwarUser user = player.user();
|
|
||||||
if (!user.isPunished(punishment)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
player.system(punishmentMessage(user, punishment));
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void ban(SteamwarUser user, Timestamp time, String banReason, SteamwarUser punisher, boolean perma) {
|
|
||||||
user.punish(Punishment.PunishmentType.Ban, time, banReason, punisher.getId(), perma);
|
|
||||||
|
|
||||||
ProxiedPlayer player = ProxyServer.getInstance().getPlayer(user.getUUID());
|
|
||||||
if (player != null) {
|
|
||||||
String ip = IPSanitizer.getTrueAddress(player.getPendingConnection()).getHostAddress();
|
|
||||||
ChatSender.disconnect(player).system(punishmentMessage(user, Punishment.PunishmentType.Ban));
|
|
||||||
for (BannedUserIPs banned : BannedUserIPs.get(ip)) {
|
|
||||||
SteamwarUser bannedUser = SteamwarUser.get(banned.getUserID());
|
|
||||||
if (bannedUser.isPunished(Punishment.PunishmentType.Ban) && bannedUser.getPunishment(Punishment.PunishmentType.Ban).getEndTime().before(time)) {
|
|
||||||
bannedUser.punish(Punishment.PunishmentType.Ban, time, banReason, punisher.getId(), perma);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
BannedUserIPs.banIP(user.getId(), ip);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Message punishmentMessage(SteamwarUser user, Punishment.PunishmentType punishment) {
|
|
||||||
Punishment currentPunishment = user.getPunishment(punishment);
|
|
||||||
if (currentPunishment.isPerma()) {
|
|
||||||
return new Message(punishment.getPlayerMessagePerma(), currentPunishment.getReason());
|
|
||||||
} else {
|
|
||||||
return new Message(punishment.getPlayerMessageUntil(), currentPunishment.getEndTime(), currentPunishment.getReason());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public PunishmentCommand(String command, Punishment.PunishmentType punishmentType) {
|
public PunishmentCommand(String command, Punishment.PunishmentType punishmentType) {
|
||||||
new SWCommand(command, ConnectionListener.BAN_PERMISSION) {
|
new BasicCommand(command, "bungeecore.ban") {
|
||||||
|
@Override
|
||||||
@Register
|
public void execute(CommandSender sender, String[] args) {
|
||||||
public void genericCommand(ProxiedPlayer player, @Mapper("toPunish") String toPunish, String date, @ErrorMessage(allowEAs = false, value = "PUNISHMENT_USAGE_REASON") String... message) {
|
if (punishmentType.isNeedsAdmin() && !SteamwarUser.get((ProxiedPlayer) sender).getUserGroup().isAdminGroup()) {
|
||||||
SteamwarUser punisher = SteamwarUser.get(player.getUniqueId());
|
return;
|
||||||
if (punishmentType.isNeedsAdmin() && !punisher.hasPerm(UserPerm.MODERATION)) {
|
}
|
||||||
|
if (args.length < 3) {
|
||||||
|
Message.send("PUNISHMENT_USAGE", sender, command);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
SteamwarUser target = unsafeUser(player, toPunish);
|
SteamwarUser target = unsafeUser(sender, args[0]);
|
||||||
if (target == null)
|
if (target == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
Timestamp banTime = parseTime(player, date);
|
Timestamp banTime = parseTime(sender, args[1]);
|
||||||
if (banTime == null)
|
if (banTime == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
boolean isPerma = date.equalsIgnoreCase("perma");
|
StringBuilder reason = new StringBuilder();
|
||||||
String msg = String.join(" ", message);
|
for (int i = 2; i < args.length; i++) {
|
||||||
if(punishmentType == Punishment.PunishmentType.Ban)
|
reason.append(args[i]).append(" ");
|
||||||
ban(target, banTime, msg, punisher, isPerma);
|
|
||||||
else
|
|
||||||
target.punish(punishmentType, banTime, msg, punisher.getId(), isPerma);
|
|
||||||
Message.team(punishmentType.getTeamMessage(), new Message("PREFIX"), target.getUserName(), player.getName(), new Message((isPerma ? "PUNISHMENT_PERMA" : "PUNISHMENT_UNTIL"), banTime), msg);
|
|
||||||
}
|
}
|
||||||
|
boolean isPerma = args[1].equalsIgnoreCase("perma");
|
||||||
@Register
|
String msg = reason.toString();
|
||||||
public void genericError(ProxiedPlayer player, String... args) {
|
target.punish(punishmentType, banTime, msg, SteamwarUser.get(sender.getName()).getId(), isPerma);
|
||||||
ChatSender.of(player).send(true, ChatMessageType.CHAT, null, null, new Message("PUNISHMENT_USAGE", command));
|
Message.team(punishmentType.getTeamMessage(), new Message("PREFIX"), target.getUserName(), sender.getName(), new Message((isPerma ? "PUNISHMENT_PERMA" : "PUNISHMENT_UNTIL"), banTime), msg);
|
||||||
}
|
|
||||||
|
|
||||||
@Mapper(value = "toPunish", local = true)
|
|
||||||
public TypeMapper<String> allUsers() {
|
|
||||||
return new TypeMapper<String>() {
|
|
||||||
@Override
|
|
||||||
public String map(CommandSender commandSender, String[] previousArguments, String s) {
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Collection<String> tabCompletes(CommandSender sender, PreviousArguments previousArguments, String s) {
|
|
||||||
List<String> players = BungeeCord.getInstance().getPlayers().stream()
|
|
||||||
.map(CommandSender::getName)
|
|
||||||
.collect(Collectors.toList());
|
|
||||||
players.add(s);
|
|
||||||
return players;
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
if (punishmentType.getUnpunishmentMessage() == null) {
|
||||||
};
|
|
||||||
|
|
||||||
if (punishmentType.getUnpunishmentMessage() == null) return;
|
|
||||||
String antiCommand = "un" + command;
|
|
||||||
new SWCommand(antiCommand, ConnectionListener.BAN_PERMISSION) {
|
|
||||||
@Register
|
|
||||||
public void genericCommand(ProxiedPlayer player, @ErrorMessage("UNKNOWN_PLAYER") SteamwarUser target) {
|
|
||||||
if (punishmentType.isNeedsAdmin() && !SteamwarUser.get(player.getUniqueId()).hasPerm(UserPerm.MODERATION)) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
String antiCommand = "un" + command;
|
||||||
|
new BasicCommand(antiCommand, "bungeecore.ban") {
|
||||||
|
@Override
|
||||||
|
public void execute(CommandSender sender, String[] args) {
|
||||||
|
if (punishmentType.isNeedsAdmin() && !SteamwarUser.get((ProxiedPlayer) sender).getUserGroup().isAdminGroup()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (args.length < 1) {
|
||||||
|
Message.send("UNPUNISHMENT_USAGE", sender, antiCommand);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
SteamwarUser target = existingUser(sender, args[0]);
|
||||||
|
if (target == null)
|
||||||
|
return;
|
||||||
|
|
||||||
if (!target.isPunished(punishmentType)) {
|
if (!target.isPunished(punishmentType)) {
|
||||||
Message.send(punishmentType.getUsageNotPunished(), player);
|
Message.send(punishmentType.getUsageNotPunished(), sender);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Message.send(punishmentType.getUnpunishmentMessage(), player, target.getUserName());
|
Message.send(punishmentType.getUnpunishmentMessage(), sender, target.getUserName());
|
||||||
target.punish(punishmentType, Timestamp.from(new Date().toInstant()), antiCommand, SteamwarUser.get(player.getName()).getId(), false);
|
target.punish(punishmentType, Timestamp.from(new Date().toInstant()), antiCommand, SteamwarUser.get(sender.getName()).getId(), false);
|
||||||
if(punishmentType == Punishment.PunishmentType.Ban)
|
|
||||||
BannedUserIPs.unbanIPs(target.getId());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Register
|
|
||||||
public void genericError(ProxiedPlayer player, String... args) {
|
|
||||||
ChatSender.of(player).send(true, ChatMessageType.CHAT, null, null, new Message("UNPUNISHMENT_USAGE", antiCommand));
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
protected SteamwarUser unsafeUser(CommandSender sender, String arg){
|
|
||||||
SteamwarUser target = getOrCreateOfflinePlayer(arg);
|
|
||||||
if(target == null)
|
|
||||||
Message.send("UNKNOWN_PLAYER", sender);
|
|
||||||
return target;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Pattern RELATIVE_PATTERN = Pattern.compile("([1-9]\\d*[hdwmy])+");
|
|
||||||
|
|
||||||
public static Timestamp parseTime(CommandSender sender, String arg) {
|
public static Timestamp parseTime(CommandSender sender, String arg) {
|
||||||
if (arg.equalsIgnoreCase("perma")) {
|
if (arg.equalsIgnoreCase("perma")) {
|
||||||
return Punishment.PERMA_TIME;
|
return Punishment.PERMA_TIME;
|
||||||
} else {
|
} else {
|
||||||
if (RELATIVE_PATTERN.matcher(arg).matches()) {
|
|
||||||
Instant instant = Instant.now();
|
|
||||||
StringBuilder st = new StringBuilder();
|
|
||||||
for (int i = 0; i < arg.length(); i++) {
|
|
||||||
char c = arg.charAt(i);
|
|
||||||
if (c >= '0' && c <= '9') {
|
|
||||||
st.append(c);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
int amount = Integer.parseInt(st.toString());
|
|
||||||
st = new StringBuilder();
|
|
||||||
switch (c) {
|
|
||||||
case 'h':
|
|
||||||
instant = instant.plus(amount, ChronoUnit.HOURS);
|
|
||||||
break;
|
|
||||||
case 'd':
|
|
||||||
instant = instant.plus(amount, ChronoUnit.DAYS);
|
|
||||||
break;
|
|
||||||
case 'w':
|
|
||||||
instant = instant.plus(Duration.ofSeconds(amount * ChronoUnit.WEEKS.getDuration().getSeconds()));
|
|
||||||
break;
|
|
||||||
case 'm':
|
|
||||||
instant = instant.plus(Duration.ofSeconds(amount * ChronoUnit.MONTHS.getDuration().getSeconds()));
|
|
||||||
break;
|
|
||||||
case 'y':
|
|
||||||
instant = instant.plus(Duration.ofSeconds(amount * ChronoUnit.YEARS.getDuration().getSeconds()));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return Timestamp.from(instant);
|
|
||||||
}
|
|
||||||
SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy_HH:mm");
|
SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy_HH:mm");
|
||||||
try {
|
try {
|
||||||
Date parsedDate = dateFormat.parse(arg);
|
Date parsedDate = dateFormat.parse(arg);
|
||||||
|
@ -19,19 +19,28 @@
|
|||||||
|
|
||||||
package de.steamwar.bungeecore.commands;
|
package de.steamwar.bungeecore.commands;
|
||||||
|
|
||||||
import de.steamwar.command.SWCommand;
|
import de.steamwar.messages.ChatSender;
|
||||||
|
import net.md_5.bungee.api.CommandSender;
|
||||||
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
||||||
|
|
||||||
import static de.steamwar.bungeecore.Storage.lastChats;
|
import static de.steamwar.bungeecore.Storage.lastChats;
|
||||||
|
|
||||||
public class RCommand extends SWCommand {
|
public class RCommand extends BasicCommand {
|
||||||
|
|
||||||
public RCommand() {
|
public RCommand() {
|
||||||
super("r", "", "reply");
|
super("r", "", "reply");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register(description = "R_USAGE")
|
@Override
|
||||||
public void genericCommand(ProxiedPlayer player, @ErrorMessage(value = "R_USAGE", allowEAs = false) String... message) {
|
public void execute(CommandSender sender, String[] args) {
|
||||||
MsgCommand.msg(player, lastChats.get(player), message);
|
if(!(sender instanceof ProxiedPlayer))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if(args.length == 0){
|
||||||
|
ChatSender.of(sender).system("R_USAGE");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
MsgCommand.msg((ProxiedPlayer) sender, lastChats.get(sender), args);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -21,49 +21,50 @@ package de.steamwar.bungeecore.commands;
|
|||||||
|
|
||||||
import de.steamwar.bungeecore.ArenaMode;
|
import de.steamwar.bungeecore.ArenaMode;
|
||||||
import de.steamwar.bungeecore.Message;
|
import de.steamwar.bungeecore.Message;
|
||||||
import de.steamwar.command.SWCommand;
|
import de.steamwar.bungeecore.sql.SteamwarUser;
|
||||||
import de.steamwar.command.SWCommandUtils;
|
import de.steamwar.bungeecore.sql.UserElo;
|
||||||
import de.steamwar.command.TypeMapper;
|
import net.md_5.bungee.api.CommandSender;
|
||||||
import de.steamwar.sql.SteamwarUser;
|
|
||||||
import de.steamwar.sql.UserElo;
|
|
||||||
import net.md_5.bungee.BungeeCord;
|
|
||||||
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
||||||
|
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
public class RankCommand extends SWCommand {
|
public class RankCommand extends BasicCommand {
|
||||||
|
|
||||||
public RankCommand() {
|
public RankCommand() {
|
||||||
super("rank");
|
super("rank", null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register
|
@Override
|
||||||
public void ownRank(ProxiedPlayer player) {
|
public void execute(CommandSender sender, String[] args) {
|
||||||
rank(player, SteamwarUser.get(player.getUniqueId()));
|
if(!(sender instanceof ProxiedPlayer))
|
||||||
}
|
return;
|
||||||
|
|
||||||
@Register
|
ProxiedPlayer player = (ProxiedPlayer) sender;
|
||||||
public void rank(ProxiedPlayer player, @ErrorMessage("RANK_PLAYER_NOT_FOUND") SteamwarUser user) {
|
SteamwarUser user = SteamwarUser.get(player.getUniqueId());
|
||||||
if (!player.getName().equals(user.getUserName())) {
|
if (args.length > 0) {
|
||||||
Message.sendPrefixless("RANK_PLAYER_FOUND", player, user.getUserName());
|
SteamwarUser nUser = SteamwarUser.get(args[0]);
|
||||||
|
if (nUser == null) {
|
||||||
|
Message.send("RANK_PLAYER_NOT_FOUND", player);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Message.send("RANK_PLAYER_FOUND", player, nUser.getUserName());
|
||||||
|
user = nUser;
|
||||||
}
|
}
|
||||||
|
|
||||||
for(ArenaMode mode : ArenaMode.getAllModes()) {
|
for(ArenaMode mode : ArenaMode.getAllModes()) {
|
||||||
if (!mode.isRanked())
|
if (!mode.isRanked())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
Message.send("RANK_HEADER", player, mode.getChatName());
|
||||||
|
|
||||||
Optional<Integer> elo = UserElo.getElo(user.getId(), mode.getSchemType());
|
Optional<Integer> elo = UserElo.getElo(user.getId(), mode.getSchemType());
|
||||||
String eloString;
|
|
||||||
if (elo.isPresent()) {
|
if (elo.isPresent()) {
|
||||||
int placement = UserElo.getPlacement(elo.get(), mode.getSchemType());
|
int placement = UserElo.getPlacement(elo.get(), mode.getSchemType());
|
||||||
eloString = Message.parse("RANK_PLACED", player, placement, elo.get());
|
Message.send("RANK_PLACED", player, placement, elo.get());
|
||||||
} else {
|
} else {
|
||||||
eloString = Message.parse("RANK_UNPLACED", player);
|
Message.send("RANK_UNPLACED", player);
|
||||||
}
|
}
|
||||||
|
Message.send("RANK_EMBLEM", player, UserElo.getEmblemProgression(player, mode.getChatName(), user.getId()));
|
||||||
Message.sendPrefixless("RANK_HEADER", player, mode.getChatName(), eloString);
|
|
||||||
Message.sendPrefixless("RANK_EMBLEM", player, UserElo.getEmblemProgression(mode.getChatName(), user.getId()));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -20,23 +20,25 @@
|
|||||||
package de.steamwar.bungeecore.commands;
|
package de.steamwar.bungeecore.commands;
|
||||||
|
|
||||||
import de.steamwar.bungeecore.Message;
|
import de.steamwar.bungeecore.Message;
|
||||||
import de.steamwar.command.SWCommand;
|
import net.md_5.bungee.api.CommandSender;
|
||||||
import net.md_5.bungee.api.chat.ClickEvent;
|
import net.md_5.bungee.api.chat.ClickEvent;
|
||||||
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
||||||
|
|
||||||
public class RegelnCommand extends SWCommand {
|
public class RegelnCommand extends BasicCommand {
|
||||||
public RegelnCommand() {
|
public RegelnCommand() {
|
||||||
super("regeln", null, "rules");
|
super("regeln", null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register
|
@Override
|
||||||
public void genericCommand(ProxiedPlayer player) {
|
public void execute(CommandSender sender, String[] args) {
|
||||||
|
if(!(sender instanceof ProxiedPlayer))
|
||||||
|
return;
|
||||||
|
ProxiedPlayer player = (ProxiedPlayer) sender;
|
||||||
|
|
||||||
Message.send("REGELN_RULES", player);
|
Message.send("REGELN_RULES", player);
|
||||||
Message.sendPrefixless("REGELN_AS", player, Message.parse("REGELN_AS_HOVER", player), new ClickEvent(ClickEvent.Action.OPEN_URL, Message.parse("REGELN_AS_URL", player)));
|
Message.sendPrefixless("REGELN_AS", player, Message.parse("REGELN_AS_HOVER", player), new ClickEvent(ClickEvent.Action.OPEN_URL, Message.parse("REGELN_AS_URL", player)));
|
||||||
Message.sendPrefixless("REGELN_MWG", player, Message.parse("REGELN_MWG_HOVER", player), new ClickEvent(ClickEvent.Action.OPEN_URL, Message.parse("REGELN_MWG_URL", player)));
|
Message.sendPrefixless("REGELN_MWG", player, Message.parse("REGELN_MWG_HOVER", player), new ClickEvent(ClickEvent.Action.OPEN_URL, Message.parse("REGELN_MWG_URL", player)));
|
||||||
Message.sendPrefixless("REGELN_WG", player, Message.parse("REGELN_WG_HOVER", player), new ClickEvent(ClickEvent.Action.OPEN_URL, Message.parse("REGELN_WG_URL", player)));
|
Message.sendPrefixless("REGELN_WG", player, Message.parse("REGELN_WG_HOVER", player), new ClickEvent(ClickEvent.Action.OPEN_URL, Message.parse("REGELN_WG_URL", player)));
|
||||||
Message.sendPrefixless("REGELN_WS", player, Message.parse("REGELN_WS_HOVER", player), new ClickEvent(ClickEvent.Action.OPEN_URL, Message.parse("REGELN_WS_URL", player)));
|
Message.sendPrefixless("REGELN_WS", player, Message.parse("REGELN_WS_HOVER", player), new ClickEvent(ClickEvent.Action.OPEN_URL, Message.parse("REGELN_WS_URL", player)));
|
||||||
Message.sendPrefixless("REGELN_QG", player, Message.parse("REGELN_QG_HOVER", player), new ClickEvent(ClickEvent.Action.OPEN_URL, Message.parse("REGELN_QG_URL", player)));
|
|
||||||
Message.sendPrefixless("REGELN_CONDUCT", player, Message.parse("REGELN_CONDUCT_HOVER", player), new ClickEvent(ClickEvent.Action.OPEN_URL, Message.parse("REGELN_CONDUCT_URL", player)));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -23,44 +23,45 @@ import de.steamwar.bungeecore.*;
|
|||||||
import de.steamwar.bungeecore.inventory.SWItem;
|
import de.steamwar.bungeecore.inventory.SWItem;
|
||||||
import de.steamwar.bungeecore.inventory.SWListInv;
|
import de.steamwar.bungeecore.inventory.SWListInv;
|
||||||
import de.steamwar.bungeecore.inventory.SWStreamInv;
|
import de.steamwar.bungeecore.inventory.SWStreamInv;
|
||||||
import de.steamwar.sql.*;
|
import de.steamwar.bungeecore.sql.Fight;
|
||||||
import de.steamwar.command.SWCommand;
|
import de.steamwar.bungeecore.sql.Punishment;
|
||||||
|
import de.steamwar.bungeecore.sql.SchematicType;
|
||||||
|
import de.steamwar.bungeecore.sql.SteamwarUser;
|
||||||
import de.steamwar.messages.ChatSender;
|
import de.steamwar.messages.ChatSender;
|
||||||
|
import net.md_5.bungee.api.CommandSender;
|
||||||
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
public class ReplayCommand extends SWCommand {
|
public class ReplayCommand extends BasicCommand {
|
||||||
|
|
||||||
public ReplayCommand() {
|
public ReplayCommand() {
|
||||||
super("replay");
|
super("replay", null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register
|
@Override
|
||||||
public void genericCommand(ProxiedPlayer player, @OptionalValue("") String optionalMap) {
|
public void execute(CommandSender s, String[] args) {
|
||||||
|
if(!(s instanceof ProxiedPlayer))
|
||||||
|
return;
|
||||||
|
ProxiedPlayer player = (ProxiedPlayer) s;
|
||||||
|
|
||||||
ChatSender sender = ChatSender.of(player);
|
ChatSender sender = ChatSender.of(player);
|
||||||
if (PunishmentCommand.isPunishedWithMessage(sender, Punishment.PunishmentType.NoFightServer))
|
if (sender.user().isPunishedWithMessage(sender, Punishment.PunishmentType.NoFightServer))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
new SWStreamInv<>(player, Message.parse("REPLAY_TITLE", player), (click, fight) -> {
|
new SWStreamInv<>(player, Message.parse("REPLAY_TITLE", player), (click, fight) -> {
|
||||||
SteamwarUser user = SteamwarUser.get(player.getUniqueId());
|
SteamwarUser user = SteamwarUser.get(player.getUniqueId());
|
||||||
ArenaMode mode = ArenaMode.getBySchemType(fight.getSchemType());
|
ArenaMode mode = fight.getGameMode();
|
||||||
ServerStarter starter = new ServerStarter().replay(fight.getFightID()).blueLeader(player);
|
ServerStarter starter = new ServerStarter().replay(fight.getFightID()).blueLeader(player);
|
||||||
|
|
||||||
String map = mode.getRandomMap();
|
if (user.getUserGroup().isAdminGroup() && click.isShiftClick() && fight.replayExists()) {
|
||||||
if (!optionalMap.equals("")) {
|
starter.test(mode, mode.getRandomMap(), player).start();
|
||||||
String tMap = mode.hasMap(optionalMap);
|
|
||||||
if (tMap != null) map = tMap;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (user.hasPerm(UserPerm.MODERATION) && click.isShiftClick() && fight.replayExists()) {
|
|
||||||
starter.test(mode, map, player).start();
|
|
||||||
} else if(!fight.replayAllowed()) {
|
} else if(!fight.replayAllowed()) {
|
||||||
sender.system("REPLAY_UNAVAILABLE");
|
sender.system("REPLAY_UNAVAILABLE");
|
||||||
} else {
|
} else {
|
||||||
starter.arena(mode, map).start();
|
starter.arena(mode, mode.getRandomMap()).start();
|
||||||
}
|
}
|
||||||
}, page -> Fight.getPage(page, 45).stream().map(fight -> new SWListInv.SWListEntry<>(getFightItem(sender, fight), fight)).collect(Collectors.toList())).open();
|
}, page -> Fight.getPage(page, 45).stream().map(fight -> new SWListInv.SWListEntry<>(getFightItem(sender, fight), fight)).collect(Collectors.toList())).open();
|
||||||
}
|
}
|
||||||
|
@ -19,23 +19,26 @@
|
|||||||
|
|
||||||
package de.steamwar.bungeecore.commands;
|
package de.steamwar.bungeecore.commands;
|
||||||
|
|
||||||
import de.steamwar.command.SWCommand;
|
import net.md_5.bungee.api.CommandSender;
|
||||||
import net.md_5.bungee.api.ProxyServer;
|
import net.md_5.bungee.api.ProxyServer;
|
||||||
import net.md_5.bungee.api.config.ServerInfo;
|
import net.md_5.bungee.api.config.ServerInfo;
|
||||||
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
||||||
|
|
||||||
public class ServerSwitchCommand extends SWCommand {
|
public class ServerSwitchCommand extends BasicCommand {
|
||||||
|
|
||||||
private final String serverName;
|
private String serverName;
|
||||||
|
|
||||||
public ServerSwitchCommand(String cmd, String name, String... aliases) {
|
public ServerSwitchCommand(String cmd, String name, String permission, String... aliases) {
|
||||||
super(cmd, null, aliases);
|
super(cmd, permission, aliases);
|
||||||
serverName = name;
|
serverName = name;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register
|
@Override
|
||||||
public void genericCommand(ProxiedPlayer player) {
|
public void execute(CommandSender sender, String[] strings) {
|
||||||
|
if(sender instanceof ProxiedPlayer){
|
||||||
|
ProxiedPlayer player = (ProxiedPlayer) sender;
|
||||||
ServerInfo target = ProxyServer.getInstance().getServerInfo(serverName);
|
ServerInfo target = ProxyServer.getInstance().getServerInfo(serverName);
|
||||||
player.connect(target);
|
player.connect(target);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -20,19 +20,23 @@
|
|||||||
package de.steamwar.bungeecore.commands;
|
package de.steamwar.bungeecore.commands;
|
||||||
|
|
||||||
import de.steamwar.bungeecore.listeners.ChatListener;
|
import de.steamwar.bungeecore.listeners.ChatListener;
|
||||||
import de.steamwar.bungeecore.listeners.ConnectionListener;
|
|
||||||
import de.steamwar.command.SWCommand;
|
|
||||||
import de.steamwar.messages.ChatSender;
|
import de.steamwar.messages.ChatSender;
|
||||||
import net.md_5.bungee.api.CommandSender;
|
import net.md_5.bungee.api.CommandSender;
|
||||||
|
|
||||||
public class ServerTeamchatCommand extends SWCommand {
|
public class ServerTeamchatCommand extends BasicCommand {
|
||||||
|
|
||||||
public ServerTeamchatCommand() {
|
public ServerTeamchatCommand() {
|
||||||
super("stc", ConnectionListener.TEAMCHAT_PERMISSION,"serverteamchat");
|
super("stc", "bungeecore.teamchat","serverteamchat");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register(description = "STC_USAGE")
|
@Override
|
||||||
public void genericCommand(CommandSender commandSender, @ErrorMessage(value = "STC_USAGE", allowEAs = false) String... message) {
|
public void execute(CommandSender s, String[] args) {
|
||||||
ChatListener.sendChat(ChatSender.of(commandSender), ChatSender.serverteamReceivers(), "CHAT_SERVERTEAM", null, String.join(" ", message));
|
ChatSender sender = ChatSender.of(s);
|
||||||
|
if(args.length == 0) {
|
||||||
|
sender.system("STC_USAGE");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ChatListener.sendChat(sender, ChatSender.serverteamReceivers(), "CHAT_SERVERTEAM", null, String.join(" ", args));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,25 +19,25 @@
|
|||||||
|
|
||||||
package de.steamwar.bungeecore.commands;
|
package de.steamwar.bungeecore.commands;
|
||||||
|
|
||||||
import de.steamwar.bungeecore.network.NetworkSender;
|
|
||||||
import de.steamwar.command.SWCommand;
|
|
||||||
import de.steamwar.messages.ChatSender;
|
import de.steamwar.messages.ChatSender;
|
||||||
import de.steamwar.network.packets.server.LocaleInvalidationPacket;
|
import net.md_5.bungee.api.CommandSender;
|
||||||
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
||||||
|
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
public class SetLocaleCommand extends SWCommand {
|
public class SetLocaleCommand extends BasicCommand {
|
||||||
|
|
||||||
public SetLocaleCommand() {
|
public SetLocaleCommand() {
|
||||||
super("setlocale", null, "setlanguage");
|
super("setlocale", null, "setlanguage");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register
|
@Override
|
||||||
public void genericCommand(ProxiedPlayer player) {
|
public void execute(CommandSender s, String[] strings) {
|
||||||
ChatSender sender = ChatSender.of(player);
|
if (!(s instanceof ProxiedPlayer))
|
||||||
sender.user().setLocale(Objects.requireNonNull(player.getLocale()), true);
|
return;
|
||||||
NetworkSender.send(player, new LocaleInvalidationPacket(sender.user().getId()));
|
|
||||||
|
ChatSender sender = ChatSender.of(s);
|
||||||
|
sender.user().setLocale(Objects.requireNonNull(((ProxiedPlayer) s).getLocale()), true);
|
||||||
sender.system("LOCK_LOCALE_CHANGED");
|
sender.system("LOCK_LOCALE_CHANGED");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -21,7 +21,6 @@ package de.steamwar.bungeecore.commands;
|
|||||||
|
|
||||||
import de.steamwar.bungeecore.Message;
|
import de.steamwar.bungeecore.Message;
|
||||||
import de.steamwar.bungeecore.Node;
|
import de.steamwar.bungeecore.Node;
|
||||||
import de.steamwar.command.SWCommand;
|
|
||||||
import net.md_5.bungee.api.CommandSender;
|
import net.md_5.bungee.api.CommandSender;
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
import java.io.BufferedReader;
|
||||||
@ -29,14 +28,14 @@ import java.io.InputStreamReader;
|
|||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
public class StatCommand extends SWCommand {
|
public class StatCommand extends BasicCommand {
|
||||||
|
|
||||||
public StatCommand() {
|
public StatCommand() {
|
||||||
super("stat", "bungeecore.softreload", "stats");
|
super("stat", "bungeecore.softreload", "stats");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register
|
@Override
|
||||||
public void genericCommand(CommandSender sender) {
|
public void execute(CommandSender sender, String[] args) {
|
||||||
Map<String, Integer> serverCount = new HashMap<>();
|
Map<String, Integer> serverCount = new HashMap<>();
|
||||||
try {
|
try {
|
||||||
Process process = new ProcessBuilder("ps", "x").start();
|
Process process = new ProcessBuilder("ps", "x").start();
|
||||||
@ -44,7 +43,7 @@ public class StatCommand extends SWCommand {
|
|||||||
if (!s.contains("--port"))
|
if (!s.contains("--port"))
|
||||||
return;
|
return;
|
||||||
serverCount.compute(
|
serverCount.compute(
|
||||||
s.contains("ssh -L") ? s.substring(s.indexOf("ssh -L") + 6).split(" ")[2] : "sw",
|
s.contains("ssh -L") ? s.substring(s.indexOf("ssh -L") + 6).split(" ")[2] : "local",
|
||||||
(server, count) -> (count != null ? count : 0) + 1
|
(server, count) -> (count != null ? count : 0) + 1
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
@ -52,6 +51,7 @@ public class StatCommand extends SWCommand {
|
|||||||
throw new SecurityException(e.getMessage(), e);
|
throw new SecurityException(e.getMessage(), e);
|
||||||
}
|
}
|
||||||
|
|
||||||
Node.forEach(node -> Message.send("STAT_SERVER", sender, node.getName(), node.belowLoadLimit(), serverCount.getOrDefault(node.getName(), 0)));
|
Node.forEach(node -> Message.send("STAT_SERVER", sender, node.getName(), node.getLoad(), serverCount.getOrDefault(node.getName(), 0)));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -23,17 +23,14 @@ import de.steamwar.bungeecore.Message;
|
|||||||
import de.steamwar.bungeecore.Storage;
|
import de.steamwar.bungeecore.Storage;
|
||||||
import de.steamwar.bungeecore.inventory.SWItem;
|
import de.steamwar.bungeecore.inventory.SWItem;
|
||||||
import de.steamwar.bungeecore.inventory.SWListInv;
|
import de.steamwar.bungeecore.inventory.SWListInv;
|
||||||
import de.steamwar.command.PreviousArguments;
|
import de.steamwar.bungeecore.sql.*;
|
||||||
import de.steamwar.command.SWCommand;
|
|
||||||
import de.steamwar.command.TypeMapper;
|
|
||||||
import de.steamwar.command.TypeValidator;
|
|
||||||
import de.steamwar.messages.ChatSender;
|
import de.steamwar.messages.ChatSender;
|
||||||
import de.steamwar.sql.*;
|
import io.netty.channel.ConnectTimeoutException;
|
||||||
import net.md_5.bungee.BungeeCord;
|
import net.md_5.bungee.BungeeCord;
|
||||||
|
import net.md_5.bungee.UserConnection;
|
||||||
import net.md_5.bungee.api.ChatColor;
|
import net.md_5.bungee.api.ChatColor;
|
||||||
import net.md_5.bungee.api.CommandSender;
|
import net.md_5.bungee.api.CommandSender;
|
||||||
import net.md_5.bungee.api.ProxyServer;
|
import net.md_5.bungee.api.ProxyServer;
|
||||||
import net.md_5.bungee.api.ServerConnectRequest;
|
|
||||||
import net.md_5.bungee.api.chat.ClickEvent;
|
import net.md_5.bungee.api.chat.ClickEvent;
|
||||||
import net.md_5.bungee.api.chat.ComponentBuilder;
|
import net.md_5.bungee.api.chat.ComponentBuilder;
|
||||||
import net.md_5.bungee.api.chat.HoverEvent;
|
import net.md_5.bungee.api.chat.HoverEvent;
|
||||||
@ -45,13 +42,15 @@ import net.md_5.bungee.api.event.ServerConnectEvent;
|
|||||||
import java.net.*;
|
import java.net.*;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.time.format.DateTimeFormatter;
|
import java.time.format.DateTimeFormatter;
|
||||||
import java.util.*;
|
import java.util.ArrayList;
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
import java.util.stream.Stream;
|
|
||||||
|
|
||||||
import static de.steamwar.bungeecore.Storage.teamInvitations;
|
import static de.steamwar.bungeecore.Storage.teamInvitations;
|
||||||
|
|
||||||
public class TeamCommand extends SWCommand {
|
public class TeamCommand extends BasicCommand {
|
||||||
|
|
||||||
private static final List<SWListInv.SWListEntry<String>> COLOR_CODES = new ArrayList<>();
|
private static final List<SWListInv.SWListEntry<String>> COLOR_CODES = new ArrayList<>();
|
||||||
|
|
||||||
@ -79,17 +78,16 @@ public class TeamCommand extends SWCommand {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public TeamCommand() {
|
public TeamCommand() {
|
||||||
super("team");
|
super("team", "");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register(noTabComplete = true)
|
private void help(CommandSender sender){
|
||||||
public void help(CommandSender sender, String... args){
|
|
||||||
Message.send("TEAM_HELP_HEADER", sender);
|
Message.send("TEAM_HELP_HEADER", sender);
|
||||||
Message.send("TEAM_HELP_LIST", sender);
|
Message.send("TEAM_HELP_LIST", sender);
|
||||||
Message.send("TEAM_HELP_INFO", sender);
|
Message.send("TEAM_HELP_INFO", sender);
|
||||||
|
Message.send("TEAM_HELP_TP", sender);
|
||||||
if(!(sender instanceof ProxiedPlayer))
|
if(!(sender instanceof ProxiedPlayer))
|
||||||
return;
|
return;
|
||||||
Message.send("TEAM_HELP_TP", sender);
|
|
||||||
|
|
||||||
ProxiedPlayer player = (ProxiedPlayer) sender;
|
ProxiedPlayer player = (ProxiedPlayer) sender;
|
||||||
SteamwarUser user = SteamwarUser.get(player.getUniqueId());
|
SteamwarUser user = SteamwarUser.get(player.getUniqueId());
|
||||||
@ -114,26 +112,95 @@ public class TeamCommand extends SWCommand {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register(value = "create", description = "TEAM_CREATE_USAGE")
|
@Override
|
||||||
public void create(@Validator("isNotInTeam") ProxiedPlayer player, @Length(min = 2, max = 4) @ErrorMessage("TEAM_KUERZEL_LENGTH") String kuerzel, @Length(min = 4, max = 15) @ErrorMessage("TEAM_NAME_LENGTH") String name){
|
public void execute(CommandSender sender, String[] args){
|
||||||
|
if(args.length < 1){
|
||||||
|
help(sender);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!(sender instanceof ProxiedPlayer))
|
||||||
|
return;
|
||||||
|
|
||||||
|
ProxiedPlayer player = (ProxiedPlayer) sender;
|
||||||
SteamwarUser user = SteamwarUser.get(player.getUniqueId());
|
SteamwarUser user = SteamwarUser.get(player.getUniqueId());
|
||||||
Team team = Team.get(user.getTeam());
|
Team team = Team.get(user.getTeam());
|
||||||
|
|
||||||
if(checkTeamKuerzel(player, team, kuerzel))
|
switch(args[0].toLowerCase()){
|
||||||
return;
|
case "create":
|
||||||
|
create(player, user, team, args);
|
||||||
if(checkTeamName(player, team, name))
|
break;
|
||||||
return;
|
case "join":
|
||||||
|
join(player, user, args);
|
||||||
Team.create(kuerzel, name);
|
break;
|
||||||
user.setTeam(Team.get(kuerzel).getTeamId());
|
case "stepback":
|
||||||
user.setLeader(true);
|
stepBack(player,user,team);
|
||||||
Message.send("TEAM_CREATE_CREATED", player, name);
|
break;
|
||||||
|
case "leave":
|
||||||
|
leave(player, user, team);
|
||||||
|
break;
|
||||||
|
case "invite":
|
||||||
|
invite(player, user, team, args);
|
||||||
|
break;
|
||||||
|
case "remove":
|
||||||
|
remove(player, user, team, args);
|
||||||
|
break;
|
||||||
|
case "changekuerzel":
|
||||||
|
changekuerzel(player, user, team, args);
|
||||||
|
break;
|
||||||
|
case "changename":
|
||||||
|
changename(player, user, team, args);
|
||||||
|
break;
|
||||||
|
case "promote":
|
||||||
|
promote(player, user, team, args);
|
||||||
|
break;
|
||||||
|
case "changecolor":
|
||||||
|
changeColor(player, user, team);
|
||||||
|
break;
|
||||||
|
case "info":
|
||||||
|
info(player, user, team, args);
|
||||||
|
break;
|
||||||
|
case "list":
|
||||||
|
list(player, args);
|
||||||
|
break;
|
||||||
|
case "event":
|
||||||
|
event(player, user, team, args);
|
||||||
|
break;
|
||||||
|
case "tp":
|
||||||
|
tp(player, user, team, args);
|
||||||
|
break;
|
||||||
|
case "server":
|
||||||
|
server(player, user, team, args);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
help(player);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register("join")
|
private void create(ProxiedPlayer player, SteamwarUser user, Team team, String[] args){
|
||||||
public void join(@Validator("isNotInTeam") ProxiedPlayer player, String... args){
|
if(unwantedInTeam(player, user))
|
||||||
SteamwarUser user = SteamwarUser.get(player.getUniqueId());
|
return;
|
||||||
|
|
||||||
|
if(args.length < 3){
|
||||||
|
Message.send("TEAM_CREATE_USAGE", player);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(checkTeamKuerzel(player, team, args[1]))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if(checkTeamName(player, team, args[2]))
|
||||||
|
return;
|
||||||
|
|
||||||
|
Team.create(args[1], args[2]);
|
||||||
|
user.setTeam(Team.get(args[1]).getTeamId());
|
||||||
|
user.setLeader(true);
|
||||||
|
Message.send("TEAM_CREATE_CREATED", player, args[2]);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void join(ProxiedPlayer player, SteamwarUser user, String[] args){
|
||||||
|
if(unwantedInTeam(player, user))
|
||||||
|
return;
|
||||||
|
|
||||||
if(notDuringEvent(player))
|
if(notDuringEvent(player))
|
||||||
return;
|
return;
|
||||||
@ -149,7 +216,7 @@ public class TeamCommand extends SWCommand {
|
|||||||
if(invs.size() == 1){
|
if(invs.size() == 1){
|
||||||
t = invs.get(0);
|
t = invs.get(0);
|
||||||
}else{
|
}else{
|
||||||
if(args.length != 1){
|
if(args.length != 2){
|
||||||
Message.send("TEAM_JOIN_USAGE", player);
|
Message.send("TEAM_JOIN_USAGE", player);
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
for(int inv : invs){
|
for(int inv : invs){
|
||||||
@ -162,7 +229,7 @@ public class TeamCommand extends SWCommand {
|
|||||||
|
|
||||||
for(int inv : invs){
|
for(int inv : invs){
|
||||||
Team team = Team.get(inv);
|
Team team = Team.get(inv);
|
||||||
if(team.getTeamName().equals(args[0])){
|
if(team.getTeamName().equals(args[1])){
|
||||||
t = inv;
|
t = inv;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -179,12 +246,11 @@ public class TeamCommand extends SWCommand {
|
|||||||
Message.send("TEAM_JOIN_JOINED", player, Team.get(t).getTeamName());
|
Message.send("TEAM_JOIN_JOINED", player, Team.get(t).getTeamName());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register("stepback")
|
private void stepBack(ProxiedPlayer player, SteamwarUser user, Team team) {
|
||||||
public void stepBack(@Validator("isLeader") ProxiedPlayer player) {
|
if(notLeader(player, user, team))
|
||||||
SteamwarUser user = SteamwarUser.get(player.getUniqueId());
|
return;
|
||||||
Team team = Team.get(user.getTeam());
|
|
||||||
|
|
||||||
if(noRemainingLeaders(team, user)){
|
if(team.size() > 1 && team.getMembers().stream().map(SteamwarUser::get).filter(member -> user != member).noneMatch(SteamwarUser::isLeader)){
|
||||||
Message.send("TEAM_OTHER_LEADER_REQUIRED", player);
|
Message.send("TEAM_OTHER_LEADER_REQUIRED", player);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -193,13 +259,12 @@ public class TeamCommand extends SWCommand {
|
|||||||
Message.send("TEAM_STEP_BACK", player);
|
Message.send("TEAM_STEP_BACK", player);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register("leave")
|
private void leave(ProxiedPlayer player, SteamwarUser user, Team team){
|
||||||
public void leave(@Validator("isInTeam") ProxiedPlayer player){
|
if(notInTeam(player, user))
|
||||||
SteamwarUser user = SteamwarUser.get(player.getUniqueId());
|
return;
|
||||||
Team team = Team.get(user.getTeam());
|
|
||||||
|
|
||||||
int teamSize = team.size();
|
int teamSize = team.size();
|
||||||
if(teamSize > 1 && user.isLeader() && noRemainingLeaders(team, user)) {
|
if(teamSize > 1 && user.isLeader() && team.getMembers().stream().map(SteamwarUser::get).filter(member -> user != member).noneMatch(SteamwarUser::isLeader)){
|
||||||
Message.send("TEAM_OTHER_LEADER_REQUIRED", player);
|
Message.send("TEAM_OTHER_LEADER_REQUIRED", player);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -213,19 +278,20 @@ public class TeamCommand extends SWCommand {
|
|||||||
Message.send("TEAM_LEAVE_LEFT", player);
|
Message.send("TEAM_LEAVE_LEFT", player);
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean noRemainingLeaders(Team team, SteamwarUser except) {
|
|
||||||
return SteamwarUser.getTeam(team.getTeamId()).stream().filter(member -> except.getId() != member.getId()).noneMatch(SteamwarUser::isLeader);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
private void invite(ProxiedPlayer player, SteamwarUser user, Team team, String[] args){
|
||||||
@Register(value = "invite", description = "TEAM_INVITE_USAGE")
|
if(notLeader(player, user, team))
|
||||||
public void invite(@Validator("isLeader") ProxiedPlayer player, @AllowNull SteamwarUser target){
|
return;
|
||||||
SteamwarUser user = SteamwarUser.get(player.getUniqueId());
|
|
||||||
Team team = Team.get(user.getTeam());
|
|
||||||
|
|
||||||
if(notDuringEvent(player))
|
if(notDuringEvent(player))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if(args.length != 2){
|
||||||
|
Message.send("TEAM_INVITE_USAGE", player);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
SteamwarUser target = SteamwarUser.get(args[1]);
|
||||||
if(target == null){
|
if(target == null){
|
||||||
Message.send("TEAM_INVITE_NO_PLAYER", player);
|
Message.send("TEAM_INVITE_NO_PLAYER", player);
|
||||||
return;
|
return;
|
||||||
@ -244,17 +310,22 @@ public class TeamCommand extends SWCommand {
|
|||||||
|
|
||||||
teamInvitations.get(target.getId()).add(team.getTeamId());
|
teamInvitations.get(target.getId()).add(team.getTeamId());
|
||||||
|
|
||||||
Message.send("TEAM_INVITE_INVITED", player, target.getUserName());
|
Message.send("TEAM_INVITE_INVITED", player, args[1]);
|
||||||
ProxiedPlayer p = ProxyServer.getInstance().getPlayer(target.getUUID());
|
ProxiedPlayer p = ProxyServer.getInstance().getPlayer(target.getUuid());
|
||||||
if(p != null)
|
if(p != null)
|
||||||
Message.send("TEAM_INVITE_INVITED_TARGET", p, team.getTeamColor(), team.getTeamName());
|
Message.send("TEAM_INVITE_INVITED_TARGET", p, team.getTeamColor(), team.getTeamName());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register(value = "remove", description = "TEAM_REMOVE_USAGE")
|
private void remove(ProxiedPlayer player, SteamwarUser user, Team team, String[] args){
|
||||||
public void remove(@Validator("isLeader") ProxiedPlayer player, @AllowNull @Mapper("memberList") SteamwarUser target){
|
if(notLeader(player, user, team))
|
||||||
SteamwarUser user = SteamwarUser.get(player.getUniqueId());
|
return;
|
||||||
Team team = Team.get(user.getTeam());
|
|
||||||
|
|
||||||
|
if(args.length != 2){
|
||||||
|
Message.send("TEAM_REMOVE_USAGE", player);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
SteamwarUser target = SteamwarUser.get(args[1]);
|
||||||
if(target == null){
|
if(target == null){
|
||||||
Message.send("TEAM_REMOVE_NOT_PLAYER", player);
|
Message.send("TEAM_REMOVE_NOT_PLAYER", player);
|
||||||
return;
|
return;
|
||||||
@ -284,71 +355,64 @@ public class TeamCommand extends SWCommand {
|
|||||||
target.setTeam(0);
|
target.setTeam(0);
|
||||||
|
|
||||||
Message.send("TEAM_REMOVE_REMOVED", player);
|
Message.send("TEAM_REMOVE_REMOVED", player);
|
||||||
ProxiedPlayer p = ProxyServer.getInstance().getPlayer(target.getUUID());
|
ProxiedPlayer p = ProxyServer.getInstance().getPlayer(target.getUuid());
|
||||||
if(p != null)
|
if(p != null)
|
||||||
Message.send("TEAM_REMOVE_REMOVED_TARGET", player);
|
Message.send("TEAM_REMOVE_REMOVED_TARGET", player);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Mapper(value = "memberList", local = true)
|
private void changekuerzel(ProxiedPlayer player, SteamwarUser user, Team team, String[] args){
|
||||||
public TypeMapper<SteamwarUser> memberList() {
|
if(notLeader(player, user, team))
|
||||||
return new TypeMapper<SteamwarUser>() {
|
return;
|
||||||
@Override
|
|
||||||
public SteamwarUser map(CommandSender commandSender, String[] previousArguments, String s) {
|
|
||||||
return SteamwarUser.get(s);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Collection<String> tabCompletes(CommandSender sender, PreviousArguments previousArguments, String s) {
|
|
||||||
if (!(sender instanceof ProxiedPlayer)) return Collections.emptyList();
|
|
||||||
ProxiedPlayer player = (ProxiedPlayer) sender;
|
|
||||||
Team team = Team.get(SteamwarUser.get(player.getUniqueId()).getTeam());
|
|
||||||
return team.getMembers().stream()
|
|
||||||
.map(SteamwarUser::get)
|
|
||||||
.map(SteamwarUser::getUserName)
|
|
||||||
.collect(Collectors.toList());
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
@Register(value = "changekurzel", description = "TEAM_KUERZEL_USAGE")
|
|
||||||
public void changekuerzel(@Validator("isLeader") ProxiedPlayer player, @Length(min = 2, max = 4) @ErrorMessage("TEAM_KUERZEL_LENGTH") String kuerzel){
|
|
||||||
SteamwarUser user = SteamwarUser.get(player.getUniqueId());
|
|
||||||
Team team = Team.get(user.getTeam());
|
|
||||||
|
|
||||||
if(notDuringEvent(player))
|
if(notDuringEvent(player))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if(checkTeamKuerzel(player, team, kuerzel))
|
if(args.length < 2){
|
||||||
|
Message.send("TEAM_KUERZEL_USAGE", player);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(checkTeamKuerzel(player, team, args[1]))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
team.setTeamKuerzel(kuerzel);
|
team.setTeamKuerzel(args[1]);
|
||||||
Message.send("TEAM_KUERZEL_CHANGED", player);
|
Message.send("TEAM_KUERZEL_CHANGED", player);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register(value = "changename", description = "TEAM_NAME_USAGE")
|
private void changename(ProxiedPlayer player, SteamwarUser user, Team team, String[] args){
|
||||||
public void changename(@Validator("isLeader") ProxiedPlayer player, @Length(min = 4, max = 15) @ErrorMessage("TEAM_NAME_LENGTH") String name){
|
if(notLeader(player, user, team))
|
||||||
SteamwarUser user = SteamwarUser.get(player.getUniqueId());
|
return;
|
||||||
Team team = Team.get(user.getTeam());
|
|
||||||
|
|
||||||
if(notDuringEvent(player))
|
if(notDuringEvent(player))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if(checkTeamName(player, team, name))
|
if(args.length < 2){
|
||||||
|
Message.send("TEAM_NAME_USAGE", player);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(checkTeamName(player, team, args[1]))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
team.setTeamName(name);
|
team.setTeamName(args[1]);
|
||||||
Message.send("TEAM_NAME_CHANGED", player);
|
Message.send("TEAM_NAME_CHANGED", player);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register(value = "promote", description = "TEAM_LEADER_USAGE")
|
private void promote(ProxiedPlayer player, SteamwarUser user, Team team, String[] args){
|
||||||
public void promote(@Validator("isLeader") ProxiedPlayer player, @AllowNull @Mapper("memberList") SteamwarUser target){
|
if(notLeader(player, user, team))
|
||||||
SteamwarUser user = SteamwarUser.get(player.getUniqueId());
|
return;
|
||||||
|
|
||||||
if(notDuringEvent(player))
|
if(notDuringEvent(player))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if(args.length < 2){
|
||||||
|
Message.send("TEAM_LEADER_USAGE", player);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
SteamwarUser target = SteamwarUser.get(args[1]);
|
||||||
if(target == null){
|
if(target == null){
|
||||||
Message.send("TEAM_LEADER_NOT_USER", player);
|
Message.send("TEAM_LEADER_NOT_USER", player, args[1]);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -358,33 +422,36 @@ public class TeamCommand extends SWCommand {
|
|||||||
}
|
}
|
||||||
|
|
||||||
target.setLeader(true);
|
target.setLeader(true);
|
||||||
Message.send("TEAM_LEADER_PROMOTED", player, target.getUserName());
|
Message.send("TEAM_LEADER_PROMOTED", player, args[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
private String playerName(SteamwarUser user){
|
private String playerName(SteamwarUser user){
|
||||||
return ProxyServer.getInstance().getPlayer(user.getUUID()) != null ? "§a" + user.getUserName() : "§e" + user.getUserName();
|
return ProxyServer.getInstance().getPlayer(user.getUuid()) != null ? "§a" + user.getUserName() : "§e" + user.getUserName();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register("info")
|
private void info(ProxiedPlayer player, SteamwarUser user, Team team, String[] args){
|
||||||
public void info(@Validator("isInTeam") ProxiedPlayer player){
|
if(args.length == 1 && user.getTeam() == 0){
|
||||||
SteamwarUser user = SteamwarUser.get(player.getUniqueId());
|
Message.send("TEAM_INFO_USAGE", player);
|
||||||
Team team = Team.get(user.getTeam());
|
return;
|
||||||
info(player, team);
|
}else if(user.getTeam() == 0 || args.length == 2){
|
||||||
|
team = Team.get(args[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(team == null){
|
||||||
|
Message.send("UNKNOWN_TEAM", player);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register(value = "info", description = "TEAM_INFO_USAGE")
|
|
||||||
public void info(ProxiedPlayer player, @ErrorMessage("UNKNOWN_TEAM") Team team){
|
|
||||||
SteamwarUser user = SteamwarUser.get(player.getUniqueId());
|
|
||||||
Message.sendPrefixless("TEAM_INFO_TEAM", player, team.getTeamName(), team.getTeamColor(), team.getTeamKuerzel());
|
Message.sendPrefixless("TEAM_INFO_TEAM", player, team.getTeamName(), team.getTeamColor(), team.getTeamKuerzel());
|
||||||
|
|
||||||
List<SteamwarUser> users = team.getMembers().stream().map(SteamwarUser::get).collect(Collectors.toList());
|
List<SteamwarUser> users = team.getMembers().stream().map(SteamwarUser::get).collect(Collectors.toList());
|
||||||
|
|
||||||
Message.sendPrefixless("TEAM_INFO_LEADER", player, users.stream().filter(SteamwarUser::isLeader).count(), getMemberList(users, true));
|
Message.sendPrefixless("TEAM_INFO_LEADER", player, getMemberList(users, true));
|
||||||
|
|
||||||
String members = getMemberList(users, false);
|
String members = getMemberList(users, false);
|
||||||
|
|
||||||
if(members.length() > 0) {
|
if(members.length() > 0) {
|
||||||
Message.sendPrefixless("TEAM_INFO_MEMBER", player, users.stream().filter(u -> !u.isLeader()).count(), members);
|
Message.sendPrefixless("TEAM_INFO_MEMBER", player, members);
|
||||||
}
|
}
|
||||||
|
|
||||||
Set<Event> events = TeamTeilnahme.getEvents(team.getTeamId());
|
Set<Event> events = TeamTeilnahme.getEvents(team.getTeamId());
|
||||||
@ -403,10 +470,21 @@ public class TeamCommand extends SWCommand {
|
|||||||
return sb.toString();
|
return sb.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register("list")
|
private void list(ProxiedPlayer player, String[] args){
|
||||||
public void list(ProxiedPlayer player, @Min(intValue = 1) @OptionalValue("1") @ErrorMessage("TEAM_LIST_NOT_PAGE") int page){
|
|
||||||
final int TEAMS_PER_PAGE = 10;
|
final int TEAMS_PER_PAGE = 10;
|
||||||
|
|
||||||
|
int page;
|
||||||
|
if(args.length > 1){
|
||||||
|
try{
|
||||||
|
page = Integer.parseInt(args[1]);
|
||||||
|
}catch(NumberFormatException e){
|
||||||
|
Message.send("TEAM_LIST_NOT_PAGE", player);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}else
|
||||||
|
page = 1;
|
||||||
|
|
||||||
List<Team> all = Team.getAll();
|
List<Team> all = Team.getAll();
|
||||||
final int lastPage = ((all.size() - 1) / 10) + 1;
|
final int lastPage = ((all.size() - 1) / 10) + 1;
|
||||||
if(page < 1 || page > lastPage){
|
if(page < 1 || page > lastPage){
|
||||||
@ -443,11 +521,11 @@ public class TeamCommand extends SWCommand {
|
|||||||
player.sendMessage(beforePage);
|
player.sendMessage(beforePage);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register("event")
|
private void event(ProxiedPlayer player, SteamwarUser user, Team team, String[] args){
|
||||||
public void event(@Validator("isInTeam") ProxiedPlayer player) {
|
if(notInTeam(player, user))
|
||||||
SteamwarUser user = SteamwarUser.get(player.getUniqueId());
|
return;
|
||||||
Team team = Team.get(user.getTeam());
|
|
||||||
|
|
||||||
|
if(args.length < 2){
|
||||||
Message.send("TEAM_EVENT_USAGE", player);
|
Message.send("TEAM_EVENT_USAGE", player);
|
||||||
Set<Event> events = TeamTeilnahme.getEvents(team.getTeamId());
|
Set<Event> events = TeamTeilnahme.getEvents(team.getTeamId());
|
||||||
if(!events.isEmpty()){
|
if(!events.isEmpty()){
|
||||||
@ -456,16 +534,21 @@ public class TeamCommand extends SWCommand {
|
|||||||
for(Event e : events)
|
for(Event e : events)
|
||||||
Message.sendPrefixless("TEAM_EVENT_EVENT", player, e.getStart().toLocalDateTime().format(dateFormat), e.getEventName());
|
Message.sendPrefixless("TEAM_EVENT_EVENT", player, e.getStart().toLocalDateTime().format(dateFormat), e.getEventName());
|
||||||
}
|
}
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register("event")
|
if(notLeader(player, user, team))
|
||||||
public void event(@Validator("isLeader") ProxiedPlayer player, Event event){
|
return;
|
||||||
SteamwarUser user = SteamwarUser.get(player.getUniqueId());
|
|
||||||
Team team = Team.get(user.getTeam());
|
|
||||||
|
|
||||||
if(notDuringEvent(player))
|
if(notDuringEvent(player))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
Event event = Event.get(args[1]);
|
||||||
|
if(event == null){
|
||||||
|
Message.send("TEAM_EVENT_NO_EVENT", player);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if(Instant.now().isAfter(event.getDeadline().toInstant())){
|
if(Instant.now().isAfter(event.getDeadline().toInstant())){
|
||||||
Message.send("TEAM_EVENT_OVER", player);
|
Message.send("TEAM_EVENT_OVER", player);
|
||||||
return;
|
return;
|
||||||
@ -481,62 +564,50 @@ public class TeamCommand extends SWCommand {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register("tp")
|
private void tp(ProxiedPlayer player, SteamwarUser user, Team team, String[] args){
|
||||||
public void tp(@Validator("isInTeam") ProxiedPlayer player) {
|
if(args.length == 1){
|
||||||
SteamwarUser user = SteamwarUser.get(player.getUniqueId());
|
if(notInTeam(player, user))
|
||||||
Team team = Team.get(user.getTeam());
|
return;
|
||||||
tp(player, team);
|
tp(player, team);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Team targetTeam = Team.get(args[1]);
|
||||||
|
if(targetTeam == null){
|
||||||
|
Message.send("TEAM_TP_NO_TEAM", player);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
tp(player, targetTeam);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register("tp")
|
private void tp(ProxiedPlayer player, Team targetTeam) {
|
||||||
public void tp(ProxiedPlayer player, @ErrorMessage("TEAM_TP_NO_TEAM") @Mapper("teamWithTeamServer") Team targetTeam) {
|
if (targetTeam.getAddress() == null) {
|
||||||
if (targetTeam.getAddress() == null || targetTeam.getAddress().isEmpty()) {
|
|
||||||
Message.send("TEAM_NO_ADDRESS", player);
|
Message.send("TEAM_NO_ADDRESS", player);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
InetSocketAddress address = new InetSocketAddress(targetTeam.getAddress(), targetTeam.getPort());
|
|
||||||
ServerInfo serverInfo = Storage.teamServers.computeIfAbsent(targetTeam.getTeamId(), integer -> {
|
ServerInfo serverInfo = Storage.teamServers.computeIfAbsent(targetTeam.getTeamId(), integer -> {
|
||||||
|
InetSocketAddress address = new InetSocketAddress(targetTeam.getAddress(), targetTeam.getPort());
|
||||||
ServerInfo info = ProxyServer.getInstance().constructServerInfo("Team " + targetTeam.getTeamKuerzel(), address, "SteamWar.de - Teamserver", false);
|
ServerInfo info = ProxyServer.getInstance().constructServerInfo("Team " + targetTeam.getTeamKuerzel(), address, "SteamWar.de - Teamserver", false);
|
||||||
ProxyServer.getInstance().getServers().put(info.getName(), info);
|
ProxyServer.getInstance().getServers().put(info.getName(), info);
|
||||||
return info;
|
return info;
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!address.equals(serverInfo.getSocketAddress())) {
|
|
||||||
serverInfo = Storage.teamServers.remove(targetTeam.getTeamId());
|
|
||||||
ProxyServer.getInstance().getServers().remove(serverInfo.getName());
|
|
||||||
tp(player, targetTeam);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
player.connect(ServerConnectRequest.builder()
|
|
||||||
.target(serverInfo)
|
|
||||||
.connectTimeout(BungeeCord.getInstance().getConfig().getServerConnectTimeout())
|
|
||||||
.retry(false)
|
|
||||||
.reason(ServerConnectEvent.Reason.PLUGIN)
|
|
||||||
.callback((success, error) -> {
|
|
||||||
if (error != null) {
|
|
||||||
Message.send("TEAM_OFFLINE", player);
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.build());
|
|
||||||
/*
|
|
||||||
((UserConnection) player).connect(serverInfo, (success, error) -> {
|
((UserConnection) player).connect(serverInfo, (success, error) -> {
|
||||||
if (error != null) {
|
if (error != null) {
|
||||||
Message.send("TEAM_OFFLINE", player);
|
Message.send("TEAM_OFFLINE", player);
|
||||||
}
|
}
|
||||||
}, false, ServerConnectEvent.Reason.PLUGIN, BungeeCord.getInstance().getConfig().getServerConnectTimeout(), false);
|
}, false, ServerConnectEvent.Reason.PLUGIN, BungeeCord.getInstance().getConfig().getServerConnectTimeout(), false);
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register(value = "server", description = "TEAM_SERVER_USAGE")
|
private void server(ProxiedPlayer player, SteamwarUser user, Team team, String[] args){
|
||||||
public void server(@Validator("isLeader") ProxiedPlayer player, String server, @Min(intValue = 1) @Max(intValue = 65535) @ErrorMessage("TEAM_SERVER_PORT_INVALID") int port){
|
if(notLeader(player, user, team))
|
||||||
SteamwarUser user = SteamwarUser.get(player.getUniqueId());
|
return;
|
||||||
Team team = Team.get(user.getTeam());
|
if (user.isPunishedWithMessage(ChatSender.of(player), Punishment.PunishmentType.NoTeamServer)) {
|
||||||
if (PunishmentCommand.isPunishedWithMessage(ChatSender.of(player), Punishment.PunishmentType.NoTeamServer)) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (args.length < 2) {
|
||||||
|
Message.send("TEAM_SERVER_USAGE", player);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
String server = args[1];
|
||||||
try {
|
try {
|
||||||
if (isLocalhost(InetAddress.getByName(server))) {
|
if (isLocalhost(InetAddress.getByName(server))) {
|
||||||
Message.send("TEAM_SERVER_ADDRESS_INVALID", player);
|
Message.send("TEAM_SERVER_ADDRESS_INVALID", player);
|
||||||
@ -546,14 +617,26 @@ public class TeamCommand extends SWCommand {
|
|||||||
Message.send("TEAM_SERVER_ADDRESS_INVALID", player);
|
Message.send("TEAM_SERVER_ADDRESS_INVALID", player);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
int port = 25565;
|
||||||
|
if (args.length == 3) {
|
||||||
|
try {
|
||||||
|
port = Integer.parseInt(args[2]);
|
||||||
|
if (port < 1 || port > 65535) {
|
||||||
|
Message.send("TEAM_SERVER_PORT_INVALID", player);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
Message.send("TEAM_SERVER_PORT_INVALID", player);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
team.setAddress(server);
|
team.setAddress(server);
|
||||||
team.setPort(port);
|
team.setPort(port);
|
||||||
Storage.teamServers.remove(team.getTeamId());
|
Storage.teamServers.remove(team.getTeamId());
|
||||||
Message.send("TEAM_SERVER_SET", player);
|
Message.send("TEAM_SERVER_SET", player);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isLocalhost(InetAddress addr) {
|
private static boolean isLocalhost(InetAddress addr) {
|
||||||
// Check if the address is a valid special local or loop back
|
// Check if the address is a valid special local or loop back
|
||||||
if (addr.isAnyLocalAddress() || addr.isLoopbackAddress())
|
if (addr.isAnyLocalAddress() || addr.isLoopbackAddress())
|
||||||
return true;
|
return true;
|
||||||
@ -566,10 +649,9 @@ public class TeamCommand extends SWCommand {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register("color")
|
private void changeColor(ProxiedPlayer player, SteamwarUser user, Team team) {
|
||||||
public void changeColor(@Validator("isLeader") ProxiedPlayer player) {
|
if(notLeader(player, user, team))
|
||||||
SteamwarUser user = SteamwarUser.get(player.getUniqueId());
|
return;
|
||||||
Team team = Team.get(user.getTeam());
|
|
||||||
|
|
||||||
if(notDuringEvent(player))
|
if(notDuringEvent(player))
|
||||||
return;
|
return;
|
||||||
@ -589,115 +671,12 @@ public class TeamCommand extends SWCommand {
|
|||||||
inv.open();
|
inv.open();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ClassMapper(Event.class)
|
|
||||||
public TypeMapper<Event> eventTypeMapper() {
|
|
||||||
return new TypeMapper<Event>() {
|
|
||||||
@Override
|
|
||||||
public Event map(CommandSender commandSender, String[] previousArguments, String s) {
|
|
||||||
return Event.get(s);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean validate(CommandSender sender, Event value, MessageSender messageSender) {
|
|
||||||
if (value == null) {
|
|
||||||
messageSender.send("TEAM_EVENT_NO_EVENT", sender);
|
|
||||||
return false;
|
|
||||||
} else {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Collection<String> tabCompletes(CommandSender sender, PreviousArguments previousArguments, String s) {
|
|
||||||
return Event.getComing().stream().map(Event::getEventName).collect(Collectors.toList());
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
@Validator(value = "isNotInTeam", local = true)
|
|
||||||
public TypeValidator<ProxiedPlayer> isNotInTeamValidator() {
|
|
||||||
return (sender, value, messageSender) -> {
|
|
||||||
if (!(sender instanceof ProxiedPlayer)) return false;
|
|
||||||
ProxiedPlayer player = (ProxiedPlayer) sender;
|
|
||||||
SteamwarUser steamwarUser = SteamwarUser.get(player.getUniqueId());
|
|
||||||
if (steamwarUser.getTeam() != 0) {
|
|
||||||
messageSender.send("TEAM_IN_TEAM");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
@Validator(value = "isInTeam", local = true)
|
|
||||||
public TypeValidator<ProxiedPlayer> isInTeamValidator() {
|
|
||||||
return (sender, value, messageSender) -> {
|
|
||||||
if (!(sender instanceof ProxiedPlayer)) return false;
|
|
||||||
ProxiedPlayer player = (ProxiedPlayer) sender;
|
|
||||||
SteamwarUser steamwarUser = SteamwarUser.get(player.getUniqueId());
|
|
||||||
if (steamwarUser.getTeam() == 0) {
|
|
||||||
messageSender.send("TEAM_NOT_IN_TEAM");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
@Validator(value = "isLeader", local = true)
|
|
||||||
public TypeValidator<ProxiedPlayer> isLeaderValidator() {
|
|
||||||
return (sender, value, messageSender) -> {
|
|
||||||
if (!(sender instanceof ProxiedPlayer)) return false;
|
|
||||||
ProxiedPlayer player = (ProxiedPlayer) sender;
|
|
||||||
SteamwarUser steamwarUser = SteamwarUser.get(player.getUniqueId());
|
|
||||||
if (steamwarUser.getTeam() == 0) {
|
|
||||||
messageSender.send("TEAM_NOT_IN_TEAM");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (!steamwarUser.isLeader()) {
|
|
||||||
messageSender.send("TEAM_NOT_LEADER");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
@ClassMapper(Team.class)
|
|
||||||
@Cached(global = true, cacheDuration = 60)
|
|
||||||
public TypeMapper<Team> team() {
|
|
||||||
return new TypeMapper<Team>() {
|
|
||||||
@Override
|
|
||||||
public Team map(CommandSender commandSender, String[] previousArguments, String s) {
|
|
||||||
return Team.get(s);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Collection<String> tabCompletes(CommandSender sender, PreviousArguments previousArguments, String s) {
|
|
||||||
return Team.getAll().stream()
|
|
||||||
.flatMap(team -> Stream.of(team.getTeamName(), team.getTeamKuerzel()))
|
|
||||||
.collect(Collectors.toList());
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
@Mapper(value = "teamWithTeamServer", local = true)
|
|
||||||
@Cached(global = true, cacheDuration = 60)
|
|
||||||
public TypeMapper<Team> teamWithTeamServer() {
|
|
||||||
return new TypeMapper<Team>() {
|
|
||||||
@Override
|
|
||||||
public Team map(CommandSender commandSender, String[] previousArguments, String s) {
|
|
||||||
return Team.get(s);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Collection<String> tabCompletes(CommandSender sender, PreviousArguments previousArguments, String s) {
|
|
||||||
return Team.getAll().stream()
|
|
||||||
.filter(team -> team.getAddress() != null && !team.getAddress().isEmpty())
|
|
||||||
.flatMap(team -> Stream.of(team.getTeamName(), team.getTeamKuerzel()))
|
|
||||||
.collect(Collectors.toList());
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean checkTeamName(ProxiedPlayer player, Team team, String arg){
|
private boolean checkTeamName(ProxiedPlayer player, Team team, String arg){
|
||||||
|
if(arg.length() < 4 || arg.length() > 15){
|
||||||
|
Message.send("TEAM_NAME_LENGHT", player);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
Team t = Team.get(arg);
|
Team t = Team.get(arg);
|
||||||
if(t != null && t.getTeamId() != team.getTeamId()){
|
if(t != null && t.getTeamId() != team.getTeamId()){
|
||||||
Message.send("TEAM_NAME_TAKEN", player);
|
Message.send("TEAM_NAME_TAKEN", player);
|
||||||
@ -707,6 +686,11 @@ public class TeamCommand extends SWCommand {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private boolean checkTeamKuerzel(ProxiedPlayer player, Team team, String arg){
|
private boolean checkTeamKuerzel(ProxiedPlayer player, Team team, String arg){
|
||||||
|
if(arg.length() < 2 || arg.length() > 4){
|
||||||
|
Message.send("TEAM_KUERZEL_LENGHT", player);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
Team t = Team.get(arg);
|
Team t = Team.get(arg);
|
||||||
if(t != null && (team == null || t.getTeamId() != team.getTeamId())){
|
if(t != null && (team == null || t.getTeamId() != team.getTeamId())){
|
||||||
Message.send("TEAM_KUERZEL_TAKEN", player);
|
Message.send("TEAM_KUERZEL_TAKEN", player);
|
||||||
@ -715,6 +699,32 @@ public class TeamCommand extends SWCommand {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean unwantedInTeam(ProxiedPlayer player, SteamwarUser user){
|
||||||
|
if(user.getTeam() != 0){
|
||||||
|
Message.send("TEAM_IN_TEAM", player);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean notInTeam(ProxiedPlayer player, SteamwarUser user){
|
||||||
|
if(user.getTeam() == 0){
|
||||||
|
Message.send("TEAM_NOT_IN_TEAM", player);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean notLeader(ProxiedPlayer player, SteamwarUser user, Team team){
|
||||||
|
if(notInTeam(player, user))
|
||||||
|
return true;
|
||||||
|
if(!user.isLeader()){
|
||||||
|
Message.send("TEAM_NOT_LEADER", player);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
private boolean notDuringEvent(ProxiedPlayer player){
|
private boolean notDuringEvent(ProxiedPlayer player){
|
||||||
if(Event.get() != null){
|
if(Event.get() != null){
|
||||||
Message.send("TEAM_NOT_IN_EVENT", player);
|
Message.send("TEAM_NOT_IN_EVENT", player);
|
||||||
@ -722,4 +732,37 @@ public class TeamCommand extends SWCommand {
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Iterable<String> onTabComplete(CommandSender commandSender, String[] args){
|
||||||
|
List<String> tab = new ArrayList<>();
|
||||||
|
if(args.length == 1){
|
||||||
|
tab.add("create");
|
||||||
|
tab.add("join");
|
||||||
|
tab.add("invite");
|
||||||
|
tab.add("stepback");
|
||||||
|
tab.add("leave");
|
||||||
|
tab.add("info");
|
||||||
|
tab.add("remove");
|
||||||
|
tab.add("event");
|
||||||
|
tab.add("changekuerzel");
|
||||||
|
tab.add("changename");
|
||||||
|
tab.add("promote");
|
||||||
|
tab.add("changecolor");
|
||||||
|
tab.add("tp");
|
||||||
|
tab.add("server");
|
||||||
|
}else if(args.length == 2){
|
||||||
|
if(args[1].equalsIgnoreCase("event")){
|
||||||
|
List<Event> coming = Event.getComing();
|
||||||
|
coming.forEach(event -> tab.add(event.getEventName()));
|
||||||
|
}else if(args[1].equalsIgnoreCase("join") || args[1].equalsIgnoreCase("info") || args[1].equalsIgnoreCase("tp")){
|
||||||
|
List<Team> teams = Team.getAll();
|
||||||
|
teams.forEach(team -> {
|
||||||
|
tab.add(team.getTeamName());
|
||||||
|
tab.add(team.getTeamKuerzel());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return tab;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -20,28 +20,30 @@
|
|||||||
package de.steamwar.bungeecore.commands;
|
package de.steamwar.bungeecore.commands;
|
||||||
|
|
||||||
import de.steamwar.bungeecore.listeners.ChatListener;
|
import de.steamwar.bungeecore.listeners.ChatListener;
|
||||||
import de.steamwar.sql.SteamwarUser;
|
import de.steamwar.bungeecore.sql.SteamwarUser;
|
||||||
import de.steamwar.command.SWCommand;
|
|
||||||
import de.steamwar.messages.ChatSender;
|
import de.steamwar.messages.ChatSender;
|
||||||
import net.md_5.bungee.api.CommandSender;
|
import net.md_5.bungee.api.CommandSender;
|
||||||
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
|
||||||
|
|
||||||
public class TeamchatCommand extends SWCommand {
|
public class TeamchatCommand extends BasicCommand {
|
||||||
|
|
||||||
public TeamchatCommand() {
|
public TeamchatCommand() {
|
||||||
super("tc", "","teamchat");
|
super("tc", "","teamchat");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register(description = "TC_USAGE")
|
@Override
|
||||||
public void genericCommand(ProxiedPlayer player, @ErrorMessage(value = "TC_USAGE", allowEAs = false) String... args) {
|
public void execute(CommandSender s, String[] args) {
|
||||||
ChatSender sender = ChatSender.of(player);
|
ChatSender sender = ChatSender.of(s);
|
||||||
SteamwarUser user = sender.user();
|
if(args.length == 0){
|
||||||
|
sender.system("TC_USAGE");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
SteamwarUser user = sender.user();
|
||||||
if(user.getTeam() == 0){
|
if(user.getTeam() == 0){
|
||||||
sender.system("TC_NO_TEAM");
|
sender.system("TC_NO_TEAM");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ChatListener.sendChat(sender, ChatSender.allReceivers().filter(p -> p.user().getTeam() == user.getTeam()), "CHAT_TEAM", null, String.join(" ", args));
|
ChatListener.sendChat(sender, ChatSender.allReceivers().filter(player -> player.user().getTeam() == user.getTeam()), "CHAT_TEAM", null, String.join(" ", args));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -20,11 +20,7 @@
|
|||||||
package de.steamwar.bungeecore.commands;
|
package de.steamwar.bungeecore.commands;
|
||||||
|
|
||||||
import de.steamwar.bungeecore.*;
|
import de.steamwar.bungeecore.*;
|
||||||
import de.steamwar.sql.*;
|
import de.steamwar.bungeecore.sql.*;
|
||||||
import de.steamwar.bungeecore.util.BauLock;
|
|
||||||
import de.steamwar.bungeecore.util.Chat19;
|
|
||||||
import de.steamwar.command.SWCommand;
|
|
||||||
import de.steamwar.command.TypeMapper;
|
|
||||||
import de.steamwar.messages.ChatSender;
|
import de.steamwar.messages.ChatSender;
|
||||||
import net.md_5.bungee.BungeeCord;
|
import net.md_5.bungee.BungeeCord;
|
||||||
import net.md_5.bungee.api.CommandSender;
|
import net.md_5.bungee.api.CommandSender;
|
||||||
@ -32,116 +28,88 @@ import net.md_5.bungee.api.ProxyServer;
|
|||||||
import net.md_5.bungee.api.config.ServerInfo;
|
import net.md_5.bungee.api.config.ServerInfo;
|
||||||
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
public class TpCommand extends SWCommand {
|
public class TpCommand extends BasicCommand {
|
||||||
|
|
||||||
public TpCommand(){
|
public TpCommand(){
|
||||||
super("join", null, "tp", "teleport");
|
super("join", null, "tp", "teleport");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register
|
@Override
|
||||||
public void genericCommand(ProxiedPlayer p) {
|
public void execute(CommandSender s, String[] args) {
|
||||||
ChatSender.of(p).system(Event.get() == null ? "TP_USAGE" : "TP_USAGE_EVENT");
|
if(!(s instanceof ProxiedPlayer))
|
||||||
}
|
return;
|
||||||
|
ProxiedPlayer player = (ProxiedPlayer) s;
|
||||||
|
|
||||||
@Register
|
ChatSender sender = ChatSender.of(player);
|
||||||
public void teleportCommand(ProxiedPlayer p, @Mapper("to") String to, String... rest) {
|
if(args.length == 0){
|
||||||
ServerInfo server = getTarget(to);
|
if(Event.get() == null)
|
||||||
|
sender.system("TP_USAGE");
|
||||||
//Give control of teleport command to server
|
else
|
||||||
if (server == p.getServer().getInfo() || server == null) {
|
sender.system("TP_USAGE_EVENT");
|
||||||
if (rest.length == 0) {
|
|
||||||
Chat19.chat(p, "/tp " + to);
|
|
||||||
} else {
|
|
||||||
Chat19.chat(p, "/tp " + to + " " + String.join(" ", rest));
|
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
teleport(p, server);
|
ServerInfo server = getTarget(player, args[0]);
|
||||||
|
|
||||||
|
//Give control of teleport command to server
|
||||||
|
if(server == null) {
|
||||||
|
player.chat("/tp " + String.join(" ", args));
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Mapper("to")
|
teleport(player, server);
|
||||||
@Cached(cacheDuration = 10)
|
|
||||||
public TypeMapper<String> tabCompleter() {
|
|
||||||
return new TypeMapper<String>() {
|
|
||||||
@Override
|
|
||||||
public String map(CommandSender commandSender, String[] previousArguments, String s) {
|
|
||||||
return s;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Collection<String> tabCompletes(CommandSender sender, String[] previousArguments, String s) {
|
public Iterable<String> onTabComplete(CommandSender commandSender, String[] args) {
|
||||||
List<String> list = new ArrayList<>();
|
if(args.length > 0)
|
||||||
for (ProxiedPlayer player : BungeeCord.getInstance().getPlayers()) {
|
return allPlayers(args[args.length - 1]);
|
||||||
list.add(player.getName());
|
return new ArrayList<>();
|
||||||
}
|
|
||||||
if (Event.get() != null) {
|
|
||||||
EventStarter.getEventServer().keySet().forEach(teamId -> {
|
|
||||||
Team team = Team.get(teamId);
|
|
||||||
list.add(team.getTeamName());
|
|
||||||
list.add(team.getTeamKuerzel());
|
|
||||||
});
|
|
||||||
}
|
|
||||||
if (Storage.teamServers.containsValue(((ProxiedPlayer) sender).getServer().getInfo())) {
|
|
||||||
Storage.directTabItems.getOrDefault((ProxiedPlayer) sender, Collections.emptyMap()).forEach((uuid, item) -> {
|
|
||||||
list.add(item.getUsername());
|
|
||||||
});
|
|
||||||
}
|
|
||||||
return list;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void teleport(ProxiedPlayer player, ServerInfo server) {
|
public static void teleport(ProxiedPlayer player, ServerInfo server){
|
||||||
ChatSender sender = ChatSender.of(player);
|
ChatSender sender = ChatSender.of(player);
|
||||||
if(CheckCommand.isChecking(player)){
|
if(CheckCommand.isChecking(player)){
|
||||||
sender.system("CHECK_CHECKING");
|
sender.system("CHECK_CHECKING");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String serverPerm = BungeeCore.serverPermissions.get(server.getName());
|
||||||
Subserver subserver = Subserver.getSubserver(server);
|
Subserver subserver = Subserver.getSubserver(server);
|
||||||
if(subserver == null) {
|
|
||||||
player.connect(server);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (subserver.getType()) {
|
if (subserver != null && subserver.getType() == Servertype.ARENA) {
|
||||||
case ARENA:
|
if (!sender.user().isPunishedWithMessage(sender, Punishment.PunishmentType.NoFightServer))
|
||||||
if (PunishmentCommand.isPunishedWithMessage(sender, Punishment.PunishmentType.NoFightServer))
|
SubserverSystem.sendPlayer(subserver, player);
|
||||||
return;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case BAUSERVER:
|
} else if(subserver instanceof Bauserver) {
|
||||||
Bauserver bauserver = (Bauserver) subserver;
|
Bauserver bauserver = (Bauserver) subserver;
|
||||||
ProxiedPlayer checker = BungeeCord.getInstance().getPlayer(bauserver.getOwner());
|
ProxiedPlayer checker = BungeeCord.getInstance().getPlayer(bauserver.getOwner());
|
||||||
if (checker != null && CheckCommand.isChecking(checker)) {
|
if (checker != null && CheckCommand.isChecking(checker)) {
|
||||||
if (!sender.user().hasPerm(UserPerm.CHECK) && CheckCommand.getCheckingSchem(checker).getOwner() != sender.user().getId()) {
|
SteamwarUser steamwarUser = SteamwarUser.get(player);
|
||||||
|
if (steamwarUser.getUserGroup().isCheckSchematics() || CheckCommand.getCheckingSchem(checker).getOwner() == steamwarUser.getId()) {
|
||||||
|
SubserverSystem.sendPlayer(subserver, player);
|
||||||
|
} else {
|
||||||
sender.system("JOIN_PLAYER_BLOCK");
|
sender.system("JOIN_PLAYER_BLOCK");
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
} else if (BauLock.checkNotifyLocked(SteamwarUser.get(bauserver.getOwner()), player)) {
|
} else if (bauserver.getOwner().equals(player.getUniqueId()) || BauweltMember.getBauMember(bauserver.getOwner(), player.getUniqueId()) != null) {
|
||||||
return;
|
SubserverSystem.sendPlayer(subserver, player);
|
||||||
} else if (!bauserver.getOwner().equals(player.getUniqueId()) && BauweltMember.getBauMember(bauserver.getOwner(), player.getUniqueId()) == null) {
|
} else {
|
||||||
SubserverSystem.sendDeniedMessage(player, bauserver.getOwner());
|
SubserverSystem.sendDeniedMessage(player, bauserver.getOwner());
|
||||||
sender.system("JOIN_PLAYER_BLOCK");
|
sender.system("JOIN_PLAYER_BLOCK");
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
|
|
||||||
case BUILDER:
|
} else if (serverPerm != null && !player.hasPermission(serverPerm)) {
|
||||||
if(!sender.user().hasPerm(UserPerm.BUILD)) {
|
|
||||||
sender.system("JOIN_PLAYER_BLOCK");
|
sender.system("JOIN_PLAYER_BLOCK");
|
||||||
return;
|
} else if (serverPerm == null && !player.getGroups().contains("team")) {
|
||||||
|
sender.system("JOIN_PLAYER_BLOCK");
|
||||||
|
} else {
|
||||||
|
player.connect(server);
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SubserverSystem.sendPlayer(subserver, player);
|
private static ServerInfo getTarget(ProxiedPlayer player, String arg) {
|
||||||
}
|
|
||||||
|
|
||||||
private static ServerInfo getTarget(String arg) {
|
|
||||||
ServerInfo server = null;
|
ServerInfo server = null;
|
||||||
|
|
||||||
//Get target player server
|
//Get target player server
|
||||||
@ -159,6 +127,9 @@ public class TpCommand extends SWCommand {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(server == player.getServer().getInfo())
|
||||||
|
server = null;
|
||||||
|
|
||||||
return server;
|
return server;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -24,12 +24,9 @@ import de.steamwar.bungeecore.inventory.SWInventory;
|
|||||||
import de.steamwar.bungeecore.inventory.SWItem;
|
import de.steamwar.bungeecore.inventory.SWItem;
|
||||||
import de.steamwar.bungeecore.inventory.SWListInv;
|
import de.steamwar.bungeecore.inventory.SWListInv;
|
||||||
import de.steamwar.bungeecore.inventory.SWStreamInv;
|
import de.steamwar.bungeecore.inventory.SWStreamInv;
|
||||||
import de.steamwar.bungeecore.util.Chat19;
|
import de.steamwar.bungeecore.sql.SteamwarUser;
|
||||||
import de.steamwar.command.SWCommand;
|
import de.steamwar.bungeecore.sql.Tutorial;
|
||||||
import de.steamwar.command.TypeValidator;
|
import net.md_5.bungee.api.CommandSender;
|
||||||
import de.steamwar.sql.SteamwarUser;
|
|
||||||
import de.steamwar.sql.Tutorial;
|
|
||||||
import de.steamwar.sql.UserPerm;
|
|
||||||
import net.md_5.bungee.api.ProxyServer;
|
import net.md_5.bungee.api.ProxyServer;
|
||||||
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
||||||
|
|
||||||
@ -38,53 +35,69 @@ import java.util.ArrayList;
|
|||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
import java.util.logging.Level;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
public class TutorialCommand extends SWCommand {
|
public class TutorialCommand extends BasicCommand {
|
||||||
|
|
||||||
public TutorialCommand() {
|
public TutorialCommand() {
|
||||||
super("tutorial", null);
|
super("tutorial", null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register
|
@Override
|
||||||
public void genericCommand(ProxiedPlayer player) {
|
public void execute(CommandSender sender, String[] args) {
|
||||||
|
if(!(sender instanceof ProxiedPlayer))
|
||||||
|
return;
|
||||||
|
ProxiedPlayer player = (ProxiedPlayer) sender;
|
||||||
|
|
||||||
|
if(args.length == 0) {
|
||||||
openInventory(player, true, false);
|
openInventory(player, true, false);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register("rate")
|
switch(args[0].toLowerCase()) {
|
||||||
public void rate(ProxiedPlayer player) {
|
case "rate":
|
||||||
Chat19.chat(player, "/tutorial rate");
|
if(args.length < 2) {
|
||||||
|
player.chat("/tutorial rate");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int id;
|
||||||
|
try {
|
||||||
|
id = Integer.parseInt(args[1]);
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
BungeeCore.get().getLogger().log(Level.SEVERE, "rate executed with non number: " + args[1]);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register("rate")
|
|
||||||
public void rate(ProxiedPlayer player, int id) {
|
|
||||||
Tutorial tutorial = Tutorial.get(id);
|
Tutorial tutorial = Tutorial.get(id);
|
||||||
if(tutorial == null) {
|
if(tutorial == null) {
|
||||||
Chat19.chat(player, "/tutorial rate"); // Catch players manually entering numbers
|
BungeeCore.get().getLogger().log(Level.SEVERE, "rate executed with nonexistent id: " + id);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
rate(player, tutorial);
|
rate(player, tutorial);
|
||||||
|
break;
|
||||||
|
case "create":
|
||||||
|
if(args.length < 3) {
|
||||||
|
Message.send("TUTORIAL_CREATE_HELP", player);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register(value = "create", description = "TUTORIAL_CREATE_HELP")
|
create(player, Arrays.stream(args).skip(2).collect(Collectors.joining(" ")), args[1].toUpperCase());
|
||||||
public void create(ProxiedPlayer player, String material, String... name) {
|
break;
|
||||||
create(player, String.join(" ", name), material.toUpperCase());
|
case "own":
|
||||||
}
|
|
||||||
|
|
||||||
@Register("own")
|
|
||||||
public void own(ProxiedPlayer player) {
|
|
||||||
openInventory(player, false, true);
|
openInventory(player, false, true);
|
||||||
}
|
break;
|
||||||
|
case "unreleased":
|
||||||
@Register("unreleased")
|
if (SteamwarUser.get(player.getUniqueId()).getUserGroup().isTeamGroup()) {
|
||||||
public void unreleased(@Validator("unreleased") ProxiedPlayer player) {
|
|
||||||
openInventory(player, false, false);
|
openInventory(player, false, false);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
Message.send("TUTORIAL_CREATE_HELP", player);
|
||||||
|
Message.send("TUTORIAL_OWN_HELP", player);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Validator("unreleased")
|
|
||||||
public TypeValidator<ProxiedPlayer> unreleasedChecker() {
|
|
||||||
return (sender, value, messageSender) -> (SteamwarUser.get((value).getUniqueId()).hasPerm(UserPerm.TEAM));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void openInventory(ProxiedPlayer player, boolean released, boolean own) {
|
private void openInventory(ProxiedPlayer player, boolean released, boolean own) {
|
||||||
@ -94,37 +107,36 @@ public class TutorialCommand extends SWCommand {
|
|||||||
player,
|
player,
|
||||||
Message.parse("TUTORIAL_TITLE", player),
|
Message.parse("TUTORIAL_TITLE", player),
|
||||||
(click, tutorial) -> {
|
(click, tutorial) -> {
|
||||||
if(!released && click.isShiftClick() && user.hasPerm(UserPerm.TEAM) && user.getId() != tutorial.getCreator()) {
|
if(!released && click.isShiftClick() && user.getUserGroup().isTeamGroup() && user != tutorial.creator()) {
|
||||||
tutorial.release();
|
tutorial.release();
|
||||||
openInventory(player, released, own);
|
openInventory(player, released, own);
|
||||||
return;
|
return;
|
||||||
} else if(own && click.isShiftClick() && click.isRightClick()) {
|
} else if(own && click.isShiftClick() && click.isRightClick()) {
|
||||||
tutorial.delete();
|
tutorial.delete();
|
||||||
SubserverSystem.deleteFolder(VelocityCore.local, world(tutorial).getPath());
|
|
||||||
openInventory(player, released, own);
|
openInventory(player, released, own);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
new ServerStarter().tutorial(player, tutorial).start();
|
new ServerStarter().tutorial(player, tutorial).start();
|
||||||
},
|
},
|
||||||
page -> (own ? Tutorial.getOwn(user.getId(), page, 45) : Tutorial.getPage(page, 45, released)).stream().map(tutorial -> new SWListInv.SWListEntry<>(getTutorialItem(player, tutorial, own), tutorial)).collect(Collectors.toList())
|
page -> (own ? Tutorial.getOwn(user, page, 45) : Tutorial.getPage(page, 45, released)).stream().map(tutorial -> new SWListInv.SWListEntry<>(getTutorialItem(player, tutorial, own), tutorial)).collect(Collectors.toList())
|
||||||
).open();
|
).open();
|
||||||
}
|
}
|
||||||
|
|
||||||
private SWItem getTutorialItem(ProxiedPlayer player, Tutorial tutorial, boolean personalHighlights) {
|
private SWItem getTutorialItem(ProxiedPlayer player, Tutorial tutorial, boolean personalHighlights) {
|
||||||
SWItem item = new SWItem(tutorial.getItem(), Message.parse("TUTORIAL_NAME", player, tutorial.getName()));
|
SWItem item = new SWItem(tutorial.item(), Message.parse("TUTORIAL_NAME", player, tutorial.name()));
|
||||||
item.setHideAttributes(true);
|
item.setHideAttributes(true);
|
||||||
|
|
||||||
List<String> lore = new ArrayList<>();
|
List<String> lore = new ArrayList<>();
|
||||||
lore.add(Message.parse("TUTORIAL_BY", player, SteamwarUser.get(tutorial.getCreator()).getUserName()));
|
lore.add(Message.parse("TUTORIAL_BY", player, tutorial.creator().getUserName()));
|
||||||
lore.add(Message.parse("TUTORIAL_STARS", player, String.format("%.1f", tutorial.getStars())));
|
lore.add(Message.parse("TUTORIAL_STARS", player, String.format("%.1f", tutorial.stars())));
|
||||||
|
|
||||||
if (personalHighlights)
|
if (personalHighlights)
|
||||||
lore.add(Message.parse("TUTORIAL_DELETE", player));
|
lore.add(Message.parse("TUTORIAL_DELETE", player));
|
||||||
|
|
||||||
item.setLore(lore);
|
item.setLore(lore);
|
||||||
|
|
||||||
if (personalHighlights && tutorial.isReleased())
|
if (personalHighlights && tutorial.released())
|
||||||
item.setEnchanted(true);
|
item.setEnchanted(true);
|
||||||
|
|
||||||
return item;
|
return item;
|
||||||
@ -135,7 +147,7 @@ public class TutorialCommand extends SWCommand {
|
|||||||
int[] rates = new int[]{1, 2, 3, 4, 5};
|
int[] rates = new int[]{1, 2, 3, 4, 5};
|
||||||
|
|
||||||
new SWListInv<>(player, Message.parse("TUTORIAL_RATE_TITLE", player), Arrays.stream(rates).mapToObj(rate -> new SWListInv.SWListEntry<>(new SWItem("NETHER_STAR", Message.parse("TUTORIAL_RATE", player, rate)), rate)).collect(Collectors.toList()), (click, rate) -> {
|
new SWListInv<>(player, Message.parse("TUTORIAL_RATE_TITLE", player), Arrays.stream(rates).mapToObj(rate -> new SWListInv.SWListEntry<>(new SWItem("NETHER_STAR", Message.parse("TUTORIAL_RATE", player, rate)), rate)).collect(Collectors.toList()), (click, rate) -> {
|
||||||
tutorial.rate(user.getId(), rate);
|
tutorial.rate(user, rate);
|
||||||
SWInventory.close(player);
|
SWInventory.close(player);
|
||||||
}).open();
|
}).open();
|
||||||
}
|
}
|
||||||
@ -151,18 +163,14 @@ public class TutorialCommand extends SWCommand {
|
|||||||
}
|
}
|
||||||
|
|
||||||
subserver.execute("save-all");
|
subserver.execute("save-all");
|
||||||
ProxyServer.getInstance().getScheduler().schedule(VelocityCore.get(), () -> {
|
ProxyServer.getInstance().getScheduler().schedule(BungeeCore.get(), () -> {
|
||||||
Tutorial tutorial = Tutorial.create(user.getId(), name, item);
|
Tutorial tutorial = Tutorial.create(user, name, item);
|
||||||
File tutorialWorld = world(tutorial);
|
File tutorialWorld = tutorial.world();
|
||||||
|
|
||||||
if (tutorialWorld.exists())
|
if (tutorialWorld.exists())
|
||||||
SubserverSystem.deleteFolder(VelocityCore.local, tutorialWorld.getPath());
|
SubserverSystem.deleteFolder(Node.local, tutorialWorld.getPath());
|
||||||
ServerStarter.copyWorld(VelocityCore.local, tempWorld.getPath(), tutorialWorld.getPath());
|
ServerStarter.copyWorld(Node.local, tempWorld.getPath(), tutorialWorld.getPath());
|
||||||
Message.send("TUTORIAL_CREATED", player);
|
Message.send("TUTORIAL_CREATED", player);
|
||||||
}, 1, TimeUnit.SECONDS);
|
}, 1, TimeUnit.SECONDS);
|
||||||
}
|
}
|
||||||
|
|
||||||
private File world(Tutorial tutorial) {
|
|
||||||
return new File(ServerStarter.TUTORIAL_PATH, String.valueOf(tutorial.getTutorialId()));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -1,86 +0,0 @@
|
|||||||
/*
|
|
||||||
* This file is a part of the SteamWar software.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2020 SteamWar.de-Serverteam
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package de.steamwar.bungeecore.commands;
|
|
||||||
|
|
||||||
import de.steamwar.bungeecore.ArenaMode;
|
|
||||||
import de.steamwar.command.SWCommandUtils;
|
|
||||||
import de.steamwar.command.TypeMapper;
|
|
||||||
import de.steamwar.command.TypeValidator;
|
|
||||||
import de.steamwar.messages.ChatSender;
|
|
||||||
import de.steamwar.sql.Punishment;
|
|
||||||
import lombok.experimental.UtilityClass;
|
|
||||||
import net.md_5.bungee.api.CommandSender;
|
|
||||||
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
|
||||||
|
|
||||||
import java.util.Collection;
|
|
||||||
|
|
||||||
@UtilityClass
|
|
||||||
public class TypeMappers {
|
|
||||||
|
|
||||||
public static void init() {
|
|
||||||
SWCommandUtils.addValidator("arenaPlayer", arenaPlayer());
|
|
||||||
SWCommandUtils.addMapper("nonHistoricArenaMode", arenaModeTypeMapper(false));
|
|
||||||
SWCommandUtils.addMapper("historicArenaMode", arenaModeTypeMapper(true));
|
|
||||||
SWCommandUtils.addMapper("arenaMap", arenaMapTypeMapper());
|
|
||||||
}
|
|
||||||
|
|
||||||
private static TypeValidator<ProxiedPlayer> arenaPlayer() {
|
|
||||||
return (sender, value, messageSender) -> {
|
|
||||||
ChatSender player = ChatSender.of(value);
|
|
||||||
if (PunishmentCommand.isPunishedWithMessage(player, Punishment.PunishmentType.NoFightServer)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
private static TypeMapper<ArenaMode> arenaModeTypeMapper(boolean historic) {
|
|
||||||
return new TypeMapper<ArenaMode>() {
|
|
||||||
@Override
|
|
||||||
public ArenaMode map(CommandSender commandSender, String[] previousArguments, String s) {
|
|
||||||
return ArenaMode.getByChat(s);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Collection<String> tabCompletes(CommandSender sender, String[] previousArguments, String s) {
|
|
||||||
return ArenaMode.getAllChatNames(historic);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
private static TypeMapper<String> arenaMapTypeMapper() {
|
|
||||||
return new TypeMapper<String>() {
|
|
||||||
@Override
|
|
||||||
public String map(CommandSender commandSender, String[] previousArguments, String s) {
|
|
||||||
if (previousArguments.length == 0) return null;
|
|
||||||
return ArenaMode.getByChat(previousArguments[previousArguments.length - 1]).convertToRealMapName(s);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Collection<String> tabCompletes(CommandSender sender, String[] previousArguments, String s) {
|
|
||||||
if (previousArguments.length == 0) return null;
|
|
||||||
ArenaMode arenaMode = ArenaMode.getByChat(previousArguments[previousArguments.length - 1]);
|
|
||||||
if (arenaMode == null) return null;
|
|
||||||
return arenaMode.getMaps();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
@ -20,22 +20,30 @@
|
|||||||
package de.steamwar.bungeecore.commands;
|
package de.steamwar.bungeecore.commands;
|
||||||
|
|
||||||
import de.steamwar.bungeecore.Message;
|
import de.steamwar.bungeecore.Message;
|
||||||
import de.steamwar.sql.IgnoreSystem;
|
import de.steamwar.bungeecore.sql.IgnoreSystem;
|
||||||
import de.steamwar.sql.SteamwarUser;
|
import de.steamwar.bungeecore.sql.SteamwarUser;
|
||||||
import de.steamwar.command.SWCommand;
|
import net.md_5.bungee.api.CommandSender;
|
||||||
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
||||||
|
|
||||||
public class UnIgnoreCommand extends SWCommand {
|
public class UnIgnoreCommand extends BasicCommand {
|
||||||
|
|
||||||
public UnIgnoreCommand() {
|
public UnIgnoreCommand() {
|
||||||
super("unignore");
|
super("unignore", null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register(description = "UNIGNORE_USAGE")
|
@Override
|
||||||
public void genericCommand(ProxiedPlayer p, String toUnIgnore) {
|
public void execute(CommandSender sender, String[] args) {
|
||||||
|
if(args.length < 1) {
|
||||||
|
Message.send("UNIGNORE_USAGE", sender);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(sender instanceof ProxiedPlayer))
|
||||||
|
return;
|
||||||
|
ProxiedPlayer p = (ProxiedPlayer) sender;
|
||||||
SteamwarUser user = SteamwarUser.get(p.getUniqueId());
|
SteamwarUser user = SteamwarUser.get(p.getUniqueId());
|
||||||
|
|
||||||
SteamwarUser target = SteamwarUser.get(toUnIgnore);
|
SteamwarUser target = SteamwarUser.get(args[0]);
|
||||||
if(target == null){
|
if(target == null){
|
||||||
Message.send("UNIGNORE_NOT_PLAYER", p);
|
Message.send("UNIGNORE_NOT_PLAYER", p);
|
||||||
return;
|
return;
|
||||||
@ -47,4 +55,5 @@ public class UnIgnoreCommand extends SWCommand {
|
|||||||
IgnoreSystem.unIgnore(user, target);
|
IgnoreSystem.unIgnore(user, target);
|
||||||
Message.send("UNIGNORE_UNIGNORED", p, target.getUserName());
|
Message.send("UNIGNORE_UNIGNORED", p, target.getUserName());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -19,27 +19,31 @@
|
|||||||
|
|
||||||
package de.steamwar.bungeecore.commands;
|
package de.steamwar.bungeecore.commands;
|
||||||
|
|
||||||
import de.steamwar.bungeecore.VelocityCore;
|
import de.steamwar.bungeecore.BungeeCore;
|
||||||
import de.steamwar.bungeecore.Message;
|
import de.steamwar.bungeecore.Message;
|
||||||
import de.steamwar.bungeecore.bot.AuthManager;
|
import de.steamwar.bungeecore.bot.AuthManager;
|
||||||
import de.steamwar.sql.SteamwarUser;
|
import de.steamwar.bungeecore.sql.SteamwarUser;
|
||||||
import de.steamwar.command.SWCommand;
|
|
||||||
import net.dv8tion.jda.api.entities.Member;
|
import net.dv8tion.jda.api.entities.Member;
|
||||||
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
import net.md_5.bungee.api.CommandSender;
|
||||||
|
|
||||||
import java.util.Base64;
|
import java.util.Base64;
|
||||||
|
|
||||||
public class VerifyCommand extends SWCommand {
|
public class VerifyCommand extends BasicCommand {
|
||||||
|
|
||||||
public VerifyCommand() {
|
public VerifyCommand() {
|
||||||
super("verify");
|
super("verify", "");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute(CommandSender sender, String[] strings) {
|
||||||
|
if(strings.length < 1) {
|
||||||
|
Message.send("VERIFY_USAGE", sender);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register(description = "VERIFY_USAGE")
|
|
||||||
public void genericCommand(ProxiedPlayer sender, String code) {
|
|
||||||
byte[] bytes;
|
byte[] bytes;
|
||||||
try {
|
try {
|
||||||
bytes = Base64.getDecoder().decode(code);
|
bytes = Base64.getDecoder().decode(strings[0]);
|
||||||
} catch (IllegalArgumentException e) {
|
} catch (IllegalArgumentException e) {
|
||||||
Message.send("VERIFY_INVALID", sender);
|
Message.send("VERIFY_INVALID", sender);
|
||||||
return;
|
return;
|
||||||
@ -50,9 +54,9 @@ public class VerifyCommand extends SWCommand {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if(bytes[0] == 'D' && bytes[1] == 'C') {
|
if(bytes[0] == 'D' && bytes[1] == 'C') {
|
||||||
Member member = AuthManager.connectAuth(SteamwarUser.get(sender.getName()), code);
|
Member member = AuthManager.connectAuth(SteamwarUser.get(sender.getName()), strings[0]);
|
||||||
if(member != null) {
|
if(member != null) {
|
||||||
VelocityCore.log(sender.getName() + " Verified with Discorduser: " + member.getIdLong());
|
BungeeCore.log(sender.getName() + " Verified with Discorduser: " + member.getIdLong());
|
||||||
Message.send("VERIFY_SUCCESS", sender, member.getUser().getAsTag());
|
Message.send("VERIFY_SUCCESS", sender, member.getUser().getAsTag());
|
||||||
} else {
|
} else {
|
||||||
Message.send("VERIFY_INVALID", sender);
|
Message.send("VERIFY_INVALID", sender);
|
||||||
|
@ -19,45 +19,67 @@
|
|||||||
|
|
||||||
package de.steamwar.bungeecore.commands;
|
package de.steamwar.bungeecore.commands;
|
||||||
|
|
||||||
import de.steamwar.command.SWCommand;
|
import de.steamwar.bungeecore.Message;
|
||||||
import de.steamwar.messages.ChatSender;
|
import de.steamwar.bungeecore.sql.SWException;
|
||||||
|
import net.md_5.bungee.api.CommandSender;
|
||||||
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
import java.io.BufferedReader;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStreamReader;
|
import java.io.InputStreamReader;
|
||||||
|
|
||||||
public class WebpasswordCommand extends SWCommand {
|
public class WebregisterCommand extends BasicCommand {
|
||||||
|
|
||||||
public WebpasswordCommand() {
|
public WebregisterCommand() {
|
||||||
super("webpassword", null, "webpw", "web");
|
super("webregister", null, "web", "webpw");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void execute(CommandSender sender, String[] args) {
|
||||||
|
if(!(sender instanceof ProxiedPlayer))
|
||||||
|
return;
|
||||||
|
|
||||||
@Register(description = "WEB_USAGE")
|
ProxiedPlayer player = (ProxiedPlayer) sender;
|
||||||
public void genericCommand(ProxiedPlayer player, String password) {
|
if(args.length != 1){
|
||||||
if(password.length() < 8) {
|
Message.send("WEB_USAGE", player);
|
||||||
ChatSender.of(player).system("WEB_PASSWORD_LENGTH");
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ProcessBuilder pb = new ProcessBuilder("php", "/var/www/register.php", player.getName(), password);
|
ProcessBuilder pb = new ProcessBuilder("php", "/var/www/register.php", player.getName(), args[0]);
|
||||||
pb.redirectErrorStream(true);
|
pb.redirectErrorStream(true);
|
||||||
try {
|
try {
|
||||||
Process regProcess = pb.start();
|
Process regProcess = pb.start();
|
||||||
BufferedReader reader = new BufferedReader(new InputStreamReader(regProcess.getInputStream()));
|
BufferedReader reader = new BufferedReader(new InputStreamReader(regProcess.getInputStream()));
|
||||||
String errorLine;
|
String errorLine;
|
||||||
if((errorLine = reader.readLine()) != null) {
|
boolean error = false;
|
||||||
if ("updated".equals(errorLine)) {
|
while((errorLine = reader.readLine()) != null){
|
||||||
ChatSender.of(player).system("WEB_UPDATED");
|
switch(errorLine){
|
||||||
return;
|
case "username_exists":
|
||||||
} else {
|
Message.send("WEB_ALREADY", player);
|
||||||
throw new SecurityException("Could not create webaccount " + errorLine);
|
break;
|
||||||
|
case "email_exists":
|
||||||
|
Message.send("WEB_ALREADY_EMAIL", player);
|
||||||
|
// SWException.log("Bungee", "Duplicate E-Mail", player.getName() + " " + args[0]);
|
||||||
|
break;
|
||||||
|
case "invalid_email":
|
||||||
|
Message.send("WEB_NOT_EMAIL", player);
|
||||||
|
break;
|
||||||
|
case "email_updated":
|
||||||
|
Message.send("WEB_EMAIL_REFRESH", player);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
Message.send("WEB_INTERNAL_ERROR", player);
|
||||||
|
SWException.log("Bungee", "Unknown Wordpress User Creation Error", errorLine);
|
||||||
}
|
}
|
||||||
|
error = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
ChatSender.of(player).system("WEB_CREATED");
|
if(error)
|
||||||
|
return;
|
||||||
|
|
||||||
|
Message.send("WEB_EMAIL_SEND", player);
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
|
Message.send("WEB_INTERNAL_ERROR", player);
|
||||||
throw new SecurityException("Could not create webaccount", e);
|
throw new SecurityException("Could not create webaccount", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -20,178 +20,94 @@
|
|||||||
package de.steamwar.bungeecore.commands;
|
package de.steamwar.bungeecore.commands;
|
||||||
|
|
||||||
import de.steamwar.bungeecore.Message;
|
import de.steamwar.bungeecore.Message;
|
||||||
import de.steamwar.bungeecore.Storage;
|
import de.steamwar.bungeecore.sql.Punishment;
|
||||||
import de.steamwar.bungeecore.mods.ModUtils;
|
import de.steamwar.bungeecore.sql.SteamwarUser;
|
||||||
import de.steamwar.command.SWCommand;
|
import de.steamwar.bungeecore.sql.Team;
|
||||||
import de.steamwar.command.SWCommandUtils;
|
|
||||||
import de.steamwar.command.TypeMapper;
|
|
||||||
import de.steamwar.messages.ChatSender;
|
|
||||||
import de.steamwar.sql.*;
|
|
||||||
import lombok.Getter;
|
|
||||||
import net.md_5.bungee.BungeeCord;
|
|
||||||
import net.md_5.bungee.api.CommandSender;
|
import net.md_5.bungee.api.CommandSender;
|
||||||
import net.md_5.bungee.api.chat.ClickEvent;
|
import net.md_5.bungee.api.chat.ClickEvent;
|
||||||
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
||||||
|
|
||||||
import java.sql.Timestamp;
|
import java.sql.Timestamp;
|
||||||
import java.text.DecimalFormat;
|
import java.text.DecimalFormat;
|
||||||
import java.time.Instant;
|
import java.util.HashSet;
|
||||||
import java.util.*;
|
import java.util.List;
|
||||||
import java.util.stream.Collectors;
|
import java.util.Set;
|
||||||
import java.util.stream.Stream;
|
|
||||||
|
|
||||||
|
public class WhoisCommand extends BasicCommand {
|
||||||
public class WhoisCommand extends SWCommand {
|
public WhoisCommand(){
|
||||||
public WhoisCommand() {
|
super("whois", "bungeecore.teamchat");
|
||||||
super("whois");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Register(description = "WHOIS_USAGE")
|
@Override
|
||||||
public void genericCommand(ProxiedPlayer player, @Mapper("player") String target, WhoisParameterTypes... parameters) {
|
public void execute(CommandSender sender, String[] args) {
|
||||||
ChatSender sender = ChatSender.of(player);
|
if(!(sender instanceof ProxiedPlayer))
|
||||||
SteamwarUser user = SteamwarUser.get(target);
|
|
||||||
if (sender.user().hasPerm(UserPerm.ADMINISTRATION)) {
|
|
||||||
if (user == null) {
|
|
||||||
try {
|
|
||||||
int id = Integer.parseInt(target);
|
|
||||||
user = SteamwarUser.get(id);
|
|
||||||
} catch (NumberFormatException ignored) {
|
|
||||||
// Ignored
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (user == null) {
|
|
||||||
try {
|
|
||||||
long id = Long.parseLong(target);
|
|
||||||
user = SteamwarUser.get(id);
|
|
||||||
} catch (NumberFormatException ignored) {
|
|
||||||
// Ignored
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (user == null) {
|
|
||||||
sender.system("UNKNOWN_PLAYER");
|
|
||||||
} else {
|
|
||||||
EnumSet<WhoisParameterTypes> set = parameters.length == 0 ? EnumSet.noneOf(WhoisParameterTypes.class) : EnumSet.copyOf(Arrays.asList(parameters));
|
|
||||||
sendUserinfo(sender, user, set);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Mapper(value = "player", local = true)
|
|
||||||
public TypeMapper<String> playerTypeMapper() {
|
|
||||||
return SWCommandUtils.createMapper(s -> s, s -> BungeeCord.getInstance().getPlayers().stream().map(ProxiedPlayer::getName).collect(Collectors.toList()));
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void sendUserinfo(ChatSender sender, SteamwarUser user, EnumSet<WhoisParameterTypes> parameterTypes) {
|
|
||||||
Team team = Team.get(user.getTeam());
|
|
||||||
|
|
||||||
sender.system("WHOIS_USERNAME", user.getUserName());
|
|
||||||
sender.system("WHOIS_PREFIX", user.prefix().getColorCode() + user.prefix().getChatPrefix());
|
|
||||||
sender.system("WHOIS_TEAM", new Message("WHOIS_TEAM_HOVER", team.getTeamName()), new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/team info " + team.getTeamKuerzel()), team.getTeamColor(), team.getTeamKuerzel(), team.getTeamName());
|
|
||||||
|
|
||||||
if (!sender.user().hasPerm(UserPerm.TEAM))
|
|
||||||
return;
|
return;
|
||||||
|
ProxiedPlayer player = (ProxiedPlayer) sender;
|
||||||
|
|
||||||
if (sender.user().hasPerm(UserPerm.MODERATION)) {
|
if(args.length == 0){
|
||||||
sender.system("WHOIS_ID", user.getId());
|
Message.send("WHOIS_USAGE", player);
|
||||||
sender.system("WHOIS_UUID", new Message("WHOIS_UUID_HOVER"), new ClickEvent(ClickEvent.Action.COPY_TO_CLIPBOARD, user.getUUID().toString()), user.getUUID().toString());
|
return;
|
||||||
if (user.getDiscordId() != null)
|
|
||||||
sender.system("WHOIS_DISCORD_ID", user.getDiscordId());
|
|
||||||
|
|
||||||
sender.system("WHOIS_PERMS", user.perms().stream().map(Enum::name).collect(Collectors.joining(", ")));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ProxiedPlayer target = BungeeCord.getInstance().getPlayer(user.getUUID());
|
SteamwarUser user = SteamwarUser.get(args[0]);
|
||||||
|
if(user == null){
|
||||||
|
try {
|
||||||
|
int id = Integer.parseInt(args[0]);
|
||||||
|
user = SteamwarUser.get(id);
|
||||||
|
}catch (NumberFormatException ignored) {}
|
||||||
|
}
|
||||||
|
if (user == null) {
|
||||||
|
try {
|
||||||
|
long id = Long.parseLong(args[0]);
|
||||||
|
user = SteamwarUser.get(id);
|
||||||
|
} catch (NumberFormatException ignored) {
|
||||||
|
// Ignored
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(user == null) {
|
||||||
|
Message.send("UNKNOWN_PLAYER", player);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean all = false;
|
||||||
|
if(args.length > 1 && args[1].startsWith("-")) {
|
||||||
|
all = args[1].contains("a");
|
||||||
|
}
|
||||||
|
|
||||||
|
sendUserinfo(player, user, all);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void sendUserinfo(ProxiedPlayer player, SteamwarUser user, boolean all) {
|
||||||
|
Message.send("WHOIS_USERNAME", player, user.getUserName());
|
||||||
|
Message.send("WHOIS_UUID", player, Message.parse("WHOIS_UUID_HOVER", player), new ClickEvent(ClickEvent.Action.COPY_TO_CLIPBOARD, user.getUuid().toString()), user.getUuid().toString());
|
||||||
|
Message.send("WHOIS_ID", player, user.getId());
|
||||||
|
if (user.getDiscordId() != null) {
|
||||||
|
Message.send("WHOIS_DISCORD_ID", player, user.getDiscordId());
|
||||||
|
}
|
||||||
Timestamp firstJoin = user.getFirstjoin();
|
Timestamp firstJoin = user.getFirstjoin();
|
||||||
double onlineTime = user.getOnlinetime();
|
if(firstJoin == null)
|
||||||
if(firstJoin == null && target != null) {
|
Message.send("WHOIS_JOINED_FIRST", player, "0000-00-00 00:00:00");
|
||||||
firstJoin = Storage.sessions.get(target);
|
else
|
||||||
}
|
Message.send("WHOIS_JOINED_FIRST", player, firstJoin.toString());
|
||||||
|
Message.send("WHOIS_HOURS_PLAYED", player, new DecimalFormat("###.##").format(user.getOnlinetime() / (double) 3600));
|
||||||
|
|
||||||
if(firstJoin != null)
|
Team team = Team.get(user.getTeam());
|
||||||
sender.system("WHOIS_JOINED_FIRST", firstJoin.toString());
|
Message.send("WHOIS_TEAM", player, Message.parse("WHOIS_TEAM_HOVER", player, team.getTeamName()), new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/team info " + team.getTeamKuerzel()), team.getTeamColor(), team.getTeamKuerzel(), team.getTeamName());
|
||||||
sender.system("WHOIS_HOURS_PLAYED", new DecimalFormat("###.##").format(onlineTime / 3600d));
|
|
||||||
|
|
||||||
if(target != null) {
|
Message.send("WHOIS_PUNISHMENTS", player);
|
||||||
sender.system("WHOIS_CURRENT_PLAYED", new DecimalFormat("####.##").format((Instant.now().getEpochSecond() - Storage.sessions.get(target).toInstant().getEpochSecond()) / 60d));
|
|
||||||
sender.system("WHOIS_CURRENT_SERVER", target.getServer().getInfo().getName());
|
|
||||||
sender.system("WHOIS_CURRENT_PROTOCOL", target.getPendingConnection().getVersion());
|
|
||||||
|
|
||||||
List<Mod> mods = ModUtils.getPlayerModMap().get(user.getUUID());
|
|
||||||
if(mods == null)
|
|
||||||
mods = Collections.emptyList();
|
|
||||||
|
|
||||||
sender.system("WHOIS_PLATFORM", mods.isEmpty() ? "Vanilla" : mods.get(0).getPlatform().toString());
|
|
||||||
|
|
||||||
if (parameterTypes.contains(WhoisParameterTypes.MOD)) {
|
|
||||||
if (!mods.isEmpty()) {
|
|
||||||
sender.system("WHOIS_ACTIVE_MODS", mods.size(), mods.stream().map(mod -> "§" + mod.getModType().getColorCode() + mod.getModName()).collect(Collectors.joining("§8, ")));
|
|
||||||
} else {
|
|
||||||
sender.system("WHOIS_NO_ACTIVE_MODS");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sender.system("WHOIS_PUNISHMENTS");
|
|
||||||
List<Punishment> punishmentList = Punishment.getAllPunishmentsOfPlayer(user.getId());
|
List<Punishment> punishmentList = Punishment.getAllPunishmentsOfPlayer(user.getId());
|
||||||
Set<Punishment.PunishmentType> found = new HashSet<>();
|
Set<Punishment.PunishmentType> found = new HashSet<>();
|
||||||
boolean isPunished = false;
|
boolean isPunished = false;
|
||||||
boolean all = parameterTypes.contains(WhoisParameterTypes.ALL);
|
|
||||||
for (Punishment punishment : punishmentList) {
|
for (Punishment punishment : punishmentList) {
|
||||||
if (!all && !punishment.getType().isMulti() && !found.add(punishment.getType())) {
|
if (!all && !punishment.getType().isMulti() && !found.add(punishment.getType())) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (!all && !punishment.isCurrent()) {
|
Message.sendPrefixless("WHOIS_PUNISHMENT", player, SteamwarUser.get(punishment.getPunisher()).getUserName(), punishment.getType().name(), punishment.getBantime(punishment.getStartTime(), false), punishment.getBantime(punishment.getEndTime(), punishment.isPerma()), punishment.getReason());
|
||||||
continue;
|
|
||||||
}
|
|
||||||
sender.prefixless("WHOIS_PUNISHMENT", SteamwarUser.get(punishment.getPunisher()).getUserName(), punishment.getType().name(), punishment.getBantime(punishment.getStartTime(), false), punishment.getBantime(punishment.getEndTime(), punishment.isPerma()), punishment.getReason());
|
|
||||||
isPunished = true;
|
isPunished = true;
|
||||||
}
|
}
|
||||||
if (!isPunished) {
|
if (!isPunished) {
|
||||||
sender.system(all ? "WHOIS_NO_ALL_PUNISHMENT" : "WHOIS_NO_PUNISHMENT");
|
Message.send(all ? "WHOIS_NO_ALL_PUNISHMENT" : "WHOIS_NO_PUNISHMENT", player);
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@ClassMapper(value = WhoisParameterTypes.class, local = true)
|
|
||||||
public TypeMapper<WhoisParameterTypes> argumentTypeMapper() {
|
|
||||||
WhoisParameterTypes[] values = WhoisParameterTypes.values();
|
|
||||||
|
|
||||||
return new TypeMapper<WhoisParameterTypes>() {
|
|
||||||
@Override
|
|
||||||
public WhoisParameterTypes map(CommandSender commandSender, String[] previousArguments, String s) {
|
|
||||||
SteamwarUser user = SteamwarUser.get(((ProxiedPlayer) commandSender).getUniqueId());
|
|
||||||
return Stream.of(values)
|
|
||||||
.filter(p -> user.hasPerm(p.perm))
|
|
||||||
.filter(p -> p.getTabCompletes().contains(s))
|
|
||||||
.findFirst()
|
|
||||||
.orElse(null);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Collection<String> tabCompletes(CommandSender commandSender, String[] previousArguments, String s) {
|
|
||||||
SteamwarUser user = SteamwarUser.get(((ProxiedPlayer) commandSender).getUniqueId());
|
|
||||||
return Stream.of(values)
|
|
||||||
.filter(p -> user.hasPerm(p.perm))
|
|
||||||
.flatMap(p -> p.getTabCompletes().stream())
|
|
||||||
.collect(Collectors.toList());
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
private enum WhoisParameterTypes {
|
|
||||||
ALL(Arrays.asList("-a", "-all"), UserPerm.TEAM),
|
|
||||||
MOD(Arrays.asList("-m", "-mod", "-mods"), UserPerm.MODERATION);
|
|
||||||
|
|
||||||
private final UserPerm perm;
|
|
||||||
|
|
||||||
@Getter
|
|
||||||
private List<String> tabCompletes;
|
|
||||||
|
|
||||||
|
|
||||||
WhoisParameterTypes(List<String> tabCompletes, UserPerm perm) {
|
|
||||||
this.perm = perm;
|
|
||||||
this.tabCompletes = tabCompletes;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
47
src/de/steamwar/bungeecore/comms/BungeePacket.java
Normale Datei
47
src/de/steamwar/bungeecore/comms/BungeePacket.java
Normale Datei
@ -0,0 +1,47 @@
|
|||||||
|
/*
|
||||||
|
This file is a part of the SteamWar software.
|
||||||
|
|
||||||
|
Copyright (C) 2020 SteamWar.de-Serverteam
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Affero General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Affero General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Affero General Public License
|
||||||
|
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.steamwar.bungeecore.comms;
|
||||||
|
|
||||||
|
import com.google.common.io.ByteArrayDataOutput;
|
||||||
|
import com.google.common.io.ByteStreams;
|
||||||
|
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
||||||
|
import net.md_5.bungee.api.connection.Server;
|
||||||
|
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
|
||||||
|
public abstract class BungeePacket {
|
||||||
|
|
||||||
|
public void send(Server server) {
|
||||||
|
ByteArrayDataOutput out = ByteStreams.newDataOutput();
|
||||||
|
out.writeByte(getId());
|
||||||
|
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
|
||||||
|
writeVars(out);
|
||||||
|
out.writeUTF(outputStream.toByteArray().toString());
|
||||||
|
server.sendData("sw:bridge", out.toByteArray());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void send(ProxiedPlayer player) {
|
||||||
|
send(player.getServer());
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract int getId();
|
||||||
|
|
||||||
|
public abstract void writeVars(ByteArrayDataOutput byteArrayDataOutput);
|
||||||
|
}
|
43
src/de/steamwar/bungeecore/comms/PacketIdManager.java
Normale Datei
43
src/de/steamwar/bungeecore/comms/PacketIdManager.java
Normale Datei
@ -0,0 +1,43 @@
|
|||||||
|
/*
|
||||||
|
This file is a part of the SteamWar software.
|
||||||
|
|
||||||
|
Copyright (C) 2020 SteamWar.de-Serverteam
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Affero General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Affero General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Affero General Public License
|
||||||
|
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.steamwar.bungeecore.comms;
|
||||||
|
|
||||||
|
public class PacketIdManager {
|
||||||
|
|
||||||
|
//0x0(X) Standalone Packets
|
||||||
|
public static final byte PING_PACKET = 0x01;
|
||||||
|
public static final byte TABLIST_NAME = 0x02;
|
||||||
|
public static final byte PREPARE_SCHEM = 0x03;
|
||||||
|
public static final byte BAUMEMBER_UPDATE = 0x04;
|
||||||
|
public static final byte EXECUTE_COMMAND = 0x05;
|
||||||
|
|
||||||
|
public static final byte LOCALE_INVALIDATION = 0x06;
|
||||||
|
|
||||||
|
//0x1(X) Bungee Inventory
|
||||||
|
public static final byte INVENTORY_PACKET = 0x10;
|
||||||
|
public static final byte INVENTORY_CALLBACK_PACKET = 0x11;
|
||||||
|
public static final byte INVENTORY_CLOSE_PACKET = 0x12;
|
||||||
|
|
||||||
|
//0x2(X) Server Information System
|
||||||
|
public static final byte I_AM_A_LOBBY = 0x20;
|
||||||
|
public static final byte FIGHT_INFO = 0x21;
|
||||||
|
public static final byte FIGHT_ENDS = 0x22;
|
||||||
|
public static final byte STARTING_SERVER = 0x23;
|
||||||
|
}
|
28
src/de/steamwar/bungeecore/comms/SpigotHandler.java
Normale Datei
28
src/de/steamwar/bungeecore/comms/SpigotHandler.java
Normale Datei
@ -0,0 +1,28 @@
|
|||||||
|
/*
|
||||||
|
This file is a part of the SteamWar software.
|
||||||
|
|
||||||
|
Copyright (C) 2020 SteamWar.de-Serverteam
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Affero General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Affero General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Affero General Public License
|
||||||
|
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.steamwar.bungeecore.comms;
|
||||||
|
|
||||||
|
import com.google.common.io.ByteArrayDataInput;
|
||||||
|
import net.md_5.bungee.api.config.ServerInfo;
|
||||||
|
|
||||||
|
public interface SpigotHandler {
|
||||||
|
|
||||||
|
void handle(ByteArrayDataInput in, ServerInfo info);
|
||||||
|
}
|
66
src/de/steamwar/bungeecore/comms/SpigotReceiver.java
Normale Datei
66
src/de/steamwar/bungeecore/comms/SpigotReceiver.java
Normale Datei
@ -0,0 +1,66 @@
|
|||||||
|
/*
|
||||||
|
This file is a part of the SteamWar software.
|
||||||
|
|
||||||
|
Copyright (C) 2020 SteamWar.de-Serverteam
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Affero General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Affero General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Affero General Public License
|
||||||
|
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package de.steamwar.bungeecore.comms;
|
||||||
|
|
||||||
|
import com.google.common.io.ByteArrayDataInput;
|
||||||
|
import com.google.common.io.ByteStreams;
|
||||||
|
import de.steamwar.bungeecore.BungeeCore;
|
||||||
|
import de.steamwar.bungeecore.comms.handlers.*;
|
||||||
|
import de.steamwar.bungeecore.listeners.BasicListener;
|
||||||
|
import net.md_5.bungee.api.ProxyServer;
|
||||||
|
import net.md_5.bungee.api.connection.Server;
|
||||||
|
import net.md_5.bungee.api.event.PluginMessageEvent;
|
||||||
|
import net.md_5.bungee.event.EventHandler;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class SpigotReceiver extends BasicListener {
|
||||||
|
|
||||||
|
private static final Map<Byte, SpigotHandler> handlerMap = new HashMap<>();
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onPluginMessage(PluginMessageEvent event) {
|
||||||
|
if(!event.getTag().equalsIgnoreCase("sw:bridge"))
|
||||||
|
return;
|
||||||
|
|
||||||
|
event.setCancelled(true);
|
||||||
|
if(!(event.getSender() instanceof Server))
|
||||||
|
return;
|
||||||
|
|
||||||
|
ByteArrayDataInput in = ByteStreams.newDataInput(event.getData());
|
||||||
|
Byte handler = in.readByte();
|
||||||
|
ProxyServer.getInstance().getScheduler().runAsync(BungeeCore.get(), () -> handlerMap.get(handler).handle(in, ((Server) event.getSender()).getInfo()));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void registerHandler(Byte id, SpigotHandler handler) {
|
||||||
|
handlerMap.put(id, handler);
|
||||||
|
}
|
||||||
|
|
||||||
|
static {
|
||||||
|
registerHandler(PacketIdManager.INVENTORY_CALLBACK_PACKET, new InventoryCallbackHandler());
|
||||||
|
registerHandler(PacketIdManager.TABLIST_NAME, (in, info) -> {});
|
||||||
|
registerHandler(PacketIdManager.PREPARE_SCHEM, new PrepareSchemHandler());
|
||||||
|
registerHandler(PacketIdManager.I_AM_A_LOBBY, new ImALobbyHandler());
|
||||||
|
registerHandler(PacketIdManager.FIGHT_INFO, new FightInfoHandler());
|
||||||
|
registerHandler(PacketIdManager.EXECUTE_COMMAND, new ExecuteCommandHandler());
|
||||||
|
registerHandler(PacketIdManager.FIGHT_ENDS, new FightEndsHandler());
|
||||||
|
}
|
||||||
|
}
|
@ -17,20 +17,20 @@
|
|||||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package de.steamwar.bungeecore.network.handlers;
|
package de.steamwar.bungeecore.comms.handlers;
|
||||||
|
|
||||||
import de.steamwar.bungeecore.VelocityCore;
|
import com.google.common.io.ByteArrayDataInput;
|
||||||
import de.steamwar.sql.SteamwarUser;
|
import de.steamwar.bungeecore.comms.SpigotHandler;
|
||||||
import de.steamwar.network.packets.PacketHandler;
|
import de.steamwar.bungeecore.sql.SteamwarUser;
|
||||||
import de.steamwar.network.packets.client.ExecuteCommandPacket;
|
import net.md_5.bungee.api.ProxyServer;
|
||||||
|
import net.md_5.bungee.api.config.ServerInfo;
|
||||||
|
|
||||||
public class ExecuteCommandHandler extends PacketHandler {
|
public class ExecuteCommandHandler implements SpigotHandler {
|
||||||
|
@Override
|
||||||
|
public void handle(ByteArrayDataInput in, ServerInfo info) {
|
||||||
|
SteamwarUser target = SteamwarUser.get(in.readInt());
|
||||||
|
String command = in.readUTF();
|
||||||
|
|
||||||
@Handler
|
ProxyServer.getInstance().getPluginManager().dispatchCommand(ProxyServer.getInstance().getPlayer(target.getUuid()), command);
|
||||||
public void handle(ExecuteCommandPacket packet) {
|
|
||||||
SteamwarUser target = SteamwarUser.get(packet.getPlayerId());
|
|
||||||
String command = packet.getCommand();
|
|
||||||
|
|
||||||
VelocityCore.get().getProxyServer().getPlayer(target.getUUID()).ifPresent(player -> VelocityCore.get().getProxyServer().getCommandManager().executeAsync(player, command));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
Einige Dateien werden nicht angezeigt, da zu viele Dateien in diesem Diff geändert wurden Mehr anzeigen
In neuem Issue referenzieren
Einen Benutzer sperren