diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 000000000..5c4f2c087 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,58 @@ +name: Java CI + +on: + pull_request: + push: + branches: + - master + schedule: + - cron: '0 0 * * 0' # weekly + +jobs: + build: + runs-on: ubuntu-latest + name: Java ${{ matrix.java }} - ${{ matrix.storageType }} + strategy: + matrix: + include: + - storageType: mariadb + java: 21 + # - storageType: h2 # disabled for now due to memory issues + # java: 21 + + steps: + - uses: actions/checkout@v2 + + - name: Set up JDK ${{ matrix.java }} + uses: actions/setup-java@v1 + with: + java-version: ${{ matrix.java }} + + - name: Validate Gradle wrapper + uses: gradle/wrapper-validation-action@v1 + + - name: Setup Gradle + uses: gradle/gradle-build-action@v2 + + - uses: actions/cache@v4 + with: + path: | + .gradle/loom-cache + key: ${{ runner.os }}-gradle-${{ hashFiles('**/libs.versions.*', '**/*.gradle*', '**/gradle-wrapper.properties') }} + restore-keys: ${{ runner.os }}-gradle-${{ matrix.java }}- + + - name: Execute Gradle build + env: + STORAGE_TYPE: ${{ matrix.storageType }} + run: ./gradlew build --info + + - name: Publish to Maven Central + # only publish once + if: github.ref == 'refs/heads/master' && matrix.java == '21' && matrix.storageType == 'mariadb' + env: + ORG_GRADLE_PROJECT_sonatypeUsername: ${{ secrets.ORG_GRADLE_PROJECT_SONATYPEUSERNAME }} + ORG_GRADLE_PROJECT_sonatypePassword: ${{ secrets.ORG_GRADLE_PROJECT_SONATYPEPASSWORD }} + ORG_GRADLE_PROJECT_signingKey : ${{ secrets.ORG_GRADLE_PROJECT_SIGNINGINMEMORYKEY }} + ORG_GRADLE_PROJECT_signingPassword : ${{ secrets.ORG_GRADLE_PROJECT_SIGNINGINMEMORYKEYPASSWORD }} + run: | + ./gradlew publishToSonatype closeAndReleaseSonatypeStagingRepository diff --git a/.gitignore b/.gitignore index 74fc9f603..d0345e87c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,21 +1,25 @@ -*.class -.settings +# Eclipse .classpath -bin .project +.settings/ +/bin +eclipse + +# Intellij .idea *.iml -.externalToolBuilders -build.xml -.DS_Store -dependency-reduced-pom.xml +*.ipr +*.iws -# Package Files # -*.jar -*.war -*.ear +# Mac +.DS_Store -# Web Interface Files # -banmanagement/settings.php -cache -/target +# Gradle +.gradle +/local.properties +bin +build +target +/dependency-reduced-pom.xml +*-private.sh +*.txt diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index c0b2c35a6..000000000 --- a/.travis.yml +++ /dev/null @@ -1,6 +0,0 @@ -language: java -jdk: - - oraclejdk8 - - oraclejdk9 - - openjdk8 -script: mvn compile test \ No newline at end of file diff --git a/README.md b/README.md index dc8e8263d..d77915765 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,116 @@ -![BanManager](http://i.imgur.com/ZE7zXx9.png) +

+ + +

BanManager

+ +

-[![Build Status](https://travis-ci.org/BanManagement/BanManager.svg?branch=master)](https://travis-ci.org/BanManagement/BanManager) -============== -The Java based plugin for Bukkit and is released under the Creative Commons Attribution-NonCommercial-ShareAlike 2.0 UK: England & Wales +

+ The defacto plugin for Minecraft to manage punishments and moderate more effectively +

-BukkitDev - http://dev.bukkit.org/server-mods/ban-management/ +

+ + Website + | + Docs + | + Demo + +

+

+ + + + + + +

+ +## Overview +- **Free.** Open source and free to use +- **Robust.** Used and battle tested by some of the largest Minecraft servers +- **Maintained.** Actively developed since 2012, 10+ years +- **Cross platform.** Supports Bukkit, Spigot, Bungeecord & Sponge +- **Feature rich.** An advanced punishment system, reports, appeals, network friendly and [website compatible](https://github.com/BanManagement/BanManager-WebUI) +- **Flexible.** [Fully customisable](https://banmanagement.com/docs/banmanager/configuration) with [extensive player permissions](https://banmanagement.com/docs/banmanager/permissions) + +To learn more about configuration, usage and features of BanManager, take a look at [the website](https://banmanagement.com/docs/banmanager/configuration) or view [the website demo](https://demo.banmanagement.com). + +## Requirements +- Java 8+ (JDK21+ required to build from source) +- CraftBukkit/Spigot/Paper, BungeeCord or Sponge for Minecraft 1.7.2+ +- Optionally [MySQL or MariaDB](https://banmanagement.com/docs/banmanager/install#setup-shared-database-optional) + +## Installation +- Download from https://banmanagement.com/download +- Copy jar to plugins (Spigot/BungeeCord) or mods (Sponge) folder +- For further instructions on how to support multiple servers [click here](https://banmanagement.com/docs/banmanager/install-network) + +## Commands +View [full list here](https://banmanagement.com/docs/banmanager/commands) +- `/ban ` - Permanently ban a player, requires permission, requires permission `bm.command.ban` +- `/tempban ` - Temporarily ban a player, requires permission `bm.command.tempban` +- `/unban [reason]` - Unban a player, requires permission `bm.command.unban` +- `/mute ` - Permanently mute a player, requires permission `bm.command.mute` +- `/tempmute ` - Temporarily mute a player, requires permission `bm.command.tempmute` +- `/unmute [reason]` - Unmute a player, requires permission `bm.command.unmute` +- `/banip ` - Permanently ban an ip address or ip of a player, requires permission `bm.command.banip` +- `/tempbanip ` - Temporarily ban an ip address or ip of a player, requires permission `bm.command.tempbanip` +- `/unbanip [reason]` - Unban an ip address, requires permission `bm.command.unbanip` +- `/muteip ` - Permanently mute an ip address or ip of a player, requires permission `bm.command.muteip` +- `/tempmuteip ` - Temporarily mute an ip address or ip of a player, requires permission `bm.command.tempmuteip` +- `/unmuteip [reason]` - Unmute an ip address, requires permission `bm.command.unmuteip` +- `/baniprange ` - Permanently ban a cidr or wildcard ip range, e.g. 192.168.0.1/16 or 192.168.*.*, requires permission `bm.command.baniprange` +- `/tempbaniprange ` - Temporarily ban a cidr or wildcard ip range, requires permission `bm.command.tempbaniprange` +- `/unbaniprange ` - Unban an ip range, requires permission `bm.command.unbaniprange` +- `/warn ` - Warn a player, requires permission `bm.command.warn` +- `/tempwarn ` - Temporarily warn a player, requires permission `bm.command.tempwarn` +- `/dwarn ` - Delete the last warning a player received, requires permission `bm.command.dwarn` +- `/addnote ` - Add a note against a player, requires permission `bm.command.addnote` +- `/notes [player]` - View notes of all online players or a particular player, requires permission `bm.command.notes` +- `/kick ` - Kick a player from the server, requires permission `bm.command.kick` +- `/nlkick ` - Kick a player from the server without logging the kick if kick logging enabled, requires permission `bm.command.nlkick` +- `/bminfo [player]` - Look up information of a player, requires permission `bm.command.bminfo` +- `/bmimport`, Check the [migration guides](https://banmanagement.com/docs/banmanager/migrations) for more information, requires permission `bm.command.import` +- `/bmexport ` - Export bans to vanilla format, requires permission `bm.command.export` +- `/bmreload` - Reload plugin configuration and messages (excludes database connection info), requires permission `bm.command.reload` +- `/banlist [players || ipranges || ips]` - List all bans stored in memory, requires permission `bm.command.banlist` +- `/bmsync ` - Force the server to syncronise with the database, requires permission `bm.command.sync` +- `/bmclear [banrecords || baniprecords || kicks || muterecords || notes || warnings]` - Clear all records of a player or specify a type, requires permission `bm.command.clear` +- `/bmdelete ` - Delete specific records for a player based on ids from /bminfo, requires permission `bm.command.delete` +- `/bmactivity [player]` - View recent activity of staff, or a particular player, requires permission `bm.command.bmactivity` +- `/alts ` - List players which have the same ip address, requires permission `bm.command.alts` +- `/report ` - Report a player for rule breaking, logs their location and the actors location, as well as other data, requires permission `bm.command.report` +- `/reports` - Report management, executes list by default, requires permission `bm.command.reports` +- `/reports assign [player]` - Assign a report to a player, if none given assigns to self, requires permission `bm.command.reports.assign` +- `/reports close [/command || comment]` - Marks a report as closed, with an optional comment or command, requires permission `bm.command.reports.close` +- `/reports list [page] [state]` - Lists reports, requires permission `bm.command.reports.list` +- `/reports tp ` - Teleports you to where the report was created, requires permission `bm.command.reports.tp` +- `/reports unassign ` - Unassigns reports from a player, requires permission `bm.command.reports.unassign` +- `/bmrollback [types]` - Allows rolling back malicious actions by a staff member, requires permission `bm.command.bmrollback` +- `/banname ` - Ban any players with the name specified, requires permission `bm.command.banname` +- `/tempbanname ` - Temporarily ban a name, requires permission `bm.command.tempbanname` +- `/unbanname [reason]` - Unban a name, requires permission `bm.command.unbanname` +- `/bmutils ` - Utility commands to aid with resolving issues, requires permission `bm.command.bmutils` +- `/bmutils duplicates [UUID] [newName]` - Finds duplicate player names and allows manual updating of a player name, requires permission `bm.command.bmutils.duplicates` +- `/bmutils missingplayers` - Finds missing player records associated to punishments and creates them, requires permission `bm.command.bmutils.missingplayers` + +## Permissions +View [full list here](https://banmanagement.com/docs/banmanager/permissions) + +## Development +``` +git clone git@github.com:BanManagement/BanManager.git +``` + +## Contributing +If you'd like to contribute, please fork the repository and use a feature branch. Pull requests are warmly welcome. + +## Help / Bug / Feature Request +If you have found a bug please [open an issue](https://github.com/BanManagement/BanManager/issues/new) with as much detail as possible, including relevant logs and screenshots where applicable + +Have an idea for a new feature? Feel free to [open an issue](https://github.com/BanManagement/BanManager/issues/new) or [join us on Discord](https://discord.gg/59bsgZB) to chat + +## License +Free to use under the [Creative Commons Attribution-NonCommercial-ShareAlike 2.0 UK: England & Wales](LICENCE) diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 000000000..8d5779835 --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,25 @@ +logger.lifecycle(""" +******************************************* + You are building BanManager! + If you encounter trouble: + 1) Try running 'build' in a separate Gradle run + 2) Use gradlew and not gradle + 3) If you still need help, ask on Discord! Further information https://banmanagement.com/support + + Output files will be in [subproject]/build/libs +******************************************* +""") + +plugins { + id("io.github.gradle-nexus.publish-plugin") version "2.0.0" + id("io.freefair.aggregate-javadoc") version "8.11" +} + +nexusPublishing { + repositories { + sonatype { //only for users registered in Sonatype after 24 Feb 2021 + nexusUrl.set(uri("https://s01.oss.sonatype.org/service/local/")) + snapshotRepositoryUrl.set(uri("https://s01.oss.sonatype.org/content/repositories/snapshots/")) + } + } +} diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts new file mode 100644 index 000000000..f0c9637f4 --- /dev/null +++ b/buildSrc/build.gradle.kts @@ -0,0 +1,25 @@ +plugins { + `kotlin-dsl` + kotlin("jvm") version embeddedKotlinVersion +} + +repositories { + mavenCentral() + gradlePluginPortal() + maven { + name = "sponge" + url = uri("https://repo.spongepowered.org/repository/maven-public/") + } + maven { + name = "Fabric" + url = uri("https://maven.fabricmc.net/") + } +} + +dependencies { + implementation(gradleApi()) + implementation("com.gradleup.shadow:com.gradleup.shadow.gradle.plugin:9.0.0-beta4") + implementation("org.jfrog.buildinfo:build-info-extractor-gradle:5.2.5") + implementation("org.spongepowered:spongegradle-plugin-development:2.3.0") + implementation("fabric-loom:fabric-loom.gradle.plugin:1.9-SNAPSHOT") +} diff --git a/buildSrc/src/main/kotlin/CommonConfig.kt b/buildSrc/src/main/kotlin/CommonConfig.kt new file mode 100644 index 000000000..c30fb2110 --- /dev/null +++ b/buildSrc/src/main/kotlin/CommonConfig.kt @@ -0,0 +1,34 @@ +import org.gradle.api.Project +import org.gradle.api.plugins.JavaPluginExtension +import org.gradle.jvm.toolchain.JavaLanguageVersion +import org.gradle.kotlin.dsl.* + +fun Project.applyCommonConfiguration() { + group = rootProject.group + version = rootProject.version + + repositories { + mavenCentral() + maven { url = uri("https://repo.codemc.io/repository/maven-public/") } + maven { url = uri("https://ci.frostcast.net/plugin/repository/everything") } + } + + dependencies { + "compileOnly"("org.projectlombok:lombok:1.18.36") + "annotationProcessor"("org.projectlombok:lombok:1.18.36") + + "testCompileOnly"("org.projectlombok:lombok:1.18.36") + "testAnnotationProcessor"("org.projectlombok:lombok:1.18.36") + } + + configurations.all { + resolutionStrategy { + cacheChangingModulesFor(5, "MINUTES") + } + } + + plugins.withId("java") { + the().setSourceCompatibility("1.8") + the().setTargetCompatibility("1.8") + } +} diff --git a/buildSrc/src/main/kotlin/GradleExtras.kt b/buildSrc/src/main/kotlin/GradleExtras.kt new file mode 100644 index 000000000..e7d1e0ede --- /dev/null +++ b/buildSrc/src/main/kotlin/GradleExtras.kt @@ -0,0 +1,12 @@ +import org.gradle.api.Project +import org.gradle.api.plugins.ExtraPropertiesExtension +import org.gradle.api.plugins.JavaPluginConvention +import org.gradle.api.tasks.SourceSetContainer +import org.gradle.kotlin.dsl.getByType +import org.gradle.kotlin.dsl.the + +val Project.ext: ExtraPropertiesExtension + get() = extensions.getByType() + +val Project.sourceSets: SourceSetContainer + get() = the().sourceSets diff --git a/buildSrc/src/main/kotlin/LibsConfig.kt b/buildSrc/src/main/kotlin/LibsConfig.kt new file mode 100644 index 000000000..46abf3375 --- /dev/null +++ b/buildSrc/src/main/kotlin/LibsConfig.kt @@ -0,0 +1,201 @@ +import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.api.artifacts.ModuleDependency +import org.gradle.api.attributes.Bundling +import org.gradle.api.attributes.Category +import org.gradle.api.attributes.DocsType +import org.gradle.api.attributes.LibraryElements +import org.gradle.api.attributes.Usage +import org.gradle.api.attributes.java.TargetJvmVersion +import org.gradle.api.component.AdhocComponentWithVariants +import org.gradle.api.component.SoftwareComponentFactory +import org.gradle.api.file.DuplicatesStrategy +import org.gradle.api.plugins.JavaPluginExtension +import org.gradle.api.publish.PublishingExtension +import org.gradle.api.publish.maven.MavenPublication +import org.gradle.api.tasks.bundling.Jar +import org.gradle.api.tasks.javadoc.Javadoc +import org.gradle.external.javadoc.StandardJavadocDocletOptions +import org.gradle.plugins.signing.* +import org.gradle.kotlin.dsl.* +import javax.inject.Inject + +fun Project.applyLibrariesConfiguration() { + apply(plugin = "java-base") + apply(plugin = "maven-publish") + apply(plugin = "signing") + apply(plugin = "com.gradleup.shadow") + + repositories { + mavenCentral() + maven { url = uri("https://repo.codemc.io/repository/maven-public/") } + maven { url = uri("https://ci.frostcast.net/plugin/repository/everything") } + } + + configurations { + create("shade") + } + + plugins.withId("java") { + the().setSourceCompatibility("1.8") + the().setTargetCompatibility("1.8") + } + + group = "${rootProject.group}.BanManagerLibs" + + tasks.register("jar") { + configurations = listOf(project.configurations["shade"]) + archiveClassifier.set("") + } + val altConfigFiles = { artifactType: String -> + val deps = configurations["shade"].incoming.dependencies + .filterIsInstance() + .map { it.copy() } + .map { dependency -> + dependency.artifact { + name = dependency.name + type = artifactType + extension = "jar" + classifier = artifactType + } + dependency + } + + files(configurations.detachedConfiguration(*deps.toTypedArray()) + .resolvedConfiguration.lenientConfiguration.artifacts + .filter { it.classifier == artifactType } + .map { zipTree(it.file) }) + } + + tasks.register("sourcesJar") { + from({ + altConfigFiles("sources") + }) + archiveClassifier.set("sources") + } + + tasks.register("javadocJar") { + from({ + altConfigFiles("sources") + }) + archiveClassifier.set("javadoc") + } + + tasks.named("assemble").configure { + dependsOn("jar", "sourcesJar", "javadocJar") + } + + project.apply() + + val libsComponent = project.components["libs"] as AdhocComponentWithVariants + + val apiElements = project.configurations.register("apiElements") { + isVisible = false + description = "API elements for libs" + isCanBeResolved = false + isCanBeConsumed = true + attributes { + attribute(Usage.USAGE_ATTRIBUTE, project.objects.named(Usage.JAVA_API)) + attribute(Category.CATEGORY_ATTRIBUTE, project.objects.named(Category.LIBRARY)) + attribute(Bundling.BUNDLING_ATTRIBUTE, project.objects.named(Bundling.SHADOWED)) + attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, project.objects.named(LibraryElements.JAR)) + attribute(TargetJvmVersion.TARGET_JVM_VERSION_ATTRIBUTE, 8) + } + outgoing.artifact(tasks.named("jar")) + } + + val runtimeElements = project.configurations.register("runtimeElements") { + isVisible = false + description = "Runtime elements for libs" + isCanBeResolved = false + isCanBeConsumed = true + attributes { + attribute(Usage.USAGE_ATTRIBUTE, project.objects.named(Usage.JAVA_RUNTIME)) + attribute(Category.CATEGORY_ATTRIBUTE, project.objects.named(Category.LIBRARY)) + attribute(Bundling.BUNDLING_ATTRIBUTE, project.objects.named(Bundling.SHADOWED)) + attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, project.objects.named(LibraryElements.JAR)) + attribute(TargetJvmVersion.TARGET_JVM_VERSION_ATTRIBUTE, 8) + } + outgoing.artifact(tasks.named("jar")) + } + + val sourcesElements = project.configurations.register("sourcesElements") { + isVisible = false + description = "Source elements for libs" + isCanBeResolved = false + isCanBeConsumed = true + attributes { + attribute(Usage.USAGE_ATTRIBUTE, project.objects.named(Usage.JAVA_RUNTIME)) + attribute(Category.CATEGORY_ATTRIBUTE, project.objects.named(Category.DOCUMENTATION)) + attribute(Bundling.BUNDLING_ATTRIBUTE, project.objects.named(Bundling.SHADOWED)) + attribute(DocsType.DOCS_TYPE_ATTRIBUTE, project.objects.named(DocsType.SOURCES)) + } + outgoing.artifact(tasks.named("sourcesJar")) + outgoing.artifact(tasks.named("javadocJar")) + } + + libsComponent.addVariantsFromConfiguration(apiElements.get()) { + mapToMavenScope("compile") + } + + libsComponent.addVariantsFromConfiguration(runtimeElements.get()) { + mapToMavenScope("runtime") + } + + libsComponent.addVariantsFromConfiguration(sourcesElements.get()) { + mapToMavenScope("runtime") + } + + configure { + publications { + register("maven") { + from(libsComponent) + + pom { + name.set("BanManagerLibs") + description.set("BanManager shared libs") + url.set("https://github.com/BanManagement/BanManager/") + licenses { + license { + name.set("Creative Commons Attribution-NonCommercial-ShareAlike 2.0 UK: England & Wales") + url.set("https://github.com/BanManagement/BanManager/blob/master/LICENCE") + } + } + developers { + developer { + id.set("confuser") + name.set("James Mortemore") + email.set("jamesmortemore@gmail.com") + } + } + scm { + connection.set("scm:git:git://github.com/BanManagement/BanManager.git") + developerConnection.set("scm:git:ssh://git@github.com/BanManagement/BanManager.git") + url.set("https://github.com/BanManagement/BanManager/") + } + } + } + } + } + + configure { + val pubExt = checkNotNull(extensions.findByType(PublishingExtension::class.java)) + val publication = pubExt.publications["maven"] + + if (project.findProperty("signingKey")?.toString()?.toBoolean() == true) { + useInMemoryPgpKeys(findProperty("signingKey")?.toString(), findProperty("signingPassword")?.toString()) + + sign(publication) + } + } +} + +internal open class LibsConfigPluginHack @Inject constructor( + private val softwareComponentFactory: SoftwareComponentFactory +) : Plugin { + override fun apply(project: Project) { + val libsComponents = softwareComponentFactory.adhoc("libs") + project.components.add(libsComponents) + } +} diff --git a/buildSrc/src/main/kotlin/PlatformConfig.kt b/buildSrc/src/main/kotlin/PlatformConfig.kt new file mode 100644 index 000000000..f61ea6a54 --- /dev/null +++ b/buildSrc/src/main/kotlin/PlatformConfig.kt @@ -0,0 +1,59 @@ +import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar +import org.gradle.api.Project +import org.gradle.api.component.AdhocComponentWithVariants +import org.gradle.api.plugins.JavaPluginExtension +import org.gradle.api.plugins.quality.CheckstyleExtension +import org.gradle.api.publish.PublishingExtension +import org.gradle.api.publish.maven.MavenPublication +import org.gradle.api.tasks.javadoc.Javadoc +import org.gradle.api.tasks.testing.Test +import org.gradle.external.javadoc.StandardJavadocDocletOptions +import org.gradle.kotlin.dsl.apply +import org.gradle.kotlin.dsl.configure +import org.gradle.kotlin.dsl.dependencies +import org.gradle.kotlin.dsl.get +import org.gradle.kotlin.dsl.named +import org.gradle.kotlin.dsl.register +import org.gradle.kotlin.dsl.withType +import org.gradle.kotlin.dsl.the + +fun Project.applyPlatformAndCoreConfiguration() { + applyCommonConfiguration() + apply(plugin = "java") + apply(plugin = "maven-publish") + apply(plugin = "com.jfrog.artifactory") + + ext["internalVersion"] = "$version" + + // Java 8 turns on doclint which we fail + tasks.withType().configureEach { + (options as StandardJavadocDocletOptions).apply { + addStringOption("Xdoclint:none", "-quiet") + tags( + "apiNote:a:API Note:", + "implSpec:a:Implementation Requirements:", + "implNote:a:Implementation Note:" + ) + } + } + + the().withJavadocJar() + the().withSourcesJar() +} + +fun Project.applyShadowConfiguration() { + apply(plugin = "com.gradleup.shadow") + tasks.named("shadowJar") { + archiveClassifier.set("dist") + dependencies { + include(project(":BanManagerCommon")) + } + exclude("GradleStart**") + exclude(".cache") + exclude("LICENSE*") + } + val javaComponent = components["java"] as AdhocComponentWithVariants + javaComponent.withVariantsFromConfiguration(configurations["shadowRuntimeElements"]) { + skip() + } +} diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt new file mode 100644 index 000000000..e6a67a496 --- /dev/null +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -0,0 +1,5 @@ +object Versions { + const val JUNIT = "4.13" + const val MOCKITO = "3.7.7" + const val ADVENTURE = "4.9.3" +} diff --git a/bukkit/build.gradle.kts b/bukkit/build.gradle.kts new file mode 100644 index 000000000..d82740696 --- /dev/null +++ b/bukkit/build.gradle.kts @@ -0,0 +1,145 @@ +import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar + +plugins { + `java-library` + `maven-publish` + signing +} + +applyPlatformAndCoreConfiguration() +applyShadowConfiguration() + +publishing { + publications { + create("mavenJava") { + from(components["java"]) + + pom { + name.set("BanManagerBukkit") + description.set("BanManager for Bukkit") + url.set("https://github.com/BanManagement/BanManager/") + licenses { + license { + name.set("Creative Commons Attribution-NonCommercial-ShareAlike 2.0 UK: England & Wales") + url.set("https://github.com/BanManagement/BanManager/blob/master/LICENCE") + } + } + developers { + developer { + id.set("confuser>") + name.set("James Mortemore") + email.set("jamesmortemore@gmail.com") + } + } + scm { + connection.set("scm:git:git://github.com/BanManagement/BanManager.git") + developerConnection.set("scm:git:ssh://git@github.com/BanManagement/BanManager.git") + url.set("https://github.com/BanManagement/BanManager/") + } + } + } + } +} + +signing { + if (project.findProperty("signingKey")?.toString()?.toBoolean() == true) { + useInMemoryPgpKeys(findProperty("signingKey")?.toString(), findProperty("signingPassword")?.toString()) + + sign(publishing.publications["mavenJava"]) + } +} + +repositories { + maven { + name = "paper" + url = uri("https://repo.papermc.io/repository/maven-public/") + } + maven { + name = "ryzr-repo" + url = uri("https://cdn.rawgit.com/Rayzr522/maven-repo/master/") + } + maven { + name = "jitpack" + url = uri("https://jitpack.io/") + } + maven { + name = "Scarsz-Nexus" + url = uri("https://nexus.scarsz.me/content/groups/public/") + } + maven { + name = "placeholderapi" + url = uri("https://repo.extendedclip.com/content/repositories/placeholderapi/") + } +} + +configurations { + compileClasspath.get().extendsFrom(create("shadeOnly")) +} + +dependencies { + "api"(project(":BanManagerCommon")) { + isTransitive = true + } + "compileOnly"("org.spigotmc:spigot-api:1.17.1-R0.1-SNAPSHOT") { + exclude("junit", "junit") + } + "compileOnly"("me.clip:placeholderapi:2.10.9") + "shadeOnly"("org.bstats:bstats-bukkit:2.2.1") + "shadeOnly"("org.slf4j:slf4j-simple:1.7.36") +} + +tasks.named("processResources") { + val internalVersion = project.ext["internalVersion"] + + inputs.property("internalVersion", internalVersion) + + filesMatching("plugin.yml") { + expand("internalVersion" to internalVersion, "mainPath" to "me.confuser.banmanager.bukkit.BMBukkitPlugin") + } +} + +tasks.named("jar") { + val projectVersion = project.version + inputs.property("projectVersion", projectVersion) + manifest { + attributes("Implementation-Version" to projectVersion) + } +} + +tasks.named("shadowJar") { + configurations = listOf(project.configurations["shadeOnly"], project.configurations["runtimeClasspath"]) + + archiveBaseName.set("BanManagerBukkit") + archiveClassifier.set("") + archiveVersion.set("") + + dependencies { + include(dependency(":BanManagerCommon")) + include(dependency(":BanManagerLibs")) + + include(dependency("org.bstats:.*:.*")) + include(dependency("org.slf4j:.*:.*")) + + relocate("org.bstats", "me.confuser.banmanager.common.bstats") + relocate("org.slf4j", "me.confuser.banmanager.common.slf4j") + } + + exclude("GradleStart**") + exclude(".cache"); + exclude("LICENSE*") + exclude("META-INF/services/**") + exclude("META-INF/maven/**") + exclude("org/intellij/**") + exclude("org/jetbrains/**") + exclude("bungeecord.yml") + exclude("velocity.yml") + + minimize { + exclude(dependency("org.bstats:.*:.*")) + exclude(dependency("org.slf4j:.*:.*")) + } +} + +tasks.named("assemble").configure { + dependsOn("shadowJar") +} diff --git a/bukkit/src/main/java/me/confuser/banmanager/bukkit/BMBukkitPlugin.java b/bukkit/src/main/java/me/confuser/banmanager/bukkit/BMBukkitPlugin.java new file mode 100644 index 000000000..6c5300350 --- /dev/null +++ b/bukkit/src/main/java/me/confuser/banmanager/bukkit/BMBukkitPlugin.java @@ -0,0 +1,223 @@ +package me.confuser.banmanager.bukkit; + +import lombok.Getter; +import me.confuser.banmanager.bukkit.listeners.*; +import me.confuser.banmanager.bukkit.placeholders.PAPIPlaceholders; +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.commands.CommonCommand; +import me.confuser.banmanager.common.configs.PluginInfo; +import me.confuser.banmanager.common.configuration.ConfigurationSection; +import me.confuser.banmanager.common.configuration.file.YamlConfiguration; +import me.confuser.banmanager.common.runnables.*; +import org.bstats.bukkit.Metrics; +import org.bukkit.Bukkit; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.plugin.java.JavaPlugin; + +import java.io.File; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.Reader; + +public class BMBukkitPlugin extends JavaPlugin { + + @Getter + private BanManagerPlugin plugin; + + private String[] configs = new String[]{ + "config.yml", + "console.yml", + "discord.yml", + "exemptions.yml", + "geoip.yml", + "messages.yml", + "reasons.yml", + "schedules.yml" + }; + private Metrics metrics; + + @Override + public void onEnable() { + BukkitServer server = new BukkitServer(); + PluginInfo pluginInfo; + try { + pluginInfo = setupConfigs(); + } catch (IOException e) { + getPluginLoader().disablePlugin(this); + e.printStackTrace(); + return; + } + + metrics = new Metrics(this, 6455); + plugin = new BanManagerPlugin(pluginInfo, new PluginLogger(getLogger()), getDataFolder(), new BukkitScheduler(this), server, new BukkitMetrics(metrics)); + + server.enable(plugin); + + try { + plugin.enable(); + } catch (Exception e) { + getPluginLoader().disablePlugin(this); + e.printStackTrace(); + return; + } + + setupListeners(); + setupCommands(); + setupRunnables(); + } + + @Override + public void onDisable() { + getServer().getScheduler().cancelTasks(this); + + if (plugin != null) plugin.disable(); + } + + private PluginInfo setupConfigs() throws IOException { + for (String name : configs) { + if (!new File(getDataFolder(), name).exists()) { + this.saveResource(name, false); + } else { + File file = new File(getDataFolder(), name); + Reader defConfigStream = new InputStreamReader(getResource(file.getName()), "UTF8"); + + YamlConfiguration conf = YamlConfiguration.loadConfiguration(file); + YamlConfiguration defConfig = YamlConfiguration.loadConfiguration(defConfigStream); + conf.setDefaults(defConfig); + conf.options().copyDefaults(true); + conf.save(file); + } + } + + // Load plugin.yml + PluginInfo pluginInfo = new PluginInfo(); + Reader defConfigStream = new InputStreamReader(getResource("plugin.yml"), "UTF8"); + YamlConfiguration conf = YamlConfiguration.loadConfiguration(defConfigStream); + ConfigurationSection commands = conf.getConfigurationSection("commands"); + String pluginName = conf.getString("name"); + + if (!pluginName.equals("BanManager")) { + throw new IOException("Unable to start BanManager as " + pluginName + " has broken resource loading forcing BanManager to load their plugin.yml file; please alert the author to resolve this issue"); + } + + for (String command : commands.getKeys(false)) { + ConfigurationSection cmd = commands.getConfigurationSection(command); + + pluginInfo.setCommand(new PluginInfo.CommandInfo(command, cmd.getString("permission"), cmd.getString("usage"), cmd.getStringList("aliases"))); + } + + Bukkit.getScheduler().scheduleSyncDelayedTask(this, () -> { + plugin.getLogger().info("The following commands are blocked whilst muted:"); + plugin.getConfig().handleBlockedCommands(plugin, plugin.getConfig().getMutedBlacklistCommands()); + + plugin.getLogger().info("The following commands are blocked whilst soft muted:"); + plugin.getConfig().handleBlockedCommands(plugin, plugin.getConfig().getSoftMutedBlacklistCommands()); + }); + + return pluginInfo; + } + + public void setupListeners() { + registerEvent(new JoinListener(plugin)); + registerEvent(new LeaveListener(plugin)); + registerEvent(new CommandListener(plugin)); + registerEvent(new HookListener(plugin)); + + + String chatPriority = plugin.getConfig().getChatPriority(); + if(!chatPriority.equals("NONE")) { + ChatListener chatListener = new ChatListener(plugin); + // Set custom priority + getServer().getPluginManager().registerEvent(AsyncPlayerChatEvent.class, chatListener, EventPriority.valueOf(chatPriority), + (listener, event) -> { + ((ChatListener) listener).onPlayerChat((AsyncPlayerChatEvent) event); + ((ChatListener) listener).onIpChat((AsyncPlayerChatEvent) event); + }, this); + } + + if (plugin.getConfig().isDisplayNotificationsEnabled()) { + registerEvent(new BanListener(plugin)); + registerEvent(new MuteListener(plugin)); + registerEvent(new NoteListener(plugin)); + registerEvent(new ReportListener(plugin)); + } + + if (plugin.getDiscordConfig().isHooksEnabled()) { + registerEvent(new DiscordListener(plugin)); + } + + if(Bukkit.getPluginManager().getPlugin("PlaceholderAPI") != null) { + new PAPIPlaceholders(plugin).register(); + } + } + + private void registerEvent(Listener listener) { + getServer().getPluginManager().registerEvents(listener, this); + } + + public void setupCommands() { + for (CommonCommand cmd : plugin.getCommands()) { + try { + getCommand(cmd.getCommandName()).setExecutor(new BukkitCommand(cmd)); + } catch (NullPointerException e) { + plugin.getLogger().severe("Failed to register /" + cmd.getCommandName() + " command"); + } + } + + if (plugin.getGlobalConn() != null) { + for (CommonCommand cmd : plugin.getGlobalCommands()) { + try { + getCommand(cmd.getCommandName()).setExecutor(new BukkitCommand(cmd)); + } catch (NullPointerException e) { + plugin.getLogger().severe("Failed to register /" + cmd.getCommandName() + " command"); + } + } + } + } + + public void setupRunnables() { + Runner syncRunner; + + if (plugin.getGlobalConn() == null) { + syncRunner = new Runner(new BanSync(plugin), new MuteSync(plugin), new IpSync(plugin), new IpRangeSync(plugin), new ExpiresSync(plugin), + new WarningSync(plugin), new RollbackSync(plugin), new NameSync(plugin)); + } else { + syncRunner = new Runner(new BanSync(plugin), new MuteSync(plugin), new IpSync(plugin), new IpRangeSync(plugin), new ExpiresSync(plugin), + new WarningSync(plugin), new RollbackSync(plugin), new NameSync(plugin), + new GlobalBanSync(plugin), new GlobalMuteSync(plugin), new GlobalIpSync(plugin), new GlobalNoteSync(plugin)); + } + + plugin.setSyncRunner(syncRunner); + + setupAsyncRunnable(10L, syncRunner); + + /* + * This task should be ran last with a 1L offset as it gets modified + * above. + */ + setupAsyncRunnable((plugin.getSchedulesConfig() + .getSchedule("saveLastChecked") * 20L) + 1L, new SaveLastChecked(plugin)); + + // Purge + plugin.getScheduler().runAsync(new Purge(plugin)); + +// // TODO Refactor +// if (!plugin.getConfig().isCheckForUpdates()) return; +// +// plugin.getScheduler().runAsync(() -> { +// Updater updater = new Updater(this, 41473, getFile(), Updater.UpdateType.NO_DOWNLOAD, false); +// +// if (updater.getResult() == Updater.UpdateResult.UPDATE_AVAILABLE) { +// plugin.getScheduler().runSync(() -> registerEvent(new UpdateListener(plugin))); +// } +// }); + } + + private void setupAsyncRunnable(long length, Runnable runnable) { + if (length <= 0) return; + + getServer().getScheduler().runTaskTimerAsynchronously(this, runnable, length, length); + } +} diff --git a/bukkit/src/main/java/me/confuser/banmanager/bukkit/BukkitCommand.java b/bukkit/src/main/java/me/confuser/banmanager/bukkit/BukkitCommand.java new file mode 100644 index 000000000..16dd99e1e --- /dev/null +++ b/bukkit/src/main/java/me/confuser/banmanager/bukkit/BukkitCommand.java @@ -0,0 +1,56 @@ +package me.confuser.banmanager.bukkit; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.commands.CommonCommand; +import me.confuser.banmanager.common.commands.CommonSender; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.command.TabCompleter; +import org.bukkit.entity.Player; + +import java.lang.reflect.InvocationTargetException; +import java.util.Collections; +import java.util.List; + +public class BukkitCommand implements CommandExecutor, TabCompleter { + + private CommonCommand command; + + public BukkitCommand(CommonCommand command) { + this.command = command; + } + + @Override + public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + CommonSender commonSender = getSender(sender); + + try { + if (sender.hasPermission(this.command.getPermission())) { + return this.command.onCommand(commonSender, this.command.getParser(args)); + } else { + commonSender.sendMessage("&cYou do not have permission to use this command"); + return true; + } + } catch (NoSuchMethodException | IllegalAccessException | InstantiationException | InvocationTargetException e) { + e.printStackTrace(); + } + + return false; + } + + private CommonSender getSender(CommandSender source) { + if (source instanceof Player) { + return new BukkitPlayer((Player) source, BanManagerPlugin.getInstance().getConfig().isOnlineMode()); + } else { + return new BukkitSender(BanManagerPlugin.getInstance(), source); + } + } + + @Override + public List onTabComplete(CommandSender commandSender, Command command, String label, String[] args) { + if (!this.command.isEnableTabCompletion()) return Collections.emptyList(); + + return this.command.handlePlayerNameTabComplete(getSender(commandSender), args); + } +} diff --git a/bukkit/src/main/java/me/confuser/banmanager/bukkit/BukkitMetrics.java b/bukkit/src/main/java/me/confuser/banmanager/bukkit/BukkitMetrics.java new file mode 100755 index 000000000..3b3b80006 --- /dev/null +++ b/bukkit/src/main/java/me/confuser/banmanager/bukkit/BukkitMetrics.java @@ -0,0 +1,60 @@ +package me.confuser.banmanager.bukkit; + +import me.confuser.banmanager.common.CommonMetrics; +import org.bstats.bukkit.Metrics; +import org.bstats.charts.DrilldownPie; +import org.bstats.charts.SimplePie; + +import java.util.HashMap; +import java.util.Map; + +public class BukkitMetrics implements CommonMetrics { + private final Metrics metrics; + + public BukkitMetrics(Metrics metrics) { + this.metrics = metrics; + } + + @Override + public void submitOnlineMode(boolean online) { + metrics.addCustomChart((new SimplePie("banmanagerMode", () -> online ? "online" : "offline"))); + } + + @Override + public void submitStorageType(String storageType) { + metrics.addCustomChart((new SimplePie("storageType", () -> storageType))); + } + + @Override + public void submitStorageVersion(String version) { + metrics.addCustomChart((new DrilldownPie("storageVersion", () -> { + Map> map = new HashMap<>(); + + Map entry = new HashMap<>(); + entry.put(version, 1); + + if (version.contains("Maria")) { + map.put("MariaDB", entry); + } else { + map.put("MySQL", entry); + } + + return map; + }))); + } + + @Override + public void submitGlobalMode(boolean enabled) { + metrics.addCustomChart((new SimplePie("globalMode", () -> enabled ? "enabled" : "disabled"))); + } + + @Override + public void submitGeoMode(boolean enabled) { + metrics.addCustomChart((new SimplePie("geoMode", () -> enabled ? "enabled" : "disabled"))); + } + + @Override + public void submitDiscordMode(boolean enabled) { + metrics.addCustomChart((new SimplePie("discordMode", () -> enabled ? "enabled" : "disabled"))); + } +} diff --git a/bukkit/src/main/java/me/confuser/banmanager/bukkit/BukkitPlayer.java b/bukkit/src/main/java/me/confuser/banmanager/bukkit/BukkitPlayer.java new file mode 100644 index 000000000..7ba4b15bb --- /dev/null +++ b/bukkit/src/main/java/me/confuser/banmanager/bukkit/BukkitPlayer.java @@ -0,0 +1,138 @@ +package me.confuser.banmanager.bukkit; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.CommonPlayer; +import me.confuser.banmanager.common.CommonWorld; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.kyori.text.TextComponent; +import me.confuser.banmanager.common.kyori.text.serializer.gson.GsonComponentSerializer; +import me.confuser.banmanager.common.util.Message; +import me.confuser.banmanager.common.util.UUIDUtils; +import net.md_5.bungee.chat.ComponentSerializer; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.entity.Player; + +import java.net.InetAddress; +import java.sql.SQLException; +import java.util.UUID; + +public class BukkitPlayer implements CommonPlayer { + private Player player; + private final UUID uuid; + private InetAddress address; + private final boolean onlineMode; + + public BukkitPlayer(UUID uuid, String name, boolean onlineMode) { + this.uuid = uuid; + this.onlineMode = onlineMode; + } + + public BukkitPlayer(Player player, boolean onlineMode) { + this(player.getUniqueId(), player.getName(), onlineMode); + + this.player = player; + } + + public BukkitPlayer(Player player, boolean onlineMode, InetAddress address) { + this(player, onlineMode); + + this.address = address; + } + + public void kick(String message) { + getPlayer().kickPlayer(BukkitServer.formatMessage(message)); + } + + public void sendMessage(String message) { + if(message.isEmpty()) return; + + if(Message.isJSONMessage(message)) { + sendJSONMessage(message); + } else { + getPlayer().sendMessage(BukkitServer.formatMessage(message)); + } + } + + public void sendMessage(Message message) { + sendMessage(message.toString()); + } + + @Override + public void sendJSONMessage(TextComponent jsonString) { + getPlayer().spigot().sendMessage(ComponentSerializer.parse(GsonComponentSerializer.gson().serialize(jsonString))); + } + + @Override + public void sendJSONMessage(String message) { + getPlayer().spigot().sendMessage(ComponentSerializer.parse(message)); + } + + public boolean isConsole() { + return false; + } + + public PlayerData getData() { + try { + return BanManagerPlugin.getInstance().getPlayerStorage().queryForId(UUIDUtils.toBytes(getUniqueId())); + } catch (SQLException e) { + e.printStackTrace(); + sendMessage(Message.get("sender.error.exception").toString()); + return null; + } + } + + public boolean isOnlineMode() { + return onlineMode; + } + + public boolean hasPermission(String permission) { + return getPlayer().hasPermission(permission); + } + + public String getDisplayName() { + return getPlayer().getDisplayName(); + } + + public String getName() { + return getPlayer().getName(); + } + + public InetAddress getAddress() { + if (address != null) return address; + return getPlayer().getAddress().getAddress(); + } + + public UUID getUniqueId() { + return getPlayer().getUniqueId(); + } + + public boolean teleport(CommonWorld world, double x, double y, double z, float pitch, float yaw) { + Player player = getPlayer(); + Location location = new Location(Bukkit.getWorld(world.getName()), x, y, z, yaw, pitch); + + if (player.isInsideVehicle()) player.leaveVehicle(); + + return player.teleport(location); + } + + @Override + public boolean canSee(CommonPlayer player) { + return getPlayer().canSee(Bukkit.getPlayer(player.getUniqueId())); + } + + public boolean isOnline() { + return getPlayer() != null; + } + + private Player getPlayer() { + if (player != null) return player; + if (isOnlineMode()) return Bukkit.getServer().getPlayer(uuid); + + for (Player onlinePlayer : Bukkit.getServer().getOnlinePlayers()) { + if (UUIDUtils.createOfflineUUID(onlinePlayer.getName()).equals(uuid)) return onlinePlayer; + } + + return null; + } +} diff --git a/bukkit/src/main/java/me/confuser/banmanager/bukkit/BukkitScheduler.java b/bukkit/src/main/java/me/confuser/banmanager/bukkit/BukkitScheduler.java new file mode 100644 index 000000000..5e3a333da --- /dev/null +++ b/bukkit/src/main/java/me/confuser/banmanager/bukkit/BukkitScheduler.java @@ -0,0 +1,34 @@ +package me.confuser.banmanager.bukkit; + +import me.confuser.banmanager.common.CommonScheduler; +import org.bukkit.Bukkit; +import org.bukkit.plugin.java.JavaPlugin; + +public class BukkitScheduler implements CommonScheduler { + + private JavaPlugin plugin; + + public BukkitScheduler(JavaPlugin plugin) { + this.plugin = plugin; + } + + @Override + public void runAsync(Runnable task) { + Bukkit.getScheduler().runTaskAsynchronously(plugin, task); + } + + @Override + public void runAsyncLater(Runnable task, long delay) { + Bukkit.getScheduler().runTaskLaterAsynchronously(plugin, task, delay); + } + + @Override + public void runSync(Runnable task) { + Bukkit.getScheduler().runTask(plugin, task); + } + + @Override + public void runSyncLater(Runnable task, long delay) { + Bukkit.getScheduler().runTaskLater(plugin, task, delay); + } +} diff --git a/bukkit/src/main/java/me/confuser/banmanager/bukkit/BukkitSender.java b/bukkit/src/main/java/me/confuser/banmanager/bukkit/BukkitSender.java new file mode 100644 index 000000000..668c8a7a2 --- /dev/null +++ b/bukkit/src/main/java/me/confuser/banmanager/bukkit/BukkitSender.java @@ -0,0 +1,60 @@ +package me.confuser.banmanager.bukkit; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.commands.CommonSender; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.util.Message; +import me.confuser.banmanager.common.util.UUIDUtils; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import java.sql.SQLException; + +public class BukkitSender implements CommonSender { + + private BanManagerPlugin plugin; + private CommandSender sender; + + public BukkitSender(BanManagerPlugin plugin, CommandSender sender) { + this.plugin = plugin; + this.sender = sender; + } + + @Override + public String getName() { + return sender.getName(); + } + + @Override + public boolean hasPermission(String permission) { + return sender.hasPermission(permission); + } + + @Override + public void sendMessage(String message) { + sender.sendMessage(BukkitServer.formatMessage(message)); + } + + @Override + public void sendMessage(Message message) { + sendMessage(message.toString()); + } + + @Override + public boolean isConsole() { + return !(sender instanceof Player); + } + + @Override + public PlayerData getData() { + if (isConsole()) return plugin.getPlayerStorage().getConsole(); + + try { + return plugin.getPlayerStorage().queryForId(UUIDUtils.toBytes(((Player) sender).getUniqueId())); + } catch (SQLException e) { + e.printStackTrace(); + sender.sendMessage(Message.get("sender.error.exception").toString()); + return null; + } + } +} diff --git a/bukkit/src/main/java/me/confuser/banmanager/bukkit/BukkitServer.java b/bukkit/src/main/java/me/confuser/banmanager/bukkit/BukkitServer.java new file mode 100644 index 000000000..a6039cfb8 --- /dev/null +++ b/bukkit/src/main/java/me/confuser/banmanager/bukkit/BukkitServer.java @@ -0,0 +1,249 @@ +package me.confuser.banmanager.bukkit; + +import me.confuser.banmanager.bukkit.api.events.*; +import me.confuser.banmanager.common.*; +import me.confuser.banmanager.common.api.events.CommonEvent; +import me.confuser.banmanager.common.commands.CommonSender; +import me.confuser.banmanager.common.data.*; +import me.confuser.banmanager.common.kyori.text.TextComponent; +import me.confuser.banmanager.common.util.Message; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.World; +import org.bukkit.command.BlockCommandSender; +import org.bukkit.command.CommandSender; +import org.bukkit.command.PluginCommand; +import org.bukkit.entity.Player; +import org.bukkit.permissions.Permissible; + +import java.util.Arrays; +import java.util.Set; +import java.util.UUID; +import java.util.stream.Collectors; + +public class BukkitServer implements CommonServer { + + private BanManagerPlugin plugin; + + public BukkitServer() { + } + + public void enable(BanManagerPlugin plugin) { + this.plugin = plugin; + } + + @Override + public CommonPlayer getPlayer(UUID uniqueId) { + Player player = Bukkit.getPlayer(uniqueId); + + if (player == null) return null; + + return new BukkitPlayer(player, plugin.getConfig().isOnlineMode()); + } + + @Override + public CommonPlayer getPlayer(String name) { + Player player = Bukkit.getPlayer(name); + + if (player == null) return null; + + return new BukkitPlayer(player, plugin.getConfig().isOnlineMode()); + } + + @Override + public CommonPlayer[] getOnlinePlayers() { + return Bukkit.getOnlinePlayers().stream() + .map(player -> new BukkitPlayer(player, plugin.getConfig().isOnlineMode())) + .collect(Collectors.toList()).toArray(new CommonPlayer[0]); + } + + @Override + public void broadcast(String message, String permission) { + if(message.isEmpty()) return; + + Set permissibles = Bukkit.getPluginManager().getPermissionSubscriptions("bukkit.broadcast.user"); + + for (Permissible permissible : permissibles) { + if (!(permissible instanceof BlockCommandSender) && (permissible instanceof CommandSender) && permissible + .hasPermission(permission)) { + CommandSender user = (CommandSender) permissible; + user.sendMessage(BukkitServer.formatMessage(message)); + } + } + } + + @Override + public void broadcastJSON(TextComponent message, String permission) { + Arrays.stream(getOnlinePlayers()).forEach(player -> { + if (player.hasPermission(permission)) player.sendJSONMessage(message); + }); + } + + @Override + public void broadcast(String message, String permission, CommonSender sender) { + broadcast(message, permission); + + if (!sender.hasPermission(permission)) sender.sendMessage(message); + } + + public static String formatMessage(String message) { + return ChatColor + .translateAlternateColorCodes('&', message.replace("\\n", "\n")); + } + + @Override + public CommonSender getConsoleSender() { + return new BukkitSender(plugin, Bukkit.getServer().getConsoleSender()); + } + + @Override + public boolean dispatchCommand(CommonSender sender, String command) { + CommandSender bukkitSender; + + if (sender.isConsole()) { + bukkitSender = Bukkit.getServer().getConsoleSender(); + } else { + bukkitSender = Bukkit.getPlayer(sender.getName()); + } + + return Bukkit.dispatchCommand(bukkitSender, command); + } + + @Override + public CommonWorld getWorld(String name) { + World world = Bukkit.getWorld(name); + + if (world == null) return null; + + return new CommonWorld(name); + } + + @Override + public CommonEvent callEvent(String name, Object... args) { + // @TODO replace with a cleaner implementation + CustomEvent event = null; + CommonEvent commonEvent = new CommonEvent(false, true); + + switch (name) { + case "PlayerBanEvent": + event = new PlayerBanEvent((PlayerBanData) args[0], (boolean) args[1]); + break; + case "PlayerBannedEvent": + event = new PlayerBannedEvent((PlayerBanData) args[0], (boolean) args[1]); + break; + case "PlayerUnbanEvent": + event = new PlayerUnbanEvent((PlayerBanData) args[0], (PlayerData) args[1], (String) args[2]); + break; + + case "IpBanEvent": + event = new IpBanEvent((IpBanData) args[0], (boolean) args[1]); + break; + case "IpBannedEvent": + event = new IpBannedEvent((IpBanData) args[0], (boolean) args[1]); + break; + case "IpUnbanEvent": + event = new IpUnbanEvent((IpBanData) args[0], (PlayerData) args[1], (String) args[2]); + break; + + case "IpMuteEvent": + event = new IpMuteEvent((IpMuteData) args[0], (boolean) args[1]); + break; + case "IpMutedEvent": + event = new IpMutedEvent((IpMuteData) args[0], (boolean) args[1]); + break; + case "IpUnmutedEvent": + event = new IpUnmutedEvent((IpMuteData) args[0], (PlayerData) args[1], (String) args[2]); + break; + + case "PlayerKickedEvent": + event = new PlayerKickedEvent((PlayerKickData) args[0], (boolean) args[1]); + break; + + case "PlayerNoteCreatedEvent": + event = new PlayerNoteCreatedEvent((PlayerNoteData) args[0]); + break; + + case "PlayerReportEvent": + event = new PlayerReportEvent((PlayerReportData) args[0], (boolean) args[1]); + break; + case "PlayerReportedEvent": + event = new PlayerReportedEvent((PlayerReportData) args[0], (boolean) args[1]); + break; + case "PlayerReportDeletedEvent": + event = new PlayerReportDeletedEvent((PlayerReportData) args[0]); + break; + + case "NameBanEvent": + event = new NameBanEvent((NameBanData) args[0], (boolean) args[1]); + break; + case "NameBannedEvent": + event = new NameBannedEvent((NameBanData) args[0], (boolean) args[1]); + break; + case "NameUnbanEvent": + event = new NameUnbanEvent((NameBanData) args[0], (PlayerData) args[1], (String) args[2]); + break; + + case "PlayerWarnEvent": + event = new PlayerWarnEvent((PlayerWarnData) args[0], (boolean) args[1]); + break; + case "PlayerWarnedEvent": + event = new PlayerWarnedEvent((PlayerWarnData) args[0], (boolean) args[1]); + break; + + case "IpRangeBanEvent": + event = new IpRangeBanEvent((IpRangeBanData) args[0], (boolean) args[1]); + break; + case "IpRangeBannedEvent": + event = new IpRangeBannedEvent((IpRangeBanData) args[0], (boolean) args[1]); + break; + case "IpRangeUnbanEvent": + event = new IpRangeUnbanEvent((IpRangeBanData) args[0], (PlayerData) args[1], (String) args[2]); + break; + + case "PlayerMuteEvent": + event = new PlayerMuteEvent((PlayerMuteData) args[0], (boolean) args[1]); + break; + case "PlayerMutedEvent": + event = new PlayerMutedEvent((PlayerMuteData) args[0], (boolean) args[1]); + break; + case "PlayerUnmuteEvent": + event = new PlayerUnmuteEvent((PlayerMuteData) args[0], (PlayerData) args[1], (String) args[2]); + break; + + case "PluginReloadedEvent": + event = new PluginReloadedEvent((PlayerData) args[0]); + break; + + case "PlayerDeniedEvent": + event = new PlayerDeniedEvent((PlayerData) args[0], (Message) args[1]); + break; + } + + if (event == null) { + plugin.getLogger().warning("Unable to call missing event " + name); + + return commonEvent; + } + + Bukkit.getServer().getPluginManager().callEvent(event); + + if (event instanceof SilentCancellableEvent) { + commonEvent = new CommonEvent(((SilentCancellableEvent) event).isCancelled(), ((SilentCancellableEvent) event).isSilent()); + } else if (event instanceof SilentEvent) { + commonEvent = new CommonEvent(false, ((SilentEvent) event).isSilent()); + } else if (event instanceof CustomCancellableEvent) { + commonEvent = new CommonEvent(((CustomCancellableEvent) event).isCancelled(), true); + } + + return commonEvent; + } + + @Override + public CommonExternalCommand getPluginCommand(String commandName) { + PluginCommand pluginCommand = Bukkit.getServer().getPluginCommand(commandName); + + if (pluginCommand == null) return null; + + return new CommonExternalCommand(pluginCommand.getPlugin().getDescription().getName().toLowerCase(), pluginCommand.getName(), pluginCommand.getAliases()); + } +} diff --git a/bukkit/src/main/java/me/confuser/banmanager/bukkit/PluginLogger.java b/bukkit/src/main/java/me/confuser/banmanager/bukkit/PluginLogger.java new file mode 100644 index 000000000..8a24e11d7 --- /dev/null +++ b/bukkit/src/main/java/me/confuser/banmanager/bukkit/PluginLogger.java @@ -0,0 +1,29 @@ +package me.confuser.banmanager.bukkit; + +import me.confuser.banmanager.common.CommonLogger; + +import java.util.logging.Logger; + +public class PluginLogger implements CommonLogger { + + private final Logger logger; + + public PluginLogger(Logger logger) { + this.logger = logger; + } + + @Override + public void info(String msg) { + logger.info(msg); + } + + @Override + public void warning(String msg) { + logger.warning(msg); + } + + @Override + public void severe(String msg) { + logger.severe(msg); + } +} diff --git a/src/main/java/me/confuser/banmanager/events/CustomCancellableEvent.java b/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/CustomCancellableEvent.java similarity index 64% rename from src/main/java/me/confuser/banmanager/events/CustomCancellableEvent.java rename to bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/CustomCancellableEvent.java index 4db741e25..d4eb54066 100644 --- a/src/main/java/me/confuser/banmanager/events/CustomCancellableEvent.java +++ b/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/CustomCancellableEvent.java @@ -1,4 +1,4 @@ -package me.confuser.banmanager.events; +package me.confuser.banmanager.bukkit.api.events; import lombok.Getter; import lombok.Setter; @@ -9,4 +9,8 @@ public abstract class CustomCancellableEvent extends CustomEvent implements Canc @Getter @Setter private boolean cancelled = false; + + public CustomCancellableEvent(boolean isAsync) { + super(isAsync); + } } diff --git a/src/main/java/me/confuser/banmanager/events/CustomEvent.java b/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/CustomEvent.java similarity index 62% rename from src/main/java/me/confuser/banmanager/events/CustomEvent.java rename to bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/CustomEvent.java index 2baa13f30..06ee20d10 100644 --- a/src/main/java/me/confuser/banmanager/events/CustomEvent.java +++ b/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/CustomEvent.java @@ -1,12 +1,16 @@ -package me.confuser.banmanager.events; +package me.confuser.banmanager.bukkit.api.events; import org.bukkit.event.Event; import org.bukkit.event.HandlerList; -abstract class CustomEvent extends Event { +public abstract class CustomEvent extends Event { private static final HandlerList handlers = new HandlerList(); + public CustomEvent(boolean isAsync) { + super(isAsync); + } + public HandlerList getHandlers() { return handlers; } diff --git a/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/IpBanEvent.java b/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/IpBanEvent.java new file mode 100644 index 000000000..97ce9cbb7 --- /dev/null +++ b/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/IpBanEvent.java @@ -0,0 +1,15 @@ +package me.confuser.banmanager.bukkit.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.IpBanData; + +public class IpBanEvent extends SilentCancellableEvent { + + @Getter + private IpBanData ban; + + public IpBanEvent(IpBanData ban, boolean silent) { + super(silent, true); + this.ban = ban; + } +} diff --git a/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/IpBannedEvent.java b/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/IpBannedEvent.java new file mode 100644 index 000000000..04833dba1 --- /dev/null +++ b/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/IpBannedEvent.java @@ -0,0 +1,15 @@ +package me.confuser.banmanager.bukkit.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.IpBanData; + +public class IpBannedEvent extends SilentEvent { + + @Getter + private IpBanData ban; + + public IpBannedEvent(IpBanData ban, boolean silent) { + super(silent, true); + this.ban = ban; + } +} diff --git a/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/IpMuteEvent.java b/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/IpMuteEvent.java new file mode 100644 index 000000000..18e441074 --- /dev/null +++ b/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/IpMuteEvent.java @@ -0,0 +1,15 @@ +package me.confuser.banmanager.bukkit.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.IpMuteData; + +public class IpMuteEvent extends SilentCancellableEvent { + + @Getter + private IpMuteData mute; + + public IpMuteEvent(IpMuteData mute, boolean silent) { + super(silent, true); + this.mute = mute; + } +} diff --git a/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/IpMutedEvent.java b/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/IpMutedEvent.java new file mode 100644 index 000000000..54c094952 --- /dev/null +++ b/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/IpMutedEvent.java @@ -0,0 +1,15 @@ +package me.confuser.banmanager.bukkit.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.IpMuteData; + +public class IpMutedEvent extends SilentEvent { + + @Getter + private IpMuteData mute; + + public IpMutedEvent(IpMuteData mute, boolean silent) { + super(silent, true); + this.mute = mute; + } +} diff --git a/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/IpRangeBanEvent.java b/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/IpRangeBanEvent.java new file mode 100644 index 000000000..06170bf22 --- /dev/null +++ b/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/IpRangeBanEvent.java @@ -0,0 +1,15 @@ +package me.confuser.banmanager.bukkit.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.IpRangeBanData; + +public class IpRangeBanEvent extends SilentCancellableEvent { + + @Getter + private IpRangeBanData ban; + + public IpRangeBanEvent(IpRangeBanData ban, boolean silent) { + super(silent, true); + this.ban = ban; + } +} diff --git a/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/IpRangeBannedEvent.java b/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/IpRangeBannedEvent.java new file mode 100644 index 000000000..0b4e224dd --- /dev/null +++ b/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/IpRangeBannedEvent.java @@ -0,0 +1,16 @@ +package me.confuser.banmanager.bukkit.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.IpRangeBanData; + + +public class IpRangeBannedEvent extends SilentEvent { + + @Getter + private IpRangeBanData ban; + + public IpRangeBannedEvent(IpRangeBanData ban, boolean silent) { + super(silent, true); + this.ban = ban; + } +} diff --git a/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/IpRangeUnbanEvent.java b/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/IpRangeUnbanEvent.java new file mode 100644 index 000000000..9feda9da6 --- /dev/null +++ b/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/IpRangeUnbanEvent.java @@ -0,0 +1,24 @@ +package me.confuser.banmanager.bukkit.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.IpRangeBanData; +import me.confuser.banmanager.common.data.PlayerData; + + +public class IpRangeUnbanEvent extends CustomCancellableEvent { + + @Getter + private IpRangeBanData ban; + @Getter + private PlayerData actor; + @Getter + private String reason; + + public IpRangeUnbanEvent(IpRangeBanData ban, PlayerData actor, String reason) { + super(true); + + this.ban = ban; + this.actor = actor; + this.reason = reason; + } +} diff --git a/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/IpUnbanEvent.java b/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/IpUnbanEvent.java new file mode 100644 index 000000000..841f3746b --- /dev/null +++ b/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/IpUnbanEvent.java @@ -0,0 +1,24 @@ +package me.confuser.banmanager.bukkit.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.IpBanData; +import me.confuser.banmanager.common.data.PlayerData; + + +public class IpUnbanEvent extends CustomCancellableEvent { + + @Getter + private IpBanData ban; + @Getter + private PlayerData actor; + @Getter + private String reason; + + public IpUnbanEvent(IpBanData ban, PlayerData actor, String reason) { + super(true); + + this.ban = ban; + this.actor = actor; + this.reason = reason; + } +} diff --git a/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/IpUnmutedEvent.java b/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/IpUnmutedEvent.java new file mode 100644 index 000000000..a30a5c147 --- /dev/null +++ b/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/IpUnmutedEvent.java @@ -0,0 +1,24 @@ +package me.confuser.banmanager.bukkit.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.IpMuteData; +import me.confuser.banmanager.common.data.PlayerData; + + +public class IpUnmutedEvent extends CustomCancellableEvent { + + @Getter + private IpMuteData mute; + @Getter + private PlayerData actor; + @Getter + private String reason; + + public IpUnmutedEvent(IpMuteData mute, PlayerData actor, String reason) { + super(true); + + this.mute = mute; + this.actor = actor; + this.reason = reason; + } +} diff --git a/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/NameBanEvent.java b/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/NameBanEvent.java new file mode 100644 index 000000000..7a22eb967 --- /dev/null +++ b/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/NameBanEvent.java @@ -0,0 +1,17 @@ +package me.confuser.banmanager.bukkit.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.NameBanData; + + +public class NameBanEvent extends SilentCancellableEvent { + + @Getter + private NameBanData ban; + + public NameBanEvent(NameBanData ban, boolean isSilent) { + super(isSilent, true); + this.ban = ban; + } + +} diff --git a/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/NameBannedEvent.java b/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/NameBannedEvent.java new file mode 100644 index 000000000..e14978c1c --- /dev/null +++ b/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/NameBannedEvent.java @@ -0,0 +1,16 @@ +package me.confuser.banmanager.bukkit.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.NameBanData; + +public class NameBannedEvent extends SilentEvent { + + @Getter + private NameBanData ban; + + public NameBannedEvent(NameBanData ban, boolean isSilent) { + super(isSilent, true); + this.ban = ban; + } + +} diff --git a/src/main/java/me/confuser/banmanager/events/NameUnbanEvent.java b/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/NameUnbanEvent.java similarity index 65% rename from src/main/java/me/confuser/banmanager/events/NameUnbanEvent.java rename to bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/NameUnbanEvent.java index 31b471a76..7cc71fbfa 100644 --- a/src/main/java/me/confuser/banmanager/events/NameUnbanEvent.java +++ b/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/NameUnbanEvent.java @@ -1,9 +1,9 @@ -package me.confuser.banmanager.events; +package me.confuser.banmanager.bukkit.api.events; import lombok.Getter; -import me.confuser.banmanager.data.NameBanData; -import me.confuser.banmanager.data.PlayerBanData; -import me.confuser.banmanager.data.PlayerData; +import me.confuser.banmanager.common.data.NameBanData; +import me.confuser.banmanager.common.data.PlayerData; + public class NameUnbanEvent extends CustomCancellableEvent { @@ -15,6 +15,8 @@ public class NameUnbanEvent extends CustomCancellableEvent { private String reason; public NameUnbanEvent(NameBanData ban, PlayerData actor, String reason) { + super(true); + this.ban = ban; this.actor = actor; this.reason = reason; diff --git a/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/PlayerBanEvent.java b/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/PlayerBanEvent.java new file mode 100644 index 000000000..4ab731760 --- /dev/null +++ b/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/PlayerBanEvent.java @@ -0,0 +1,17 @@ +package me.confuser.banmanager.bukkit.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.PlayerBanData; + + +public class PlayerBanEvent extends SilentCancellableEvent { + + @Getter + private PlayerBanData ban; + + public PlayerBanEvent(PlayerBanData ban, boolean isSilent) { + super(isSilent, true); + this.ban = ban; + } + +} diff --git a/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/PlayerBannedEvent.java b/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/PlayerBannedEvent.java new file mode 100644 index 000000000..5eb7081fa --- /dev/null +++ b/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/PlayerBannedEvent.java @@ -0,0 +1,17 @@ +package me.confuser.banmanager.bukkit.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.PlayerBanData; + + +public class PlayerBannedEvent extends SilentEvent { + + @Getter + private PlayerBanData ban; + + public PlayerBannedEvent(PlayerBanData ban, boolean isSilent) { + super(isSilent, true); + this.ban = ban; + } + +} diff --git a/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/PlayerDeniedEvent.java b/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/PlayerDeniedEvent.java new file mode 100644 index 000000000..35cbf6ff1 --- /dev/null +++ b/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/PlayerDeniedEvent.java @@ -0,0 +1,24 @@ +package me.confuser.banmanager.bukkit.api.events; + +import lombok.Getter; +import lombok.Setter; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.util.Message; + + +public class PlayerDeniedEvent extends CustomCancellableEvent { + + @Getter + @Setter + private Message message; + + @Getter + private PlayerData player; + + public PlayerDeniedEvent(PlayerData player, Message message) { + super(true); + + this.player = player; + this.message = message; + } +} diff --git a/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/PlayerKickedEvent.java b/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/PlayerKickedEvent.java new file mode 100644 index 000000000..702848922 --- /dev/null +++ b/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/PlayerKickedEvent.java @@ -0,0 +1,15 @@ +package me.confuser.banmanager.bukkit.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.PlayerKickData; + +public class PlayerKickedEvent extends SilentEvent { + + @Getter + private PlayerKickData kick; + + public PlayerKickedEvent(PlayerKickData kick, boolean isSilent) { + super(isSilent, true); + this.kick = kick; + } +} diff --git a/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/PlayerMuteEvent.java b/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/PlayerMuteEvent.java new file mode 100644 index 000000000..184188ad3 --- /dev/null +++ b/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/PlayerMuteEvent.java @@ -0,0 +1,16 @@ +package me.confuser.banmanager.bukkit.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.PlayerMuteData; + + +public class PlayerMuteEvent extends SilentCancellableEvent { + + @Getter + private PlayerMuteData mute; + + public PlayerMuteEvent(PlayerMuteData mute, boolean silent) { + super(silent, true); + this.mute = mute; + } +} diff --git a/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/PlayerMutedEvent.java b/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/PlayerMutedEvent.java new file mode 100644 index 000000000..974287afd --- /dev/null +++ b/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/PlayerMutedEvent.java @@ -0,0 +1,16 @@ +package me.confuser.banmanager.bukkit.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.PlayerMuteData; + + +public class PlayerMutedEvent extends SilentEvent { + + @Getter + private PlayerMuteData mute; + + public PlayerMutedEvent(PlayerMuteData mute, boolean silent) { + super(silent, true); + this.mute = mute; + } +} diff --git a/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/PlayerNoteCreatedEvent.java b/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/PlayerNoteCreatedEvent.java new file mode 100644 index 000000000..ed7b58617 --- /dev/null +++ b/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/PlayerNoteCreatedEvent.java @@ -0,0 +1,16 @@ +package me.confuser.banmanager.bukkit.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.PlayerNoteData; + + +public class PlayerNoteCreatedEvent extends CustomCancellableEvent { + + @Getter + private PlayerNoteData note; + + public PlayerNoteCreatedEvent(PlayerNoteData note) { + super(true); + this.note = note; + } +} diff --git a/src/main/java/me/confuser/banmanager/events/PlayerReportDeletedEvent.java b/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/PlayerReportDeletedEvent.java similarity index 54% rename from src/main/java/me/confuser/banmanager/events/PlayerReportDeletedEvent.java rename to bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/PlayerReportDeletedEvent.java index 36bf8717d..0ac1cfb79 100644 --- a/src/main/java/me/confuser/banmanager/events/PlayerReportDeletedEvent.java +++ b/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/PlayerReportDeletedEvent.java @@ -1,9 +1,7 @@ -package me.confuser.banmanager.events; +package me.confuser.banmanager.bukkit.api.events; import lombok.Getter; -import me.confuser.banmanager.data.IpMuteData; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.data.PlayerReportData; +import me.confuser.banmanager.common.data.PlayerReportData; public class PlayerReportDeletedEvent extends CustomEvent { @@ -11,6 +9,7 @@ public class PlayerReportDeletedEvent extends CustomEvent { private PlayerReportData report; public PlayerReportDeletedEvent(PlayerReportData report) { + super(true); this.report = report; } } diff --git a/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/PlayerReportEvent.java b/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/PlayerReportEvent.java new file mode 100644 index 000000000..553d2637c --- /dev/null +++ b/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/PlayerReportEvent.java @@ -0,0 +1,17 @@ +package me.confuser.banmanager.bukkit.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.PlayerReportData; + + +public class PlayerReportEvent extends SilentCancellableEvent { + + @Getter + private PlayerReportData report; + + public PlayerReportEvent(PlayerReportData report, boolean isSilent) { + super(isSilent, true); + this.report = report; + } + +} diff --git a/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/PlayerReportedEvent.java b/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/PlayerReportedEvent.java new file mode 100644 index 000000000..9dc7415fd --- /dev/null +++ b/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/PlayerReportedEvent.java @@ -0,0 +1,17 @@ +package me.confuser.banmanager.bukkit.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.PlayerReportData; + + +public class PlayerReportedEvent extends SilentEvent { + + @Getter + private PlayerReportData report; + + public PlayerReportedEvent(PlayerReportData report, boolean isSilent) { + super(isSilent, true); + this.report = report; + } + +} diff --git a/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/PlayerUnbanEvent.java b/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/PlayerUnbanEvent.java new file mode 100644 index 000000000..2f59f8f62 --- /dev/null +++ b/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/PlayerUnbanEvent.java @@ -0,0 +1,25 @@ +package me.confuser.banmanager.bukkit.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.PlayerBanData; +import me.confuser.banmanager.common.data.PlayerData; + + +public class PlayerUnbanEvent extends CustomCancellableEvent { + + @Getter + private PlayerBanData ban; + @Getter + private PlayerData actor; + @Getter + private String reason; + + public PlayerUnbanEvent(PlayerBanData ban, PlayerData actor, String reason) { + super(true); + + this.ban = ban; + this.actor = actor; + this.reason = reason; + } + +} diff --git a/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/PlayerUnmuteEvent.java b/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/PlayerUnmuteEvent.java new file mode 100644 index 000000000..798255f45 --- /dev/null +++ b/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/PlayerUnmuteEvent.java @@ -0,0 +1,24 @@ +package me.confuser.banmanager.bukkit.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.data.PlayerMuteData; + + +public class PlayerUnmuteEvent extends CustomCancellableEvent { + + @Getter + private PlayerMuteData mute; + @Getter + private PlayerData actor; + @Getter + private String reason; + + public PlayerUnmuteEvent(PlayerMuteData mute, PlayerData actor, String reason) { + super(true); + + this.mute = mute; + this.actor = actor; + this.reason = reason; + } +} diff --git a/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/PlayerWarnEvent.java b/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/PlayerWarnEvent.java new file mode 100644 index 000000000..d9875db4f --- /dev/null +++ b/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/PlayerWarnEvent.java @@ -0,0 +1,16 @@ +package me.confuser.banmanager.bukkit.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.PlayerWarnData; + + +public class PlayerWarnEvent extends SilentEvent { + + @Getter + private PlayerWarnData warning; + + public PlayerWarnEvent(PlayerWarnData warning, boolean silent) { + super(silent, true); + this.warning = warning; + } +} diff --git a/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/PlayerWarnedEvent.java b/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/PlayerWarnedEvent.java new file mode 100644 index 000000000..ac12f3ffa --- /dev/null +++ b/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/PlayerWarnedEvent.java @@ -0,0 +1,16 @@ +package me.confuser.banmanager.bukkit.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.PlayerWarnData; + + +public class PlayerWarnedEvent extends SilentEvent { + + @Getter + private PlayerWarnData warning; + + public PlayerWarnedEvent(PlayerWarnData warning, boolean silent) { + super(silent, true); + this.warning = warning; + } +} diff --git a/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/PluginReloadedEvent.java b/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/PluginReloadedEvent.java new file mode 100644 index 000000000..ee735321a --- /dev/null +++ b/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/PluginReloadedEvent.java @@ -0,0 +1,17 @@ +package me.confuser.banmanager.bukkit.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.PlayerData; + + +public class PluginReloadedEvent extends CustomCancellableEvent { + + @Getter + private PlayerData actor; + + public PluginReloadedEvent(PlayerData actor) { + super(false); + + this.actor = actor; + } +} diff --git a/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/SilentCancellableEvent.java b/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/SilentCancellableEvent.java new file mode 100644 index 000000000..8bb258b73 --- /dev/null +++ b/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/SilentCancellableEvent.java @@ -0,0 +1,18 @@ +package me.confuser.banmanager.bukkit.api.events; + +import lombok.Getter; +import lombok.Setter; + +public abstract class SilentCancellableEvent extends CustomCancellableEvent { + + @Getter + @Setter + private boolean silent = false; + + public SilentCancellableEvent(boolean silent, boolean isAsync) { + super(isAsync); + + this.silent = silent; + } + +} diff --git a/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/SilentEvent.java b/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/SilentEvent.java new file mode 100644 index 000000000..8581addce --- /dev/null +++ b/bukkit/src/main/java/me/confuser/banmanager/bukkit/api/events/SilentEvent.java @@ -0,0 +1,16 @@ +package me.confuser.banmanager.bukkit.api.events; + +import lombok.Getter; +import lombok.Setter; + +public abstract class SilentEvent extends CustomEvent { + @Getter + @Setter + private boolean silent = false; + + public SilentEvent(boolean silent, boolean isAsync) { + super(isAsync); + this.silent = silent; + } + +} diff --git a/bukkit/src/main/java/me/confuser/banmanager/bukkit/listeners/BanListener.java b/bukkit/src/main/java/me/confuser/banmanager/bukkit/listeners/BanListener.java new file mode 100644 index 000000000..29eb0f933 --- /dev/null +++ b/bukkit/src/main/java/me/confuser/banmanager/bukkit/listeners/BanListener.java @@ -0,0 +1,49 @@ +package me.confuser.banmanager.bukkit.listeners; + + +import me.confuser.banmanager.bukkit.api.events.IpBannedEvent; +import me.confuser.banmanager.bukkit.api.events.IpRangeBannedEvent; +import me.confuser.banmanager.bukkit.api.events.NameBannedEvent; +import me.confuser.banmanager.bukkit.api.events.PlayerBannedEvent; +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.CommonPlayer; +import me.confuser.banmanager.common.commands.CommonSender; +import me.confuser.banmanager.common.data.*; +import me.confuser.banmanager.common.listeners.CommonBanListener; +import me.confuser.banmanager.common.util.DateUtils; +import me.confuser.banmanager.common.util.IPUtils; +import me.confuser.banmanager.common.util.Message; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; + +import java.util.List; + +public class BanListener implements Listener { + + private final CommonBanListener listener; + + public BanListener(BanManagerPlugin plugin) { + this.listener = new CommonBanListener(plugin); + } + + @EventHandler(priority = EventPriority.MONITOR) + public void notifyOnBan(PlayerBannedEvent event) { + listener.notifyOnBan(event.getBan(), event.isSilent()); + } + + @EventHandler(priority = EventPriority.MONITOR) + public void notifyOnIpBan(IpBannedEvent event) { + listener.notifyOnBan(event.getBan(), event.isSilent()); + } + + @EventHandler(priority = EventPriority.MONITOR) + public void notifyOnIpRangeBan(IpRangeBannedEvent event) { + listener.notifyOnBan(event.getBan(), event.isSilent()); + } + + @EventHandler(priority = EventPriority.MONITOR) + public void notifyOnNameBan(NameBannedEvent event) { + listener.notifyOnBan(event.getBan(), event.isSilent()); + } +} diff --git a/bukkit/src/main/java/me/confuser/banmanager/bukkit/listeners/ChatListener.java b/bukkit/src/main/java/me/confuser/banmanager/bukkit/listeners/ChatListener.java new file mode 100644 index 000000000..10f551cdf --- /dev/null +++ b/bukkit/src/main/java/me/confuser/banmanager/bukkit/listeners/ChatListener.java @@ -0,0 +1,47 @@ +package me.confuser.banmanager.bukkit.listeners; + + +import lombok.RequiredArgsConstructor; +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.CommonPlayer; +import me.confuser.banmanager.common.listeners.CommonChatHandler; +import me.confuser.banmanager.common.listeners.CommonChatListener; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; + +public class ChatListener implements Listener { + private final CommonChatListener listener; + private BanManagerPlugin plugin; + + public ChatListener(BanManagerPlugin plugin) { + this.plugin = plugin; + this.listener = new CommonChatListener(plugin); + } + + public void onPlayerChat(AsyncPlayerChatEvent event) { + CommonPlayer player = plugin.getServer().getPlayer(event.getPlayer().getUniqueId()); + + if (listener.onPlayerChat(player, new ChatHandler(event), event.getMessage())) { + event.setCancelled(true); + } + } + + public void onIpChat(AsyncPlayerChatEvent event) { + CommonPlayer player = plugin.getServer().getPlayer(event.getPlayer().getUniqueId()); + + if (listener.onIpChat(player, event.getPlayer().getAddress().getAddress(), new ChatHandler(event), event.getMessage())) { + event.setCancelled(true); + } + } + + @RequiredArgsConstructor + private class ChatHandler implements CommonChatHandler { + private final AsyncPlayerChatEvent event; + + @Override + public void handleSoftMute() { + event.getRecipients().clear(); + event.getRecipients().add(event.getPlayer()); + } + } +} diff --git a/bukkit/src/main/java/me/confuser/banmanager/bukkit/listeners/CommandListener.java b/bukkit/src/main/java/me/confuser/banmanager/bukkit/listeners/CommandListener.java new file mode 100644 index 000000000..32a6e6fc8 --- /dev/null +++ b/bukkit/src/main/java/me/confuser/banmanager/bukkit/listeners/CommandListener.java @@ -0,0 +1,33 @@ +package me.confuser.banmanager.bukkit.listeners; + + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.CommonPlayer; +import me.confuser.banmanager.common.listeners.CommonCommandListener; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerCommandPreprocessEvent; + +public class CommandListener implements Listener { + + private final CommonCommandListener listener; + private BanManagerPlugin plugin; + + public CommandListener(BanManagerPlugin plugin) { + this.plugin = plugin; + this.listener = new CommonCommandListener(plugin); + } + + @EventHandler + public void onCommand(PlayerCommandPreprocessEvent event) { + CommonPlayer player = plugin.getServer().getPlayer(event.getPlayer().getUniqueId()); + // Split the command + String[] args = event.getMessage().split(" ", 6); + // Get rid of the first / + String cmd = args[0].replace("/", "").toLowerCase(); + + if (listener.onCommand(player, cmd, args)) { + event.setCancelled(true); + } + } +} diff --git a/bukkit/src/main/java/me/confuser/banmanager/bukkit/listeners/DiscordListener.java b/bukkit/src/main/java/me/confuser/banmanager/bukkit/listeners/DiscordListener.java new file mode 100644 index 000000000..803fddfc9 --- /dev/null +++ b/bukkit/src/main/java/me/confuser/banmanager/bukkit/listeners/DiscordListener.java @@ -0,0 +1,100 @@ +package me.confuser.banmanager.bukkit.listeners; + +import me.confuser.banmanager.bukkit.api.events.*; +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.listeners.CommonDiscordListener; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; + +public class DiscordListener implements Listener { + private CommonDiscordListener listener; + + public DiscordListener(BanManagerPlugin plugin) { + this.listener = new CommonDiscordListener(plugin); + } + + @EventHandler(priority = EventPriority.MONITOR) + public void notifyOnBan(PlayerBannedEvent event) { + Object[] data = listener.notifyOnBan(event.getBan()); + + if (event.isSilent() && (boolean) data[2]) return; + + send(data); + } + + @EventHandler(priority = EventPriority.MONITOR) + public void notifyOnMute(PlayerMutedEvent event) { + Object[] data = listener.notifyOnMute(event.getMute()); + + if (event.isSilent() && (boolean) data[2]) return; + + send(data); + } + + @EventHandler(priority = EventPriority.MONITOR) + public void notifyOnBan(IpBannedEvent event) { + Object[] data = listener.notifyOnBan(event.getBan()); + + if (event.isSilent() && (boolean) data[2]) return; + + send(data); + } + + @EventHandler(priority = EventPriority.MONITOR) + public void notifyOnKick(PlayerKickedEvent event) { + Object[] data = listener.notifyOnKick(event.getKick()); + + if (event.isSilent() && (boolean) data[2]) return; + + send(data); + } + + @EventHandler(priority = EventPriority.MONITOR) + public void notifyOnWarn(PlayerWarnedEvent event) { + Object[] data = listener.notifyOnWarn(event.getWarning()); + + if (event.isSilent() && (boolean) data[2]) return; + + send(data); + } + + @EventHandler(priority = EventPriority.MONITOR) + public void notifyOnUnban(PlayerUnbanEvent event) { + Object[] data = listener.notifyOnUnban(event.getBan(), event.getActor(), event.getReason()); + + send(data); + } + + @EventHandler(priority = EventPriority.MONITOR) + public void notifyOnUnban(IpUnbanEvent event) { + Object[] data = listener.notifyOnUnban(event.getBan(), event.getActor(), event.getReason()); + + send(data); + } + + @EventHandler(priority = EventPriority.MONITOR) + public void notifyOnUnmute(PlayerUnmuteEvent event) { + Object[] data = listener.notifyOnUnmute(event.getMute(), event.getActor(), event.getReason()); + + send(data); + } + + @EventHandler(priority = EventPriority.MONITOR) + public void notifyOnReport(PlayerReportedEvent event) { + Object[] data = listener.notifyOnReport(event.getReport(), event.getReport().getActor(), event.getReport().getReason()); + + if (event.isSilent() && (boolean) data[2]) return; + + send(data); + } + + private void send(Object[] data) { + String url = (String) data[0]; + String payload = (String) data[1]; + + if (url == null || payload == null || url.isEmpty() || payload.isEmpty()) return; + + listener.send(url, payload); + } +} diff --git a/bukkit/src/main/java/me/confuser/banmanager/bukkit/listeners/HookListener.java b/bukkit/src/main/java/me/confuser/banmanager/bukkit/listeners/HookListener.java new file mode 100644 index 000000000..c46f1d2f8 --- /dev/null +++ b/bukkit/src/main/java/me/confuser/banmanager/bukkit/listeners/HookListener.java @@ -0,0 +1,101 @@ +package me.confuser.banmanager.bukkit.listeners; + +import me.confuser.banmanager.bukkit.api.events.*; +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.listeners.CommonHooksListener; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; + +public class HookListener implements Listener { + private final CommonHooksListener listener; + + public HookListener(BanManagerPlugin plugin) { + this.listener = new CommonHooksListener(plugin); + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onBan(final PlayerBanEvent event) { + listener.onBan(event.getBan(), true); + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onBan(final PlayerBannedEvent event) { + listener.onBan(event.getBan(), false); + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onUnban(final PlayerUnbanEvent event) { + listener.onUnban(event.getBan(), event.getActor(), event.getReason()); + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onMute(final PlayerMuteEvent event) { + listener.onMute(event.getMute(), true); + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onMute(final PlayerMutedEvent event) { + listener.onMute(event.getMute(), false); + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onUnmute(final PlayerUnmuteEvent event) { + listener.onUnmute(event.getMute(), event.getActor(), event.getReason()); + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onBan(final IpBanEvent event) { + listener.onBan(event.getBan(), true); + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onBan(final IpBannedEvent event) { + listener.onBan(event.getBan(), false); + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onUnban(final IpUnbanEvent event) { + listener.onUnban(event.getBan(), event.getActor(), event.getReason()); + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onBan(final IpRangeBanEvent event) { + listener.onBan(event.getBan(), true); + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onBan(final IpRangeBannedEvent event) { + listener.onBan(event.getBan(), false); + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onUnban(final IpRangeUnbanEvent event) { + listener.onUnban(event.getBan(), event.getActor(), event.getReason()); + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onWarn(final PlayerWarnEvent event) { + listener.onWarn(event.getWarning(), true); + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onWarn(final PlayerWarnedEvent event) { + listener.onWarn(event.getWarning(), false); + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onNote(final PlayerNoteCreatedEvent event) { + listener.onNote(event.getNote()); + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onReport(final PlayerReportEvent event) { + listener.onReport(event.getReport(), true); + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onReport(final PlayerReportedEvent event) { + listener.onReport(event.getReport(), false); + } +} diff --git a/bukkit/src/main/java/me/confuser/banmanager/bukkit/listeners/JoinListener.java b/bukkit/src/main/java/me/confuser/banmanager/bukkit/listeners/JoinListener.java new file mode 100644 index 000000000..acd283dc5 --- /dev/null +++ b/bukkit/src/main/java/me/confuser/banmanager/bukkit/listeners/JoinListener.java @@ -0,0 +1,88 @@ +package me.confuser.banmanager.bukkit.listeners; + +import lombok.RequiredArgsConstructor; +import me.confuser.banmanager.bukkit.BukkitPlayer; +import me.confuser.banmanager.bukkit.BukkitServer; +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.listeners.CommonJoinHandler; +import me.confuser.banmanager.common.listeners.CommonJoinListener; +import me.confuser.banmanager.common.util.*; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerPreLoginEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerLoginEvent; + +public class JoinListener implements Listener { + private final CommonJoinListener listener; + private BanManagerPlugin plugin; + + public JoinListener(BanManagerPlugin plugin) { + this.plugin = plugin; + this.listener = new CommonJoinListener(plugin); + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void banCheck(final AsyncPlayerPreLoginEvent event) { + listener.banCheck(event.getUniqueId(), event.getName(), IPUtils.toIPAddress(event.getAddress()), new BanJoinHandler(plugin, event)); + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onJoin(AsyncPlayerPreLoginEvent event) { + if (event.getLoginResult() != AsyncPlayerPreLoginEvent.Result.ALLOWED) { + return; + } + + listener.onPreJoin(event.getUniqueId(), event.getName(), IPUtils.toIPAddress(event.getAddress())); + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onJoin(final PlayerJoinEvent event) { + listener.onJoin(new BukkitPlayer(event.getPlayer(), plugin.getConfig().isOnlineMode())); + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onPlayerLogin(final PlayerLoginEvent event) { + if (event.getResult() != PlayerLoginEvent.Result.ALLOWED) { + return; + } + + listener.onPlayerLogin(new BukkitPlayer(event.getPlayer(), plugin.getConfig().isOnlineMode(), event.getAddress()), new LoginHandler(event)); + } + + @RequiredArgsConstructor + private class BanJoinHandler implements CommonJoinHandler { + private final BanManagerPlugin plugin; + private final AsyncPlayerPreLoginEvent event; + + @Override + public void handlePlayerDeny(PlayerData player, Message message) { + plugin.getServer().callEvent("PlayerDeniedEvent", player, message); + + handleDeny(message); + } + + @Override + public void handleDeny(Message message) { + event.setLoginResult(AsyncPlayerPreLoginEvent.Result.KICK_BANNED); + event.setKickMessage(BukkitServer.formatMessage(message.toString())); + } + } + + @RequiredArgsConstructor + private class LoginHandler implements CommonJoinHandler { + private final PlayerLoginEvent event; + + @Override + public void handlePlayerDeny(PlayerData player, Message message) { + handleDeny(message); + } + + @Override + public void handleDeny(Message message) { + event.disallow(PlayerLoginEvent.Result.KICK_BANNED, message.toString()); + } + } +} diff --git a/bukkit/src/main/java/me/confuser/banmanager/bukkit/listeners/LeaveListener.java b/bukkit/src/main/java/me/confuser/banmanager/bukkit/listeners/LeaveListener.java new file mode 100644 index 000000000..12e6c7c75 --- /dev/null +++ b/bukkit/src/main/java/me/confuser/banmanager/bukkit/listeners/LeaveListener.java @@ -0,0 +1,21 @@ +package me.confuser.banmanager.bukkit.listeners; + + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.listeners.CommonLeaveListener; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerQuitEvent; + +public class LeaveListener implements Listener { + private final CommonLeaveListener listener; + + public LeaveListener(BanManagerPlugin plugin) { + this.listener = new CommonLeaveListener(plugin); + } + + @EventHandler + public void onLeave(PlayerQuitEvent event) { + listener.onLeave(event.getPlayer().getUniqueId(), event.getPlayer().getName()); + } +} diff --git a/bukkit/src/main/java/me/confuser/banmanager/bukkit/listeners/MuteListener.java b/bukkit/src/main/java/me/confuser/banmanager/bukkit/listeners/MuteListener.java new file mode 100644 index 000000000..8cc6fc1b1 --- /dev/null +++ b/bukkit/src/main/java/me/confuser/banmanager/bukkit/listeners/MuteListener.java @@ -0,0 +1,64 @@ +package me.confuser.banmanager.bukkit.listeners; + + +import me.confuser.banmanager.bukkit.api.events.IpMutedEvent; +import me.confuser.banmanager.bukkit.api.events.PlayerMutedEvent; +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.listeners.CommonMuteListener; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.block.SignChangeEvent; +import org.bukkit.event.player.PlayerEditBookEvent; + +import java.util.UUID; + +public class MuteListener implements Listener { + private final BanManagerPlugin plugin; + private final CommonMuteListener listener; + + public MuteListener(BanManagerPlugin plugin) { + this.plugin = plugin; + this.listener = new CommonMuteListener(plugin); + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR) + public void notifyOnMute(PlayerMutedEvent event) { + listener.notifyOnMute(event.getMute(), event.isSilent()); + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR) + public void notifyOnMute(IpMutedEvent event) { + listener.notifyOnMute(event.getMute(), event.isSilent()); + } + + @EventHandler + public void blockOnPlayerMute(SignChangeEvent event) { + if (plugin.getPlayerMuteStorage().isMuted(event.getPlayer().getUniqueId()) && event.getPlayer().hasPermission("bm.block.muted.sign")) { + event.getBlock().breakNaturally(); + event.setCancelled(true); + } + } + + @EventHandler + public void blockOnIpMute(SignChangeEvent event) { + if (plugin.getIpMuteStorage().isMuted(event.getPlayer().getAddress().getAddress()) && event.getPlayer().hasPermission("bm.block.ipmuted.sign")) { + event.getBlock().breakNaturally(); + event.setCancelled(true); + } + } + + @EventHandler + public void blockOnPlayerMute(PlayerEditBookEvent event) { + if (plugin.getPlayerMuteStorage().isMuted(event.getPlayer().getUniqueId()) && event.getPlayer().hasPermission("bm.block.muted.book")) { + event.setCancelled(true); + } + } + + @EventHandler + public void blockOnIpMute(PlayerEditBookEvent event) { + if (plugin.getIpMuteStorage().isMuted(event.getPlayer().getAddress().getAddress()) && event.getPlayer().hasPermission("bm.block.ipmuted.book")) { + event.setCancelled(true); + } + } +} diff --git a/bukkit/src/main/java/me/confuser/banmanager/bukkit/listeners/NoteListener.java b/bukkit/src/main/java/me/confuser/banmanager/bukkit/listeners/NoteListener.java new file mode 100644 index 000000000..b305e99ed --- /dev/null +++ b/bukkit/src/main/java/me/confuser/banmanager/bukkit/listeners/NoteListener.java @@ -0,0 +1,23 @@ +package me.confuser.banmanager.bukkit.listeners; + + +import me.confuser.banmanager.bukkit.api.events.PlayerNoteCreatedEvent; +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.listeners.CommonNoteListener; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; + +public class NoteListener implements Listener { + private final CommonNoteListener listener; + + public NoteListener(BanManagerPlugin plugin) { + this.listener = new CommonNoteListener(plugin); + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR) + public void notifyOnNote(PlayerNoteCreatedEvent event) { + listener.notifyOnNote(event.getNote()); + } + +} diff --git a/bukkit/src/main/java/me/confuser/banmanager/bukkit/listeners/ReportListener.java b/bukkit/src/main/java/me/confuser/banmanager/bukkit/listeners/ReportListener.java new file mode 100644 index 000000000..94424f48c --- /dev/null +++ b/bukkit/src/main/java/me/confuser/banmanager/bukkit/listeners/ReportListener.java @@ -0,0 +1,70 @@ +package me.confuser.banmanager.bukkit.listeners; + +import me.confuser.banmanager.bukkit.api.events.PlayerReportDeletedEvent; +import me.confuser.banmanager.bukkit.api.events.PlayerReportedEvent; +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.data.PlayerReportData; +import me.confuser.banmanager.common.data.PlayerReportLocationData; +import me.confuser.banmanager.common.listeners.CommonReportListener; +import me.confuser.banmanager.common.util.UUIDUtils; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; + +import java.sql.SQLException; + +public class ReportListener implements Listener { + private final CommonReportListener listener; + private BanManagerPlugin plugin; + + public ReportListener(BanManagerPlugin plugin) { + this.plugin = plugin; + this.listener = new CommonReportListener(plugin); + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR) + public void notifyOnReport(PlayerReportedEvent event) { + listener.notifyOnReport(event.getReport()); + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR) + public void storeLocation(PlayerReportedEvent event) { + PlayerReportData report = event.getReport(); + + Player player = Bukkit.getServer().getPlayer(report.getPlayer().getUUID()); + Player actor = Bukkit.getServer().getPlayer(report.getActor().getUUID()); + + try { + createLocation(report, player); + } catch (SQLException e) { + e.printStackTrace(); + } + + try { + createLocation(report, actor); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + private void createLocation(PlayerReportData report, Player player) throws SQLException { + if (player == null) return; + + PlayerData playerData = plugin.getPlayerStorage().queryForId(UUIDUtils.toBytes(player.getUniqueId())); + Location loc = player.getLocation(); + + plugin.getPlayerReportLocationStorage() + .create(new PlayerReportLocationData(report, playerData, loc.getWorld().getName(), loc.getX(), loc.getY(), loc + .getZ() + , loc.getPitch(), loc.getYaw())); + } + + @EventHandler + public void deleteReferences(PlayerReportDeletedEvent event) { + listener.deleteReferences(event.getReport()); + } +} diff --git a/src/main/java/me/confuser/banmanager/listeners/UpdateListener.java b/bukkit/src/main/java/me/confuser/banmanager/bukkit/listeners/UpdateListener.java similarity index 50% rename from src/main/java/me/confuser/banmanager/listeners/UpdateListener.java rename to bukkit/src/main/java/me/confuser/banmanager/bukkit/listeners/UpdateListener.java index a5cbd9701..0d2d52b9b 100644 --- a/src/main/java/me/confuser/banmanager/listeners/UpdateListener.java +++ b/bukkit/src/main/java/me/confuser/banmanager/bukkit/listeners/UpdateListener.java @@ -1,20 +1,27 @@ -package me.confuser.banmanager.listeners; +package me.confuser.banmanager.bukkit.listeners; -import me.confuser.banmanager.BanManager; -import me.confuser.bukkitutil.Message; -import me.confuser.bukkitutil.listeners.Listeners; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.util.Message; import org.bukkit.ChatColor; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerJoinEvent; -public class UpdateListener extends Listeners { +public class UpdateListener implements Listener { + + private BanManagerPlugin plugin; + + public UpdateListener(BanManagerPlugin plugin) { + this.plugin = plugin; + } @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onPlayerJoin(PlayerJoinEvent event) { if (!event.getPlayer().hasPermission("bm.notify.update")) return; - Message.get("update.notify").sendTo(event.getPlayer()); + Message.get("update.notify").sendTo(plugin.getServer().getPlayer(event.getPlayer().getUniqueId())); event.getPlayer().sendMessage(ChatColor.GOLD + "http://dev.bukkit.org/bukkit-plugins/ban-management/"); } } diff --git a/bukkit/src/main/java/me/confuser/banmanager/bukkit/placeholders/IpBanPlaceholder.java b/bukkit/src/main/java/me/confuser/banmanager/bukkit/placeholders/IpBanPlaceholder.java new file mode 100644 index 000000000..1f60d8acc --- /dev/null +++ b/bukkit/src/main/java/me/confuser/banmanager/bukkit/placeholders/IpBanPlaceholder.java @@ -0,0 +1,24 @@ +package me.confuser.banmanager.bukkit.placeholders; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.data.IpBanData; +import me.confuser.banmanager.common.util.IPUtils; +import org.bukkit.entity.Player; + +public abstract class IpBanPlaceholder extends Placeholder { + + public IpBanPlaceholder(BanManagerPlugin plugin, String identifier) { + super(plugin, identifier); + } + + @Override + public final String getValue(Player player) { + final IpBanData data = getPlugin().getIpBanStorage().getBan(IPUtils.toIPAddress(player.getAddress().getAddress())); + + if (data == null) return ""; + + return getValue(player, data); + } + + public abstract String getValue(final Player player, final IpBanData data); +} diff --git a/bukkit/src/main/java/me/confuser/banmanager/bukkit/placeholders/IpMutePlaceholder.java b/bukkit/src/main/java/me/confuser/banmanager/bukkit/placeholders/IpMutePlaceholder.java new file mode 100644 index 000000000..544427807 --- /dev/null +++ b/bukkit/src/main/java/me/confuser/banmanager/bukkit/placeholders/IpMutePlaceholder.java @@ -0,0 +1,24 @@ +package me.confuser.banmanager.bukkit.placeholders; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.data.IpMuteData; +import me.confuser.banmanager.common.util.IPUtils; +import org.bukkit.entity.Player; + +public abstract class IpMutePlaceholder extends Placeholder { + + public IpMutePlaceholder(BanManagerPlugin plugin, String identifier) { + super(plugin, identifier); + } + + @Override + public final String getValue(Player player) { + final IpMuteData data = getPlugin().getIpMuteStorage().getMute(IPUtils.toIPAddress(player.getAddress().getAddress())); + + if (data == null) return ""; + + return getValue(player, data); + } + + public abstract String getValue(final Player player, final IpMuteData data); +} diff --git a/bukkit/src/main/java/me/confuser/banmanager/bukkit/placeholders/PAPIPlaceholders.java b/bukkit/src/main/java/me/confuser/banmanager/bukkit/placeholders/PAPIPlaceholders.java new file mode 100644 index 000000000..d6922a2fc --- /dev/null +++ b/bukkit/src/main/java/me/confuser/banmanager/bukkit/placeholders/PAPIPlaceholders.java @@ -0,0 +1,140 @@ +package me.confuser.banmanager.bukkit.placeholders; + +import me.clip.placeholderapi.expansion.PlaceholderExpansion; +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.data.IpBanData; +import me.confuser.banmanager.common.data.IpMuteData; +import me.confuser.banmanager.common.data.PlayerBanData; +import me.confuser.banmanager.common.data.PlayerMuteData; +import org.bukkit.entity.Player; + +import java.util.HashMap; +import java.util.function.BiFunction; +import java.util.function.Function; + +public class PAPIPlaceholders extends PlaceholderExpansion { + private BanManagerPlugin plugin; + private HashMap placeholders = new HashMap<>(); + + public PAPIPlaceholders(BanManagerPlugin plugin) { + this.plugin = plugin; + + registerPlaceholder("player_bans", (player) -> String.valueOf(plugin.getPlayerBanStorage().getBans().size())); + registerPlaceholder("player_mutes", (player) -> String.valueOf(plugin.getPlayerMuteStorage().getMutes().size())); + registerPlaceholder("ip_bans", (player) -> String.valueOf(plugin.getIpBanStorage().getBans().size())); + registerPlaceholder("ip_mutes", (player) -> String.valueOf(plugin.getIpMuteStorage().getMutes().size())); + registerPlaceholder("iprange_bans", (player) -> String.valueOf(plugin.getIpRangeBanStorage().getBans().size())); + + registerBanPlaceholder("currentban_id", (player, data) -> String.valueOf(data.getId())); + registerBanPlaceholder("currentban_created", (player, data) -> String.valueOf(data.getCreated())); + registerBanPlaceholder("currentban_expires", (player, data) -> String.valueOf(data.getExpires())); + registerBanPlaceholder("currentban_reason", (player, data) -> data.getReason()); + registerBanPlaceholder("currentban_actor_id", (player, data) -> data.getActor().getUUID().toString()); + registerBanPlaceholder("currentban_actor_name", (player, data) -> data.getActor().getName()); + + registerMutePlaceholder("currentmute_id", (player, data) -> String.valueOf(data.getId())); + registerMutePlaceholder("currentmute_created", (player, data) -> String.valueOf(data.getCreated())); + registerMutePlaceholder("currentmute_expires", (player, data) -> String.valueOf(data.getExpires())); + registerMutePlaceholder("currentmute_reason", (player, data) -> data.getReason()); + registerMutePlaceholder("currentmute_actor_id", (player, data) -> data.getActor().getUUID().toString()); + registerMutePlaceholder("currentmute_actor_name", (player, data) -> data.getActor().getName()); + + registerIpBanPlaceholder("currentipban_id", (player, data) -> String.valueOf(data.getId())); + registerIpBanPlaceholder("currentipban_created", (player, data) -> String.valueOf(data.getCreated())); + registerIpBanPlaceholder("currentipban_expires", (player, data) -> String.valueOf(data.getExpires())); + registerIpBanPlaceholder("currentipban_reason", (player, data) -> data.getReason()); + registerIpBanPlaceholder("currentipban_actor_id", (player, data) -> data.getActor().getUUID().toString()); + registerIpBanPlaceholder("currentipban_actor_name", (player, data) -> data.getActor().getName()); + registerIpBanPlaceholder("currentipban_ip", (player, data) -> data.getIp().toString()); + + registerIpMutePlaceholder("currentipmute_id", (player, data) -> String.valueOf(data.getId())); + registerIpMutePlaceholder("currentipmute_created", (player, data) -> String.valueOf(data.getCreated())); + registerIpMutePlaceholder("currentipmute_expires", (player, data) -> String.valueOf(data.getExpires())); + registerIpMutePlaceholder("currentipmute_reason", (player, data) -> data.getReason()); + registerIpMutePlaceholder("currentipmute_actor_id", (player, data) -> data.getActor().getUUID().toString()); + registerIpMutePlaceholder("currentipmute_actor_name", (player, data) -> data.getActor().getName()); + registerIpMutePlaceholder("currentipmute_ip", (player, data) -> data.getIp().toString()); + } + + public void registerPlaceholder(String identifier, final Function fn) { + placeholders.put(identifier, new Placeholder(plugin, identifier) { + @Override + public String getValue(final Player player) { + return fn.apply(player); + } + }); + } + + public void registerBanPlaceholder(String identifier, final BiFunction fn) { + placeholders.put(identifier, new PlayerBanPlaceholder(plugin, identifier) { + @Override + public String getValue(final Player player, final PlayerBanData data) { + return fn.apply(player, data); + } + }); + } + + public void registerMutePlaceholder(String identifier, final BiFunction fn) { + placeholders.put(identifier, new PlayerMutePlaceholder(plugin, identifier) { + @Override + public String getValue(final Player player, final PlayerMuteData data) { + return fn.apply(player, data); + } + }); + } + + public void registerIpBanPlaceholder(String identifier, final BiFunction fn) { + placeholders.put(identifier, new IpBanPlaceholder(plugin, identifier) { + @Override + public String getValue(final Player player, final IpBanData data) { + return fn.apply(player, data); + } + }); + } + + public void registerIpMutePlaceholder(String identifier, final BiFunction fn) { + placeholders.put(identifier, new IpMutePlaceholder(plugin, identifier) { + @Override + public String getValue(final Player player, final IpMuteData data) { + return fn.apply(player, data); + } + }); + } + + @Override + public boolean persist() { + return true; + } + + @Override + public boolean canRegister() { + return true; + } + + @Override + public String getAuthor() { + return "confuser"; + } + + @Override + public String getIdentifier() { + return "bm"; + } + + @Override + public String getVersion() { + return "7"; + } + + @Override + public String onPlaceholderRequest(Player player, String identifier) { + Placeholder placeholder = placeholders.get(identifier); + + if (placeholder == null) { + plugin.getLogger().warning("Unknown placeholder " + identifier + " detected"); + return null; + } + + return placeholder.getValue(player); + } +} \ No newline at end of file diff --git a/bukkit/src/main/java/me/confuser/banmanager/bukkit/placeholders/Placeholder.java b/bukkit/src/main/java/me/confuser/banmanager/bukkit/placeholders/Placeholder.java new file mode 100644 index 000000000..c2f456608 --- /dev/null +++ b/bukkit/src/main/java/me/confuser/banmanager/bukkit/placeholders/Placeholder.java @@ -0,0 +1,19 @@ +package me.confuser.banmanager.bukkit.placeholders; + +import lombok.Getter; +import me.confuser.banmanager.common.BanManagerPlugin; +import org.bukkit.entity.Player; + +public abstract class Placeholder { + @Getter + private final BanManagerPlugin plugin; + @Getter + private final String identifier; + + public Placeholder(BanManagerPlugin plugin, String identifier) { + this.plugin = plugin; + this.identifier = identifier; + } + + public abstract String getValue(final Player player); +} diff --git a/bukkit/src/main/java/me/confuser/banmanager/bukkit/placeholders/PlayerBanPlaceholder.java b/bukkit/src/main/java/me/confuser/banmanager/bukkit/placeholders/PlayerBanPlaceholder.java new file mode 100644 index 000000000..3ea2e5ada --- /dev/null +++ b/bukkit/src/main/java/me/confuser/banmanager/bukkit/placeholders/PlayerBanPlaceholder.java @@ -0,0 +1,23 @@ +package me.confuser.banmanager.bukkit.placeholders; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.data.PlayerBanData; +import org.bukkit.entity.Player; + +public abstract class PlayerBanPlaceholder extends Placeholder { + + public PlayerBanPlaceholder(BanManagerPlugin plugin, String identifier) { + super(plugin, identifier); + } + + @Override + public final String getValue(Player player) { + final PlayerBanData data = getPlugin().getPlayerBanStorage().getBan(player.getUniqueId()); + + if (data == null) return ""; + + return getValue(player, data); + } + + public abstract String getValue(final Player player, final PlayerBanData data); +} diff --git a/bukkit/src/main/java/me/confuser/banmanager/bukkit/placeholders/PlayerMutePlaceholder.java b/bukkit/src/main/java/me/confuser/banmanager/bukkit/placeholders/PlayerMutePlaceholder.java new file mode 100644 index 000000000..3ed97ecf0 --- /dev/null +++ b/bukkit/src/main/java/me/confuser/banmanager/bukkit/placeholders/PlayerMutePlaceholder.java @@ -0,0 +1,23 @@ +package me.confuser.banmanager.bukkit.placeholders; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.data.PlayerMuteData; +import org.bukkit.entity.Player; + +public abstract class PlayerMutePlaceholder extends Placeholder { + + public PlayerMutePlaceholder(BanManagerPlugin plugin, String identifier) { + super(plugin, identifier); + } + + @Override + public final String getValue(Player player) { + final PlayerMuteData data = getPlugin().getPlayerMuteStorage().getMute(player.getUniqueId()); + + if (data == null) return ""; + + return getValue(player, data); + } + + public abstract String getValue(final Player player, final PlayerMuteData data); +} diff --git a/bukkit/src/main/resources b/bukkit/src/main/resources new file mode 120000 index 000000000..6d7fedbbf --- /dev/null +++ b/bukkit/src/main/resources @@ -0,0 +1 @@ +../../../common/src/main/resources \ No newline at end of file diff --git a/bungee/build.gradle.kts b/bungee/build.gradle.kts new file mode 100644 index 000000000..f259594be --- /dev/null +++ b/bungee/build.gradle.kts @@ -0,0 +1,121 @@ +import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar + +plugins { + `java-library` + `maven-publish` + signing +} + +applyPlatformAndCoreConfiguration() +applyShadowConfiguration() + +publishing { + publications { + create("mavenJava") { + from(components["java"]) + + pom { + name.set("BanManagerBungee") + description.set("BanManager for BungeeCord") + url.set("https://github.com/BanManagement/BanManager/") + licenses { + license { + name.set("Creative Commons Attribution-NonCommercial-ShareAlike 2.0 UK: England & Wales") + url.set("https://github.com/BanManagement/BanManager/blob/master/LICENCE") + } + } + developers { + developer { + id.set("confuser") + name.set("James Mortemore") + email.set("jamesmortemore@gmail.com") + } + } + scm { + connection.set("scm:git:git://github.com/BanManagement/BanManager.git") + developerConnection.set("scm:git:ssh://git@github.com/BanManagement/BanManager.git") + url.set("https://github.com/BanManagement/BanManager/") + } + } + } + } +} + +signing { + if (project.findProperty("signingKey")?.toString()?.toBoolean() == true) { + useInMemoryPgpKeys(findProperty("signingKey")?.toString(), findProperty("signingPassword")?.toString()) + + sign(publishing.publications["mavenJava"]) + } +} + +repositories { + maven { + name = "paper" + url = uri("https://repo.papermc.io/repository/maven-public/") + } + maven { + name = "sonatype" + url = uri("https://oss.sonatype.org/content/repositories/snapshots/") + } +} + +configurations { + compileClasspath.get().extendsFrom(create("shadeOnly")) +} + +dependencies { + api(project(":BanManagerCommon")) + compileOnly("net.md-5:bungeecord-api:1.21-R0.1-SNAPSHOT") + "shadeOnly"("org.bstats:bstats-bungeecord:2.2.1") +} + +tasks.named("processResources") { + val internalVersion = project.ext["internalVersion"] + + inputs.property("internalVersion", internalVersion) + + filesMatching("plugin.yml") { + expand("internalVersion" to internalVersion, "mainPath" to "me.confuser.banmanager.bungee.BMBungeePlugin") + } +} + +tasks.named("jar") { + val projectVersion = project.version + inputs.property("projectVersion", projectVersion) + manifest { + attributes("Implementation-Version" to projectVersion) + } +} + +tasks.named("shadowJar") { + configurations = listOf(project.configurations["shadeOnly"], project.configurations["runtimeClasspath"]) + + archiveBaseName.set("BanManagerBungeeCord") + archiveClassifier.set("") + archiveVersion.set("") + + dependencies { + include(dependency(":BanManagerCommon")) + include(dependency(":BanManagerLibs")) + include(dependency("org.bstats:.*:.*")) + + relocate("org.bstats", "me.confuser.banmanager.common.bstats") + } + exclude("GradleStart**") + exclude(".cache"); + exclude("LICENSE*") + exclude("META-INF/services/**") + exclude("META-INF/maven/**") + exclude("org/intellij/**") + exclude("org/jetbrains/**") + exclude("velocity.yml") + + minimize { + exclude(dependency("org.bstats:.*:.*")) + } +} + +tasks.named("assemble").configure { + dependsOn("shadowJar") +} diff --git a/bungee/src/main/java/me/confuser/banmanager/bungee/BMBungeePlugin.java b/bungee/src/main/java/me/confuser/banmanager/bungee/BMBungeePlugin.java new file mode 100755 index 000000000..17946210e --- /dev/null +++ b/bungee/src/main/java/me/confuser/banmanager/bungee/BMBungeePlugin.java @@ -0,0 +1,204 @@ +package me.confuser.banmanager.bungee; + +import lombok.Getter; +import me.confuser.banmanager.bungee.configs.BungeeConfig; +import me.confuser.banmanager.bungee.listeners.*; +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.commands.CommonCommand; +import me.confuser.banmanager.common.configs.PluginInfo; +import me.confuser.banmanager.common.configuration.ConfigurationSection; +import me.confuser.banmanager.common.configuration.file.YamlConfiguration; +import me.confuser.banmanager.common.runnables.*; +import net.md_5.bungee.api.plugin.Listener; +import net.md_5.bungee.api.plugin.Plugin; +import org.bstats.bungeecord.Metrics; + +import java.io.*; +import java.nio.file.Files; +import java.util.concurrent.TimeUnit; + +public class BMBungeePlugin extends Plugin { + @Getter + private BanManagerPlugin plugin; + @Getter + private BungeeConfig bungeeConfig; + + private String[] configs = new String[]{ + "config.yml", + "bungeecord.yml", + "console.yml", + "discord.yml", + "exemptions.yml", + "geoip.yml", + "messages.yml", + "reasons.yml", + "schedules.yml" + }; + private Metrics metrics; + + @Override + public void onEnable() { + BungeeServer server = new BungeeServer(); + PluginInfo pluginInfo; + + try { + pluginInfo = setupConfigs(); + } catch (IOException e) { + e.printStackTrace(); + return; + } + + metrics = new Metrics(this, 6530); + plugin = new BanManagerPlugin(pluginInfo, new PluginLogger(getLogger()), getDataFolder(), new BungeeScheduler(this), server, new BungeeMetrics(metrics)); + + server.enable(plugin); + + try { + plugin.enable(); + } catch (Exception e) { + if (plugin != null) plugin.disable(); + + e.printStackTrace(); + return; + } + + bungeeConfig = new BungeeConfig(getDataFolder(), plugin.getLogger()); + bungeeConfig.load(); + + setupListeners(); + + if (bungeeConfig.isCommandsEnabled()) setupCommands(); + + setupRunnables(); + + plugin.getLogger().info("The following commands are blocked whilst muted:"); + plugin.getConfig().handleBlockedCommands(plugin, plugin.getConfig().getMutedBlacklistCommands()); + + plugin.getLogger().info("The following commands are blocked whilst soft muted:"); + plugin.getConfig().handleBlockedCommands(plugin, plugin.getConfig().getSoftMutedBlacklistCommands()); + } + + @Override + public void onDisable() { + getProxy().getScheduler().cancel(this); + + if (plugin != null) plugin.disable(); + } + + private void setupCommands() { + for (CommonCommand cmd : plugin.getCommands()) { + // Ignore reports as not compatible yet + if (cmd.getCommandName().startsWith("report")) continue; + + new BungeeCommand(cmd, this); + } + + if (plugin.getGlobalConn() != null) { + for (CommonCommand cmd : plugin.getGlobalCommands()) { + new BungeeCommand(cmd, this); + } + } + + getLogger().info("Registered commands"); + } + + private PluginInfo setupConfigs() throws IOException { + if (!getDataFolder().exists()) getDataFolder().mkdir(); + + for (String name : configs) { + File file = new File(getDataFolder(), name); + + if (!file.exists()) { + try (InputStream in = getResourceAsStream(name)) { + Files.copy(in, file.toPath()); + } catch (IOException e) { + e.printStackTrace(); + } + } else { + Reader defConfigStream = new InputStreamReader(getResourceAsStream(file.getName()), "UTF8"); + + YamlConfiguration conf = YamlConfiguration.loadConfiguration(file); + YamlConfiguration defConfig = YamlConfiguration.loadConfiguration(defConfigStream); + conf.setDefaults(defConfig); + conf.options().copyDefaults(true); + conf.save(file); + } + } + + // Load plugin.yml + PluginInfo pluginInfo = new PluginInfo(); + Reader defConfigStream = new InputStreamReader(getResourceAsStream("plugin.yml"), "UTF8"); + YamlConfiguration conf = YamlConfiguration.loadConfiguration(defConfigStream); + ConfigurationSection commands = conf.getConfigurationSection("commands"); + String pluginName = conf.getString("name"); + + if (!pluginName.equals("BanManager")) { + throw new IOException("Unable to start BanManager as " + pluginName + " has broken resource loading forcing BanManager to load their plugin.yml file; please alert the author to resolve this issue"); + } + + for (String command : commands.getKeys(false)) { + ConfigurationSection cmd = commands.getConfigurationSection(command); + + pluginInfo.setCommand(new PluginInfo.CommandInfo(command, cmd.getString("permission"), cmd.getString("usage"), cmd.getStringList("aliases"))); + } + + return pluginInfo; + } + + public void setupListeners() { + registerEvent(new JoinListener(this)); + registerEvent(new LeaveListener(plugin)); + registerEvent(new HookListener(plugin)); + + if (!plugin.getConfig().getChatPriority().equals("NONE")) { + registerEvent(new ChatListener(plugin)); + } + + if (plugin.getConfig().isDisplayNotificationsEnabled()) { + registerEvent(new BanListener(plugin)); + registerEvent(new MuteListener(plugin)); + registerEvent(new NoteListener(plugin)); + } + + if (plugin.getDiscordConfig().isHooksEnabled()) { + registerEvent(new DiscordListener(plugin)); + } + } + + private void registerEvent(Listener listener) { + getProxy().getPluginManager().registerListener(this, listener); + } + + public void setupRunnables() { + Runner syncRunner; + + if (plugin.getGlobalConn() == null) { + syncRunner = new Runner(new BanSync(plugin), new MuteSync(plugin), new IpSync(plugin), new IpRangeSync(plugin), new ExpiresSync(plugin), + new WarningSync(plugin), new RollbackSync(plugin), new NameSync(plugin)); + } else { + syncRunner = new Runner(new BanSync(plugin), new MuteSync(plugin), new IpSync(plugin), new IpRangeSync(plugin), new ExpiresSync(plugin), + new WarningSync(plugin), new RollbackSync(plugin), new NameSync(plugin), + new GlobalBanSync(plugin), new GlobalMuteSync(plugin), new GlobalIpSync(plugin), new GlobalNoteSync(plugin)); + } + + plugin.setSyncRunner(syncRunner); + + setupAsyncRunnable(1L, syncRunner); + + /* + * This task should be ran last with a 1L offset as it gets modified + * above. + */ + setupAsyncRunnable((plugin.getSchedulesConfig() + .getSchedule("saveLastChecked")) + 1L, new SaveLastChecked(plugin)); + + // Purge + plugin.getScheduler().runAsync(new Purge(plugin)); + } + + private void setupAsyncRunnable(long length, Runnable runnable) { + if (length <= 0) return; + + getProxy().getScheduler().schedule(this, runnable, length, length, TimeUnit.SECONDS); + } +} diff --git a/bungee/src/main/java/me/confuser/banmanager/bungee/BungeeCommand.java b/bungee/src/main/java/me/confuser/banmanager/bungee/BungeeCommand.java new file mode 100755 index 000000000..565529e0e --- /dev/null +++ b/bungee/src/main/java/me/confuser/banmanager/bungee/BungeeCommand.java @@ -0,0 +1,62 @@ +package me.confuser.banmanager.bungee; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.commands.CommonCommand; +import me.confuser.banmanager.common.commands.CommonSender; +import net.md_5.bungee.api.CommandSender; +import net.md_5.bungee.api.ProxyServer; +import net.md_5.bungee.api.chat.TextComponent; +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.lang.reflect.InvocationTargetException; +import java.util.Collections; + +public class BungeeCommand extends Command implements TabExecutor { + private CommonCommand command; + private BMBungeePlugin plugin; + + public BungeeCommand(CommonCommand command, BMBungeePlugin plugin) { + super(command.getCommandName(), command.getPermission(), command.getAliases().toArray(new String[0])); + this.command = command; + this.plugin = plugin; + + register(); + } + + @Override + public void execute(CommandSender sender, String[] args) { + CommonSender commonSender = getSender(sender); + boolean success = false; + + try { + success = this.command.onCommand(commonSender, this.command.getParser(args)); + } catch (NoSuchMethodException | IllegalAccessException | InstantiationException | InvocationTargetException e) { + e.printStackTrace(); + } + + if (!success) { + sender.sendMessage(TextComponent.fromLegacyText(command.getUsage())); + } + } + + private CommonSender getSender(CommandSender source) { + if (source instanceof ProxiedPlayer) { + return new BungeePlayer((ProxiedPlayer) source, BanManagerPlugin.getInstance().getConfig().isOnlineMode()); + } else { + return new BungeeSender(BanManagerPlugin.getInstance(), source); + } + } + + public void register() { + ProxyServer.getInstance().getPluginManager().registerCommand(plugin, this); + } + + @Override + public Iterable onTabComplete(CommandSender commandSender, String[] args) { + if (!this.command.isEnableTabCompletion()) return Collections.emptyList(); + + return this.command.handlePlayerNameTabComplete(getSender(commandSender), args); + } +} diff --git a/bungee/src/main/java/me/confuser/banmanager/bungee/BungeeMetrics.java b/bungee/src/main/java/me/confuser/banmanager/bungee/BungeeMetrics.java new file mode 100755 index 000000000..4c02af5f6 --- /dev/null +++ b/bungee/src/main/java/me/confuser/banmanager/bungee/BungeeMetrics.java @@ -0,0 +1,60 @@ +package me.confuser.banmanager.bungee; + +import me.confuser.banmanager.common.CommonMetrics; +import org.bstats.bungeecord.Metrics; +import org.bstats.charts.DrilldownPie; +import org.bstats.charts.SimplePie; + +import java.util.HashMap; +import java.util.Map; + +public class BungeeMetrics implements CommonMetrics { + private Metrics metrics; + + public BungeeMetrics(Metrics metrics) { + this.metrics = metrics; + } + + @Override + public void submitOnlineMode(boolean online) { + metrics.addCustomChart((new SimplePie("banmanagerMode", () -> online ? "online" : "offline"))); + } + + @Override + public void submitStorageType(String storageType) { + metrics.addCustomChart((new SimplePie("storageType", () -> storageType))); + } + + @Override + public void submitStorageVersion(String version) { + metrics.addCustomChart((new DrilldownPie("storageVersion", () -> { + Map> map = new HashMap<>(); + + Map entry = new HashMap<>(); + entry.put(version, 1); + + if (version.contains("Maria")) { + map.put("MariaDB", entry); + } else { + map.put("MySQL", entry); + } + + return map; + }))); + } + + @Override + public void submitGlobalMode(boolean enabled) { + metrics.addCustomChart((new SimplePie("globalMode", () -> enabled ? "enabled" : "disabled"))); + } + + @Override + public void submitGeoMode(boolean enabled) { + metrics.addCustomChart((new SimplePie("geoMode", () -> enabled ? "enabled" : "disabled"))); + } + + @Override + public void submitDiscordMode(boolean enabled) { +// metrics.addCustomChart((new Metrics.SimplePie("discordMode", () -> enabled ? "enabled" : "disabled"))); + } +} diff --git a/bungee/src/main/java/me/confuser/banmanager/bungee/BungeePlayer.java b/bungee/src/main/java/me/confuser/banmanager/bungee/BungeePlayer.java new file mode 100755 index 000000000..1f8e7a381 --- /dev/null +++ b/bungee/src/main/java/me/confuser/banmanager/bungee/BungeePlayer.java @@ -0,0 +1,116 @@ +package me.confuser.banmanager.bungee; + +import me.confuser.banmanager.common.CommonPlayer; +import me.confuser.banmanager.common.CommonWorld; +import me.confuser.banmanager.common.commands.CommonCommand; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.kyori.text.TextComponent; +import me.confuser.banmanager.common.util.Message; +import net.md_5.bungee.api.ProxyServer; +import net.md_5.bungee.api.connection.ProxiedPlayer; +import net.md_5.bungee.chat.ComponentSerializer; + +import java.net.InetAddress; +import java.util.UUID; + +public class BungeePlayer implements CommonPlayer { + private final UUID uuid; + private final boolean onlineMode; + private final ProxiedPlayer player; + + public BungeePlayer(ProxiedPlayer player, boolean onlineMode) { + this.player = player; + this.uuid = player.getUniqueId(); + this.onlineMode = onlineMode; + } + + @Override + public void kick(String message) { + player.disconnect(BungeeServer.formatMessage(message)); + } + + @Override + public void sendMessage(String message) { + if(message.isEmpty()) return; + + if(Message.isJSONMessage(message)) { + sendJSONMessage(message); + } else { + player.sendMessage(BungeeServer.formatMessage(message)); + } + } + + @Override + public void sendMessage(Message message) { + sendMessage(message.toString()); + } + + @Override + public void sendJSONMessage(TextComponent jsonString) { + player.sendMessage(BungeeServer.formatMessage(jsonString)); + } + + @Override + public void sendJSONMessage(String jsonString) { + player.sendMessage(ComponentSerializer.parse(jsonString)); + } + + @Override + public boolean isConsole() { + return false; + } + + @Override + public PlayerData getData() { + return CommonCommand.getPlayer(this, getName(), false); + } + + @Override + public boolean isOnlineMode() { + return onlineMode; + } + + @Override + public boolean isOnline() { + return getPlayer() != null; + } + + @Override + public boolean hasPermission(String permission) { + return player.hasPermission(permission); + } + + @Override + public String getDisplayName() { + return player.getDisplayName(); + } + + @Override + public String getName() { + return player.getName(); + } + + @Override + public InetAddress getAddress() { + return player.getAddress().getAddress(); + } + + @Override + public UUID getUniqueId() { + return uuid; + } + + @Override + public boolean teleport(CommonWorld world, double x, double y, double z, float pitch, float yaw) { + return false; + } + + @Override + public boolean canSee(CommonPlayer player) { + return true; + } + + private ProxiedPlayer getPlayer() { + return ProxyServer.getInstance().getPlayer(uuid); + } +} diff --git a/bungee/src/main/java/me/confuser/banmanager/bungee/BungeeScheduler.java b/bungee/src/main/java/me/confuser/banmanager/bungee/BungeeScheduler.java new file mode 100755 index 000000000..587ab9a2d --- /dev/null +++ b/bungee/src/main/java/me/confuser/banmanager/bungee/BungeeScheduler.java @@ -0,0 +1,35 @@ +package me.confuser.banmanager.bungee; + +import net.md_5.bungee.api.plugin.Plugin; +import me.confuser.banmanager.common.CommonScheduler; +import net.md_5.bungee.api.ProxyServer; + +import java.util.concurrent.TimeUnit; + +public class BungeeScheduler implements CommonScheduler { + private Plugin plugin; + + public BungeeScheduler(Plugin plugin) { + this.plugin = plugin; + } + + @Override + public void runAsync(Runnable task) { + ProxyServer.getInstance().getScheduler().runAsync(plugin, task); + } + + @Override + public void runAsyncLater(Runnable task, long delay) { + ProxyServer.getInstance().getScheduler().schedule(plugin, task, (delay / 20L), TimeUnit.SECONDS); + } + + @Override + public void runSync(Runnable task) { + runAsync(task); + } + + @Override + public void runSyncLater(Runnable task, long delay) { + runAsyncLater(task, delay); + } +} diff --git a/bungee/src/main/java/me/confuser/banmanager/bungee/BungeeSender.java b/bungee/src/main/java/me/confuser/banmanager/bungee/BungeeSender.java new file mode 100755 index 000000000..9eb5beba0 --- /dev/null +++ b/bungee/src/main/java/me/confuser/banmanager/bungee/BungeeSender.java @@ -0,0 +1,52 @@ +package me.confuser.banmanager.bungee; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.commands.CommonCommand; +import me.confuser.banmanager.common.commands.CommonSender; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.util.Message; +import net.md_5.bungee.api.CommandSender; +import net.md_5.bungee.api.connection.ProxiedPlayer; + +public class BungeeSender implements CommonSender { + + private BanManagerPlugin plugin; + private CommandSender sender; + + public BungeeSender(BanManagerPlugin plugin, CommandSender sender) { + this.plugin = plugin; + this.sender = sender; + } + + @Override + public String getName() { + return sender.getName(); + } + + @Override + public boolean hasPermission(String permission) { + return sender.hasPermission(permission); + } + + @Override + public void sendMessage(String message) { + sender.sendMessage(BungeeServer.formatMessage(message)); + } + + @Override + public void sendMessage(Message message) { + sendMessage(message.toString()); + } + + @Override + public boolean isConsole() { + return !(sender instanceof ProxiedPlayer); + } + + @Override + public PlayerData getData() { + if (isConsole()) return plugin.getPlayerStorage().getConsole(); + + return CommonCommand.getPlayer(this, getName(), false); + } +} diff --git a/bungee/src/main/java/me/confuser/banmanager/bungee/BungeeServer.java b/bungee/src/main/java/me/confuser/banmanager/bungee/BungeeServer.java new file mode 100755 index 000000000..d70083ef4 --- /dev/null +++ b/bungee/src/main/java/me/confuser/banmanager/bungee/BungeeServer.java @@ -0,0 +1,246 @@ +package me.confuser.banmanager.bungee; + +import me.confuser.banmanager.bungee.api.events.*; +import me.confuser.banmanager.common.*; +import me.confuser.banmanager.common.api.events.CommonEvent; +import me.confuser.banmanager.common.commands.CommonSender; +import me.confuser.banmanager.common.data.*; +import me.confuser.banmanager.common.kyori.text.TextComponent; +import me.confuser.banmanager.common.kyori.text.serializer.gson.GsonComponentSerializer; +import me.confuser.banmanager.common.util.Message; +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.BaseComponent; +import net.md_5.bungee.api.connection.ProxiedPlayer; +import net.md_5.bungee.api.plugin.Command; +import net.md_5.bungee.chat.ComponentSerializer; + +import java.util.Arrays; +import java.util.Map; +import java.util.UUID; +import java.util.stream.Collectors; + +public class BungeeServer implements CommonServer { + private BanManagerPlugin plugin; + + public void enable(BanManagerPlugin plugin) { + this.plugin = plugin; + } + + @Override + public CommonPlayer getPlayer(UUID uniqueId) { + ProxiedPlayer player = ProxyServer.getInstance().getPlayer(uniqueId); + + if (player == null) return null; + + return new BungeePlayer(player, plugin.getConfig().isOnlineMode()); + } + + @Override + public CommonPlayer getPlayer(String name) { + ProxiedPlayer player = ProxyServer.getInstance().getPlayer(name); + + if (player == null) return null; + + return new BungeePlayer(player, plugin.getConfig().isOnlineMode()); + } + + @Override + public CommonPlayer[] getOnlinePlayers() { + return ProxyServer.getInstance().getPlayers().stream() + .map(player -> new BungeePlayer(player, plugin.getConfig().isOnlineMode())) + .collect(Collectors.toList()).toArray(new CommonPlayer[0]); + } + + @Override + public void broadcast(String message, String permission) { + if(message.isEmpty()) return; + + for (ProxiedPlayer player : ProxyServer.getInstance().getPlayers()) { + if (player != null && player.hasPermission(permission)) { + player.sendMessage(formatMessage(message)); + } + } + } + + @Override + public void broadcastJSON(TextComponent message, String permission) { + for (ProxiedPlayer player : ProxyServer.getInstance().getPlayers()) { + if (player != null && player.hasPermission(permission)) { + player.sendMessage(formatMessage(message)); + } + } + } + + @Override + public void broadcast(String message, String permission, CommonSender sender) { + broadcast(message, permission); + + if (!sender.hasPermission(permission)) sender.sendMessage(message); + } + + @Override + public CommonSender getConsoleSender() { + return new BungeeSender(plugin, ProxyServer.getInstance().getConsole()); + } + + @Override + public boolean dispatchCommand(CommonSender sender, String command) { + CommandSender bungeeSender; + + if (sender.isConsole()) { + bungeeSender = ProxyServer.getInstance().getConsole(); + } else { + bungeeSender = ProxyServer.getInstance().getPlayer(sender.getName()); + } + + return ProxyServer.getInstance().getPluginManager().dispatchCommand(bungeeSender, command); + } + + @Override + public CommonWorld getWorld(String name) { + return null; + } + + @Override + public CommonEvent callEvent(String name, Object... args) { + // @TODO replace with a cleaner implementation + CustomEvent event = null; + CommonEvent commonEvent = new CommonEvent(false, true); + + switch (name) { + case "PlayerBanEvent": + event = new PlayerBanEvent((PlayerBanData) args[0], (boolean) args[1]); + break; + case "PlayerBannedEvent": + event = new PlayerBannedEvent((PlayerBanData) args[0], (boolean) args[1]); + break; + case "PlayerUnbanEvent": + event = new PlayerUnbanEvent((PlayerBanData) args[0], (PlayerData) args[1], (String) args[2]); + break; + + case "IpBanEvent": + event = new IpBanEvent((IpBanData) args[0], (boolean) args[1]); + break; + case "IpBannedEvent": + event = new IpBannedEvent((IpBanData) args[0], (boolean) args[1]); + break; + case "IpUnbanEvent": + event = new IpUnbanEvent((IpBanData) args[0], (PlayerData) args[1], (String) args[2]); + break; + + case "IpMuteEvent": + event = new IpMuteEvent((IpMuteData) args[0], (boolean) args[1]); + break; + case "IpMutedEvent": + event = new IpMutedEvent((IpMuteData) args[0], (boolean) args[1]); + break; + case "IpUnmutedEvent": + event = new IpUnmutedEvent((IpMuteData) args[0], (PlayerData) args[1], (String) args[2]); + break; + + case "PlayerKickedEvent": + event = new PlayerKickedEvent((PlayerKickData) args[0], (boolean) args[1]); + break; + + case "PlayerNoteCreatedEvent": + event = new PlayerNoteCreatedEvent((PlayerNoteData) args[0]); + break; + + case "PlayerReportEvent": + event = new PlayerReportEvent((PlayerReportData) args[0], (boolean) args[1]); + break; + case "PlayerReportedEvent": + event = new PlayerReportedEvent((PlayerReportData) args[0], (boolean) args[1]); + break; + case "PlayerReportDeletedEvent": + event = new PlayerReportDeletedEvent((PlayerReportData) args[0]); + break; + + case "NameBanEvent": + event = new NameBanEvent((NameBanData) args[0], (boolean) args[1]); + break; + case "NameBannedEvent": + event = new NameBannedEvent((NameBanData) args[0], (boolean) args[1]); + break; + case "NameUnbanEvent": + event = new NameUnbanEvent((NameBanData) args[0], (PlayerData) args[1], (String) args[2]); + break; + + case "PlayerWarnEvent": + event = new PlayerWarnEvent((PlayerWarnData) args[0], (boolean) args[1]); + break; + case "PlayerWarnedEvent": + event = new PlayerWarnedEvent((PlayerWarnData) args[0], (boolean) args[1]); + break; + + case "IpRangeBanEvent": + event = new IpRangeBanEvent((IpRangeBanData) args[0], (boolean) args[1]); + break; + case "IpRangeBannedEvent": + event = new IpRangeBannedEvent((IpRangeBanData) args[0], (boolean) args[1]); + break; + case "IpRangeUnbanEvent": + event = new IpRangeUnbanEvent((IpRangeBanData) args[0], (PlayerData) args[1], (String) args[2]); + break; + + case "PlayerMuteEvent": + event = new PlayerMuteEvent((PlayerMuteData) args[0], (boolean) args[1]); + break; + case "PlayerMutedEvent": + event = new PlayerMutedEvent((PlayerMuteData) args[0], (boolean) args[1]); + break; + case "PlayerUnmuteEvent": + event = new PlayerUnmuteEvent((PlayerMuteData) args[0], (PlayerData) args[1], (String) args[2]); + break; + + case "PluginReloadedEvent": + event = new PluginReloadedEvent((PlayerData) args[0]); + break; + + case "PlayerDeniedEvent": + event = new PlayerDeniedEvent((PlayerData) args[0], (Message) args[1]); + break; + } + + if (event == null) { + plugin.getLogger().warning("Unable to call missing event " + name); + + return commonEvent; + } + + ProxyServer.getInstance().getPluginManager().callEvent(event); + + if (event instanceof SilentCancellableEvent) { + commonEvent = new CommonEvent(((SilentCancellableEvent) event).isCancelled(), ((SilentCancellableEvent) event).isSilent()); + } else if (event instanceof SilentEvent) { + commonEvent = new CommonEvent(false, ((SilentEvent) event).isSilent()); + } else if (event instanceof CustomCancellableEvent) { + commonEvent = new CommonEvent(((CustomCancellableEvent) event).isCancelled(), true); + } + + return commonEvent; + } + + public static BaseComponent[] formatMessage(String message) { + return net.md_5.bungee.api.chat.TextComponent.fromLegacyText(ChatColor.translateAlternateColorCodes('&', message)); + } + + public static BaseComponent[] formatMessage(TextComponent message) { + return ComponentSerializer.parse(GsonComponentSerializer.gson().serialize(message)); + } + + @Override + public CommonExternalCommand getPluginCommand(String commandName) { + // @TODO Seems like BungeeCord doesn't expose an easy way to retrieve a command by name? + Map.Entry command = ProxyServer.getInstance().getPluginManager().getCommands().stream() + .filter(cmd -> cmd.getValue().getName().equals(commandName)) + .findFirst() + .orElse(null); + + if (command == null) return null; + + return new CommonExternalCommand(null, command.getValue().getName(), Arrays.asList(command.getValue().getAliases())); + } +} diff --git a/bungee/src/main/java/me/confuser/banmanager/bungee/PluginLogger.java b/bungee/src/main/java/me/confuser/banmanager/bungee/PluginLogger.java new file mode 100755 index 000000000..8a7e91500 --- /dev/null +++ b/bungee/src/main/java/me/confuser/banmanager/bungee/PluginLogger.java @@ -0,0 +1,29 @@ +package me.confuser.banmanager.bungee; + +import me.confuser.banmanager.common.CommonLogger; + +import java.util.logging.Logger; + +public class PluginLogger implements CommonLogger { + + private final Logger logger; + + public PluginLogger(Logger logger) { + this.logger = logger; + } + + @Override + public void info(String msg) { + logger.info(msg); + } + + @Override + public void warning(String msg) { + logger.warning(msg); + } + + @Override + public void severe(String msg) { + logger.severe(msg); + } +} diff --git a/bungee/src/main/java/me/confuser/banmanager/bungee/api/events/CustomCancellableEvent.java b/bungee/src/main/java/me/confuser/banmanager/bungee/api/events/CustomCancellableEvent.java new file mode 100755 index 000000000..37596d608 --- /dev/null +++ b/bungee/src/main/java/me/confuser/banmanager/bungee/api/events/CustomCancellableEvent.java @@ -0,0 +1,16 @@ +package me.confuser.banmanager.bungee.api.events; + +import lombok.Getter; +import lombok.Setter; +import net.md_5.bungee.api.plugin.Cancellable; + +public abstract class CustomCancellableEvent extends CustomEvent implements Cancellable { + + @Getter + @Setter + private boolean cancelled = false; + + public CustomCancellableEvent() { + super(); + } +} diff --git a/bungee/src/main/java/me/confuser/banmanager/bungee/api/events/CustomEvent.java b/bungee/src/main/java/me/confuser/banmanager/bungee/api/events/CustomEvent.java new file mode 100755 index 000000000..4de2a8a46 --- /dev/null +++ b/bungee/src/main/java/me/confuser/banmanager/bungee/api/events/CustomEvent.java @@ -0,0 +1,6 @@ +package me.confuser.banmanager.bungee.api.events; + +import net.md_5.bungee.api.plugin.Event; + +public abstract class CustomEvent extends Event { +} diff --git a/src/main/java/me/confuser/banmanager/events/IpBanEvent.java b/bungee/src/main/java/me/confuser/banmanager/bungee/api/events/IpBanEvent.java old mode 100644 new mode 100755 similarity index 67% rename from src/main/java/me/confuser/banmanager/events/IpBanEvent.java rename to bungee/src/main/java/me/confuser/banmanager/bungee/api/events/IpBanEvent.java index e31dc3f4f..b0dcf8bc5 --- a/src/main/java/me/confuser/banmanager/events/IpBanEvent.java +++ b/bungee/src/main/java/me/confuser/banmanager/bungee/api/events/IpBanEvent.java @@ -1,7 +1,7 @@ -package me.confuser.banmanager.events; +package me.confuser.banmanager.bungee.api.events; import lombok.Getter; -import me.confuser.banmanager.data.IpBanData; +import me.confuser.banmanager.common.data.IpBanData; public class IpBanEvent extends SilentCancellableEvent { diff --git a/src/main/java/me/confuser/banmanager/events/IpBannedEvent.java b/bungee/src/main/java/me/confuser/banmanager/bungee/api/events/IpBannedEvent.java old mode 100644 new mode 100755 similarity index 67% rename from src/main/java/me/confuser/banmanager/events/IpBannedEvent.java rename to bungee/src/main/java/me/confuser/banmanager/bungee/api/events/IpBannedEvent.java index 1f61dd09e..1e78287e2 --- a/src/main/java/me/confuser/banmanager/events/IpBannedEvent.java +++ b/bungee/src/main/java/me/confuser/banmanager/bungee/api/events/IpBannedEvent.java @@ -1,7 +1,7 @@ -package me.confuser.banmanager.events; +package me.confuser.banmanager.bungee.api.events; import lombok.Getter; -import me.confuser.banmanager.data.IpBanData; +import me.confuser.banmanager.common.data.IpBanData; public class IpBannedEvent extends SilentEvent { diff --git a/src/main/java/me/confuser/banmanager/events/IpMuteEvent.java b/bungee/src/main/java/me/confuser/banmanager/bungee/api/events/IpMuteEvent.java old mode 100644 new mode 100755 similarity index 68% rename from src/main/java/me/confuser/banmanager/events/IpMuteEvent.java rename to bungee/src/main/java/me/confuser/banmanager/bungee/api/events/IpMuteEvent.java index 717a5f4e5..d712ee46b --- a/src/main/java/me/confuser/banmanager/events/IpMuteEvent.java +++ b/bungee/src/main/java/me/confuser/banmanager/bungee/api/events/IpMuteEvent.java @@ -1,7 +1,7 @@ -package me.confuser.banmanager.events; +package me.confuser.banmanager.bungee.api.events; import lombok.Getter; -import me.confuser.banmanager.data.IpMuteData; +import me.confuser.banmanager.common.data.IpMuteData; public class IpMuteEvent extends SilentCancellableEvent { diff --git a/src/main/java/me/confuser/banmanager/events/IpMutedEvent.java b/bungee/src/main/java/me/confuser/banmanager/bungee/api/events/IpMutedEvent.java old mode 100644 new mode 100755 similarity index 67% rename from src/main/java/me/confuser/banmanager/events/IpMutedEvent.java rename to bungee/src/main/java/me/confuser/banmanager/bungee/api/events/IpMutedEvent.java index ead1df7d3..818c3ba04 --- a/src/main/java/me/confuser/banmanager/events/IpMutedEvent.java +++ b/bungee/src/main/java/me/confuser/banmanager/bungee/api/events/IpMutedEvent.java @@ -1,7 +1,7 @@ -package me.confuser.banmanager.events; +package me.confuser.banmanager.bungee.api.events; import lombok.Getter; -import me.confuser.banmanager.data.IpMuteData; +import me.confuser.banmanager.common.data.IpMuteData; public class IpMutedEvent extends SilentEvent { diff --git a/src/main/java/me/confuser/banmanager/events/IpRangeBanEvent.java b/bungee/src/main/java/me/confuser/banmanager/bungee/api/events/IpRangeBanEvent.java old mode 100644 new mode 100755 similarity index 68% rename from src/main/java/me/confuser/banmanager/events/IpRangeBanEvent.java rename to bungee/src/main/java/me/confuser/banmanager/bungee/api/events/IpRangeBanEvent.java index 53dcb4a80..134d5aec8 --- a/src/main/java/me/confuser/banmanager/events/IpRangeBanEvent.java +++ b/bungee/src/main/java/me/confuser/banmanager/bungee/api/events/IpRangeBanEvent.java @@ -1,7 +1,7 @@ -package me.confuser.banmanager.events; +package me.confuser.banmanager.bungee.api.events; import lombok.Getter; -import me.confuser.banmanager.data.IpRangeBanData; +import me.confuser.banmanager.common.data.IpRangeBanData; public class IpRangeBanEvent extends SilentCancellableEvent { diff --git a/src/main/java/me/confuser/banmanager/events/IpRangeBannedEvent.java b/bungee/src/main/java/me/confuser/banmanager/bungee/api/events/IpRangeBannedEvent.java old mode 100644 new mode 100755 similarity index 67% rename from src/main/java/me/confuser/banmanager/events/IpRangeBannedEvent.java rename to bungee/src/main/java/me/confuser/banmanager/bungee/api/events/IpRangeBannedEvent.java index 5de2246ca..df23aab5d --- a/src/main/java/me/confuser/banmanager/events/IpRangeBannedEvent.java +++ b/bungee/src/main/java/me/confuser/banmanager/bungee/api/events/IpRangeBannedEvent.java @@ -1,7 +1,8 @@ -package me.confuser.banmanager.events; +package me.confuser.banmanager.bungee.api.events; import lombok.Getter; -import me.confuser.banmanager.data.IpRangeBanData; +import me.confuser.banmanager.common.data.IpRangeBanData; + public class IpRangeBannedEvent extends SilentEvent { diff --git a/src/main/java/me/confuser/banmanager/events/IpRangeUnbanEvent.java b/bungee/src/main/java/me/confuser/banmanager/bungee/api/events/IpRangeUnbanEvent.java old mode 100644 new mode 100755 similarity index 67% rename from src/main/java/me/confuser/banmanager/events/IpRangeUnbanEvent.java rename to bungee/src/main/java/me/confuser/banmanager/bungee/api/events/IpRangeUnbanEvent.java index 0767b10e8..164819d07 --- a/src/main/java/me/confuser/banmanager/events/IpRangeUnbanEvent.java +++ b/bungee/src/main/java/me/confuser/banmanager/bungee/api/events/IpRangeUnbanEvent.java @@ -1,8 +1,9 @@ -package me.confuser.banmanager.events; +package me.confuser.banmanager.bungee.api.events; import lombok.Getter; -import me.confuser.banmanager.data.IpRangeBanData; -import me.confuser.banmanager.data.PlayerData; +import me.confuser.banmanager.common.data.IpRangeBanData; +import me.confuser.banmanager.common.data.PlayerData; + public class IpRangeUnbanEvent extends CustomCancellableEvent { @@ -14,6 +15,8 @@ public class IpRangeUnbanEvent extends CustomCancellableEvent { private String reason; public IpRangeUnbanEvent(IpRangeBanData ban, PlayerData actor, String reason) { + super(); + this.ban = ban; this.actor = actor; this.reason = reason; diff --git a/src/main/java/me/confuser/banmanager/events/IpUnbanEvent.java b/bungee/src/main/java/me/confuser/banmanager/bungee/api/events/IpUnbanEvent.java old mode 100644 new mode 100755 similarity index 66% rename from src/main/java/me/confuser/banmanager/events/IpUnbanEvent.java rename to bungee/src/main/java/me/confuser/banmanager/bungee/api/events/IpUnbanEvent.java index dc0cdb548..9a9f1a00b --- a/src/main/java/me/confuser/banmanager/events/IpUnbanEvent.java +++ b/bungee/src/main/java/me/confuser/banmanager/bungee/api/events/IpUnbanEvent.java @@ -1,8 +1,9 @@ -package me.confuser.banmanager.events; +package me.confuser.banmanager.bungee.api.events; import lombok.Getter; -import me.confuser.banmanager.data.IpBanData; -import me.confuser.banmanager.data.PlayerData; +import me.confuser.banmanager.common.data.IpBanData; +import me.confuser.banmanager.common.data.PlayerData; + public class IpUnbanEvent extends CustomCancellableEvent { @@ -14,6 +15,8 @@ public class IpUnbanEvent extends CustomCancellableEvent { private String reason; public IpUnbanEvent(IpBanData ban, PlayerData actor, String reason) { + super(); + this.ban = ban; this.actor = actor; this.reason = reason; diff --git a/src/main/java/me/confuser/banmanager/events/IpUnmutedEvent.java b/bungee/src/main/java/me/confuser/banmanager/bungee/api/events/IpUnmutedEvent.java old mode 100644 new mode 100755 similarity index 66% rename from src/main/java/me/confuser/banmanager/events/IpUnmutedEvent.java rename to bungee/src/main/java/me/confuser/banmanager/bungee/api/events/IpUnmutedEvent.java index 55288c443..97c06db5d --- a/src/main/java/me/confuser/banmanager/events/IpUnmutedEvent.java +++ b/bungee/src/main/java/me/confuser/banmanager/bungee/api/events/IpUnmutedEvent.java @@ -1,8 +1,9 @@ -package me.confuser.banmanager.events; +package me.confuser.banmanager.bungee.api.events; import lombok.Getter; -import me.confuser.banmanager.data.IpMuteData; -import me.confuser.banmanager.data.PlayerData; +import me.confuser.banmanager.common.data.IpMuteData; +import me.confuser.banmanager.common.data.PlayerData; + public class IpUnmutedEvent extends CustomCancellableEvent { @@ -14,6 +15,8 @@ public class IpUnmutedEvent extends CustomCancellableEvent { private String reason; public IpUnmutedEvent(IpMuteData mute, PlayerData actor, String reason) { + super(); + this.mute = mute; this.actor = actor; this.reason = reason; diff --git a/src/main/java/me/confuser/banmanager/events/NameBanEvent.java b/bungee/src/main/java/me/confuser/banmanager/bungee/api/events/NameBanEvent.java old mode 100644 new mode 100755 similarity index 68% rename from src/main/java/me/confuser/banmanager/events/NameBanEvent.java rename to bungee/src/main/java/me/confuser/banmanager/bungee/api/events/NameBanEvent.java index 8a9b54037..c33781f08 --- a/src/main/java/me/confuser/banmanager/events/NameBanEvent.java +++ b/bungee/src/main/java/me/confuser/banmanager/bungee/api/events/NameBanEvent.java @@ -1,7 +1,8 @@ -package me.confuser.banmanager.events; +package me.confuser.banmanager.bungee.api.events; import lombok.Getter; -import me.confuser.banmanager.data.NameBanData; +import me.confuser.banmanager.common.data.NameBanData; + public class NameBanEvent extends SilentCancellableEvent { diff --git a/src/main/java/me/confuser/banmanager/events/NameBannedEvent.java b/bungee/src/main/java/me/confuser/banmanager/bungee/api/events/NameBannedEvent.java old mode 100644 new mode 100755 similarity index 68% rename from src/main/java/me/confuser/banmanager/events/NameBannedEvent.java rename to bungee/src/main/java/me/confuser/banmanager/bungee/api/events/NameBannedEvent.java index a20c3b5d3..b50e72435 --- a/src/main/java/me/confuser/banmanager/events/NameBannedEvent.java +++ b/bungee/src/main/java/me/confuser/banmanager/bungee/api/events/NameBannedEvent.java @@ -1,7 +1,7 @@ -package me.confuser.banmanager.events; +package me.confuser.banmanager.bungee.api.events; import lombok.Getter; -import me.confuser.banmanager.data.NameBanData; +import me.confuser.banmanager.common.data.NameBanData; public class NameBannedEvent extends SilentEvent { diff --git a/bungee/src/main/java/me/confuser/banmanager/bungee/api/events/NameUnbanEvent.java b/bungee/src/main/java/me/confuser/banmanager/bungee/api/events/NameUnbanEvent.java new file mode 100755 index 000000000..cd08cc747 --- /dev/null +++ b/bungee/src/main/java/me/confuser/banmanager/bungee/api/events/NameUnbanEvent.java @@ -0,0 +1,25 @@ +package me.confuser.banmanager.bungee.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.NameBanData; +import me.confuser.banmanager.common.data.PlayerData; + + +public class NameUnbanEvent extends CustomCancellableEvent { + + @Getter + private NameBanData ban; + @Getter + private PlayerData actor; + @Getter + private String reason; + + public NameUnbanEvent(NameBanData ban, PlayerData actor, String reason) { + super(); + + this.ban = ban; + this.actor = actor; + this.reason = reason; + } + +} diff --git a/src/main/java/me/confuser/banmanager/events/PlayerBanEvent.java b/bungee/src/main/java/me/confuser/banmanager/bungee/api/events/PlayerBanEvent.java old mode 100644 new mode 100755 similarity index 68% rename from src/main/java/me/confuser/banmanager/events/PlayerBanEvent.java rename to bungee/src/main/java/me/confuser/banmanager/bungee/api/events/PlayerBanEvent.java index d8529d632..855785272 --- a/src/main/java/me/confuser/banmanager/events/PlayerBanEvent.java +++ b/bungee/src/main/java/me/confuser/banmanager/bungee/api/events/PlayerBanEvent.java @@ -1,7 +1,8 @@ -package me.confuser.banmanager.events; +package me.confuser.banmanager.bungee.api.events; import lombok.Getter; -import me.confuser.banmanager.data.PlayerBanData; +import me.confuser.banmanager.common.data.PlayerBanData; + public class PlayerBanEvent extends SilentCancellableEvent { diff --git a/src/main/java/me/confuser/banmanager/events/PlayerBannedEvent.java b/bungee/src/main/java/me/confuser/banmanager/bungee/api/events/PlayerBannedEvent.java old mode 100644 new mode 100755 similarity index 68% rename from src/main/java/me/confuser/banmanager/events/PlayerBannedEvent.java rename to bungee/src/main/java/me/confuser/banmanager/bungee/api/events/PlayerBannedEvent.java index 5394396d0..86d6a8e1d --- a/src/main/java/me/confuser/banmanager/events/PlayerBannedEvent.java +++ b/bungee/src/main/java/me/confuser/banmanager/bungee/api/events/PlayerBannedEvent.java @@ -1,7 +1,8 @@ -package me.confuser.banmanager.events; +package me.confuser.banmanager.bungee.api.events; import lombok.Getter; -import me.confuser.banmanager.data.PlayerBanData; +import me.confuser.banmanager.common.data.PlayerBanData; + public class PlayerBannedEvent extends SilentEvent { diff --git a/bungee/src/main/java/me/confuser/banmanager/bungee/api/events/PlayerDeniedEvent.java b/bungee/src/main/java/me/confuser/banmanager/bungee/api/events/PlayerDeniedEvent.java new file mode 100644 index 000000000..e0287d1d6 --- /dev/null +++ b/bungee/src/main/java/me/confuser/banmanager/bungee/api/events/PlayerDeniedEvent.java @@ -0,0 +1,23 @@ +package me.confuser.banmanager.bungee.api.events; + +import lombok.Getter; +import lombok.Setter; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.util.Message; + +public class PlayerDeniedEvent extends CustomCancellableEvent { + + @Getter + @Setter + private Message message; + + @Getter + private PlayerData player; + + public PlayerDeniedEvent(PlayerData player, Message message) { + super(); + + this.player = player; + this.message = message; + } +} diff --git a/bungee/src/main/java/me/confuser/banmanager/bungee/api/events/PlayerKickedEvent.java b/bungee/src/main/java/me/confuser/banmanager/bungee/api/events/PlayerKickedEvent.java new file mode 100755 index 000000000..a6915df51 --- /dev/null +++ b/bungee/src/main/java/me/confuser/banmanager/bungee/api/events/PlayerKickedEvent.java @@ -0,0 +1,15 @@ +package me.confuser.banmanager.bungee.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.PlayerKickData; + +public class PlayerKickedEvent extends SilentEvent { + + @Getter + private PlayerKickData kick; + + public PlayerKickedEvent(PlayerKickData kick, boolean isSilent) { + super(isSilent); + this.kick = kick; + } +} diff --git a/src/main/java/me/confuser/banmanager/events/PlayerMuteEvent.java b/bungee/src/main/java/me/confuser/banmanager/bungee/api/events/PlayerMuteEvent.java old mode 100644 new mode 100755 similarity index 68% rename from src/main/java/me/confuser/banmanager/events/PlayerMuteEvent.java rename to bungee/src/main/java/me/confuser/banmanager/bungee/api/events/PlayerMuteEvent.java index 9ee7b51b1..e228f303e --- a/src/main/java/me/confuser/banmanager/events/PlayerMuteEvent.java +++ b/bungee/src/main/java/me/confuser/banmanager/bungee/api/events/PlayerMuteEvent.java @@ -1,7 +1,8 @@ -package me.confuser.banmanager.events; +package me.confuser.banmanager.bungee.api.events; import lombok.Getter; -import me.confuser.banmanager.data.PlayerMuteData; +import me.confuser.banmanager.common.data.PlayerMuteData; + public class PlayerMuteEvent extends SilentCancellableEvent { diff --git a/src/main/java/me/confuser/banmanager/events/PlayerMutedEvent.java b/bungee/src/main/java/me/confuser/banmanager/bungee/api/events/PlayerMutedEvent.java old mode 100644 new mode 100755 similarity index 67% rename from src/main/java/me/confuser/banmanager/events/PlayerMutedEvent.java rename to bungee/src/main/java/me/confuser/banmanager/bungee/api/events/PlayerMutedEvent.java index dd8d56894..5e488073e --- a/src/main/java/me/confuser/banmanager/events/PlayerMutedEvent.java +++ b/bungee/src/main/java/me/confuser/banmanager/bungee/api/events/PlayerMutedEvent.java @@ -1,7 +1,8 @@ -package me.confuser.banmanager.events; +package me.confuser.banmanager.bungee.api.events; import lombok.Getter; -import me.confuser.banmanager.data.PlayerMuteData; +import me.confuser.banmanager.common.data.PlayerMuteData; + public class PlayerMutedEvent extends SilentEvent { diff --git a/src/main/java/me/confuser/banmanager/events/PlayerNoteCreatedEvent.java b/bungee/src/main/java/me/confuser/banmanager/bungee/api/events/PlayerNoteCreatedEvent.java old mode 100644 new mode 100755 similarity index 64% rename from src/main/java/me/confuser/banmanager/events/PlayerNoteCreatedEvent.java rename to bungee/src/main/java/me/confuser/banmanager/bungee/api/events/PlayerNoteCreatedEvent.java index fd1c42d1e..1492f5d64 --- a/src/main/java/me/confuser/banmanager/events/PlayerNoteCreatedEvent.java +++ b/bungee/src/main/java/me/confuser/banmanager/bungee/api/events/PlayerNoteCreatedEvent.java @@ -1,7 +1,8 @@ -package me.confuser.banmanager.events; +package me.confuser.banmanager.bungee.api.events; import lombok.Getter; -import me.confuser.banmanager.data.PlayerNoteData; +import me.confuser.banmanager.common.data.PlayerNoteData; + public class PlayerNoteCreatedEvent extends CustomCancellableEvent { @@ -9,6 +10,7 @@ public class PlayerNoteCreatedEvent extends CustomCancellableEvent { private PlayerNoteData note; public PlayerNoteCreatedEvent(PlayerNoteData note) { + super(); this.note = note; } } diff --git a/bungee/src/main/java/me/confuser/banmanager/bungee/api/events/PlayerReportDeletedEvent.java b/bungee/src/main/java/me/confuser/banmanager/bungee/api/events/PlayerReportDeletedEvent.java new file mode 100755 index 000000000..43c585110 --- /dev/null +++ b/bungee/src/main/java/me/confuser/banmanager/bungee/api/events/PlayerReportDeletedEvent.java @@ -0,0 +1,15 @@ +package me.confuser.banmanager.bungee.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.PlayerReportData; + +public class PlayerReportDeletedEvent extends CustomEvent { + + @Getter + private PlayerReportData report; + + public PlayerReportDeletedEvent(PlayerReportData report) { + super(); + this.report = report; + } +} diff --git a/src/main/java/me/confuser/banmanager/events/PlayerReportEvent.java b/bungee/src/main/java/me/confuser/banmanager/bungee/api/events/PlayerReportEvent.java old mode 100644 new mode 100755 similarity index 70% rename from src/main/java/me/confuser/banmanager/events/PlayerReportEvent.java rename to bungee/src/main/java/me/confuser/banmanager/bungee/api/events/PlayerReportEvent.java index d1a0b78c4..86f7492b0 --- a/src/main/java/me/confuser/banmanager/events/PlayerReportEvent.java +++ b/bungee/src/main/java/me/confuser/banmanager/bungee/api/events/PlayerReportEvent.java @@ -1,7 +1,8 @@ -package me.confuser.banmanager.events; +package me.confuser.banmanager.bungee.api.events; import lombok.Getter; -import me.confuser.banmanager.data.PlayerReportData; +import me.confuser.banmanager.common.data.PlayerReportData; + public class PlayerReportEvent extends SilentCancellableEvent { diff --git a/src/main/java/me/confuser/banmanager/events/PlayerReportedEvent.java b/bungee/src/main/java/me/confuser/banmanager/bungee/api/events/PlayerReportedEvent.java old mode 100644 new mode 100755 similarity index 69% rename from src/main/java/me/confuser/banmanager/events/PlayerReportedEvent.java rename to bungee/src/main/java/me/confuser/banmanager/bungee/api/events/PlayerReportedEvent.java index 1676976e4..3c8c59190 --- a/src/main/java/me/confuser/banmanager/events/PlayerReportedEvent.java +++ b/bungee/src/main/java/me/confuser/banmanager/bungee/api/events/PlayerReportedEvent.java @@ -1,7 +1,8 @@ -package me.confuser.banmanager.events; +package me.confuser.banmanager.bungee.api.events; import lombok.Getter; -import me.confuser.banmanager.data.PlayerReportData; +import me.confuser.banmanager.common.data.PlayerReportData; + public class PlayerReportedEvent extends SilentEvent { diff --git a/src/main/java/me/confuser/banmanager/events/PlayerUnbanEvent.java b/bungee/src/main/java/me/confuser/banmanager/bungee/api/events/PlayerUnbanEvent.java old mode 100644 new mode 100755 similarity index 67% rename from src/main/java/me/confuser/banmanager/events/PlayerUnbanEvent.java rename to bungee/src/main/java/me/confuser/banmanager/bungee/api/events/PlayerUnbanEvent.java index 2c1fa4991..e64aa2ca2 --- a/src/main/java/me/confuser/banmanager/events/PlayerUnbanEvent.java +++ b/bungee/src/main/java/me/confuser/banmanager/bungee/api/events/PlayerUnbanEvent.java @@ -1,8 +1,9 @@ -package me.confuser.banmanager.events; +package me.confuser.banmanager.bungee.api.events; import lombok.Getter; -import me.confuser.banmanager.data.PlayerBanData; -import me.confuser.banmanager.data.PlayerData; +import me.confuser.banmanager.common.data.PlayerBanData; +import me.confuser.banmanager.common.data.PlayerData; + public class PlayerUnbanEvent extends CustomCancellableEvent { @@ -14,6 +15,8 @@ public class PlayerUnbanEvent extends CustomCancellableEvent { private String reason; public PlayerUnbanEvent(PlayerBanData ban, PlayerData actor, String reason) { + super(); + this.ban = ban; this.actor = actor; this.reason = reason; diff --git a/src/main/java/me/confuser/banmanager/events/PlayerUnmuteEvent.java b/bungee/src/main/java/me/confuser/banmanager/bungee/api/events/PlayerUnmuteEvent.java old mode 100644 new mode 100755 similarity index 67% rename from src/main/java/me/confuser/banmanager/events/PlayerUnmuteEvent.java rename to bungee/src/main/java/me/confuser/banmanager/bungee/api/events/PlayerUnmuteEvent.java index 05b2fc7dc..3a9196da4 --- a/src/main/java/me/confuser/banmanager/events/PlayerUnmuteEvent.java +++ b/bungee/src/main/java/me/confuser/banmanager/bungee/api/events/PlayerUnmuteEvent.java @@ -1,8 +1,9 @@ -package me.confuser.banmanager.events; +package me.confuser.banmanager.bungee.api.events; import lombok.Getter; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.data.PlayerMuteData; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.data.PlayerMuteData; + public class PlayerUnmuteEvent extends CustomCancellableEvent { @@ -14,6 +15,8 @@ public class PlayerUnmuteEvent extends CustomCancellableEvent { private String reason; public PlayerUnmuteEvent(PlayerMuteData mute, PlayerData actor, String reason) { + super(); + this.mute = mute; this.actor = actor; this.reason = reason; diff --git a/src/main/java/me/confuser/banmanager/events/PlayerWarnEvent.java b/bungee/src/main/java/me/confuser/banmanager/bungee/api/events/PlayerWarnEvent.java old mode 100644 new mode 100755 similarity index 54% rename from src/main/java/me/confuser/banmanager/events/PlayerWarnEvent.java rename to bungee/src/main/java/me/confuser/banmanager/bungee/api/events/PlayerWarnEvent.java index 0a77cd43a..6ceedf5ce --- a/src/main/java/me/confuser/banmanager/events/PlayerWarnEvent.java +++ b/bungee/src/main/java/me/confuser/banmanager/bungee/api/events/PlayerWarnEvent.java @@ -1,9 +1,10 @@ -package me.confuser.banmanager.events; +package me.confuser.banmanager.bungee.api.events; import lombok.Getter; -import me.confuser.banmanager.data.PlayerWarnData; +import me.confuser.banmanager.common.data.PlayerWarnData; -public class PlayerWarnEvent extends SilentCancellableEvent { + +public class PlayerWarnEvent extends SilentEvent { @Getter private PlayerWarnData warning; diff --git a/src/main/java/me/confuser/banmanager/events/PlayerWarnedEvent.java b/bungee/src/main/java/me/confuser/banmanager/bungee/api/events/PlayerWarnedEvent.java old mode 100644 new mode 100755 similarity index 69% rename from src/main/java/me/confuser/banmanager/events/PlayerWarnedEvent.java rename to bungee/src/main/java/me/confuser/banmanager/bungee/api/events/PlayerWarnedEvent.java index d35697d73..fb9e88010 --- a/src/main/java/me/confuser/banmanager/events/PlayerWarnedEvent.java +++ b/bungee/src/main/java/me/confuser/banmanager/bungee/api/events/PlayerWarnedEvent.java @@ -1,7 +1,8 @@ -package me.confuser.banmanager.events; +package me.confuser.banmanager.bungee.api.events; import lombok.Getter; -import me.confuser.banmanager.data.PlayerWarnData; +import me.confuser.banmanager.common.data.PlayerWarnData; + public class PlayerWarnedEvent extends SilentEvent { diff --git a/bungee/src/main/java/me/confuser/banmanager/bungee/api/events/PluginReloadedEvent.java b/bungee/src/main/java/me/confuser/banmanager/bungee/api/events/PluginReloadedEvent.java new file mode 100644 index 000000000..ba2ca92e0 --- /dev/null +++ b/bungee/src/main/java/me/confuser/banmanager/bungee/api/events/PluginReloadedEvent.java @@ -0,0 +1,17 @@ +package me.confuser.banmanager.bungee.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.PlayerData; + + +public class PluginReloadedEvent extends CustomCancellableEvent { + + @Getter + private PlayerData actor; + + public PluginReloadedEvent(PlayerData actor) { + super(); + + this.actor = actor; + } +} diff --git a/src/main/java/me/confuser/banmanager/events/SilentCancellableEvent.java b/bungee/src/main/java/me/confuser/banmanager/bungee/api/events/SilentCancellableEvent.java old mode 100644 new mode 100755 similarity index 71% rename from src/main/java/me/confuser/banmanager/events/SilentCancellableEvent.java rename to bungee/src/main/java/me/confuser/banmanager/bungee/api/events/SilentCancellableEvent.java index f6ecf1efc..34234d8e9 --- a/src/main/java/me/confuser/banmanager/events/SilentCancellableEvent.java +++ b/bungee/src/main/java/me/confuser/banmanager/bungee/api/events/SilentCancellableEvent.java @@ -1,14 +1,17 @@ -package me.confuser.banmanager.events; +package me.confuser.banmanager.bungee.api.events; import lombok.Getter; import lombok.Setter; public abstract class SilentCancellableEvent extends CustomCancellableEvent { + @Getter @Setter - private boolean silent = false; + private boolean silent; public SilentCancellableEvent(boolean silent) { + super(); + this.silent = silent; } diff --git a/src/main/java/me/confuser/banmanager/events/SilentEvent.java b/bungee/src/main/java/me/confuser/banmanager/bungee/api/events/SilentEvent.java old mode 100644 new mode 100755 similarity index 78% rename from src/main/java/me/confuser/banmanager/events/SilentEvent.java rename to bungee/src/main/java/me/confuser/banmanager/bungee/api/events/SilentEvent.java index 4dbe841d9..c834216e3 --- a/src/main/java/me/confuser/banmanager/events/SilentEvent.java +++ b/bungee/src/main/java/me/confuser/banmanager/bungee/api/events/SilentEvent.java @@ -1,4 +1,4 @@ -package me.confuser.banmanager.events; +package me.confuser.banmanager.bungee.api.events; import lombok.Getter; import lombok.Setter; @@ -9,6 +9,8 @@ public abstract class SilentEvent extends CustomEvent { private boolean silent = false; public SilentEvent(boolean silent) { + super(); + this.silent = silent; } diff --git a/bungee/src/main/java/me/confuser/banmanager/bungee/configs/BungeeConfig.java b/bungee/src/main/java/me/confuser/banmanager/bungee/configs/BungeeConfig.java new file mode 100755 index 000000000..41cdf1fc2 --- /dev/null +++ b/bungee/src/main/java/me/confuser/banmanager/bungee/configs/BungeeConfig.java @@ -0,0 +1,25 @@ +package me.confuser.banmanager.bungee.configs; + +import lombok.Getter; +import me.confuser.banmanager.common.CommonLogger; +import me.confuser.banmanager.common.configs.Config; + +import java.io.File; + +public class BungeeConfig extends Config { + @Getter + private boolean commandsEnabled = false; + + public BungeeConfig(File dataFolder, CommonLogger logger) { + super(dataFolder, "bungeecord.yml", logger); + } + + @Override + public void afterLoad() { + commandsEnabled = conf.getBoolean("features.commands", false); + } + + @Override + public void onSave() { + } +} diff --git a/bungee/src/main/java/me/confuser/banmanager/bungee/listeners/BanListener.java b/bungee/src/main/java/me/confuser/banmanager/bungee/listeners/BanListener.java new file mode 100755 index 000000000..d7059c7a4 --- /dev/null +++ b/bungee/src/main/java/me/confuser/banmanager/bungee/listeners/BanListener.java @@ -0,0 +1,41 @@ +package me.confuser.banmanager.bungee.listeners; + + +import me.confuser.banmanager.bungee.api.events.IpBannedEvent; +import me.confuser.banmanager.bungee.api.events.IpRangeBannedEvent; +import me.confuser.banmanager.bungee.api.events.NameBannedEvent; +import me.confuser.banmanager.bungee.api.events.PlayerBannedEvent; +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.listeners.CommonBanListener; +import net.md_5.bungee.api.plugin.Listener; +import net.md_5.bungee.event.EventHandler; +import net.md_5.bungee.event.EventPriority; + +public class BanListener implements Listener { + + private final CommonBanListener listener; + + public BanListener(BanManagerPlugin plugin) { + this.listener = new CommonBanListener(plugin); + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void notifyOnBan(PlayerBannedEvent event) { + listener.notifyOnBan(event.getBan(), event.isSilent()); + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void notifyOnIpBan(IpBannedEvent event) { + listener.notifyOnBan(event.getBan(), event.isSilent()); + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void notifyOnIpRangeBan(IpRangeBannedEvent event) { + listener.notifyOnBan(event.getBan(), event.isSilent()); + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void notifyOnNameBan(NameBannedEvent event) { + listener.notifyOnBan(event.getBan(), event.isSilent()); + } +} diff --git a/bungee/src/main/java/me/confuser/banmanager/bungee/listeners/ChatListener.java b/bungee/src/main/java/me/confuser/banmanager/bungee/listeners/ChatListener.java new file mode 100755 index 000000000..d92462a7f --- /dev/null +++ b/bungee/src/main/java/me/confuser/banmanager/bungee/listeners/ChatListener.java @@ -0,0 +1,58 @@ +package me.confuser.banmanager.bungee.listeners; + + +import lombok.RequiredArgsConstructor; +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.CommonPlayer; +import me.confuser.banmanager.common.listeners.CommonChatHandler; +import me.confuser.banmanager.common.listeners.CommonChatListener; +import me.confuser.banmanager.common.listeners.CommonCommandListener; +import net.md_5.bungee.api.connection.ProxiedPlayer; +import net.md_5.bungee.api.event.ChatEvent; +import net.md_5.bungee.api.plugin.Listener; +import net.md_5.bungee.event.EventHandler; + +public class ChatListener implements Listener { + private final CommonChatListener listener; + private final CommonCommandListener commandListener; + private BanManagerPlugin plugin; + + public ChatListener(BanManagerPlugin plugin) { + this.plugin = plugin; + this.listener = new CommonChatListener(plugin); + this.commandListener = new CommonCommandListener(plugin); + } + + @EventHandler + public void onPlayerChat(ChatEvent event) { + if (!(event.getSender() instanceof ProxiedPlayer)) return; + + CommonPlayer player = plugin.getServer().getPlayer(((ProxiedPlayer) event.getSender()).getUniqueId()); + + if (event.isCommand()) { + // Split the command + String[] args = event.getMessage().split(" ", 6); + // Get rid of the first / + String cmd = args[0].replace("/", "").toLowerCase(); + + if (commandListener.onCommand(player, cmd, args)) { + event.setCancelled(true); + } + } else if (listener.onPlayerChat(player, new ChatHandler(event), event.getMessage())) { + event.setCancelled(true); + } else if (listener.onIpChat(player, event.getSender().getAddress().getAddress(), new ChatHandler(event), event.getMessage())) { + event.setCancelled(true); + } + } + + @RequiredArgsConstructor + private class ChatHandler implements CommonChatHandler { + private final ChatEvent event; + + @Override + public void handleSoftMute() { + event.setCancelled(true); + ((ProxiedPlayer) event.getSender()).sendMessage(event.getMessage()); + } + } +} diff --git a/bungee/src/main/java/me/confuser/banmanager/bungee/listeners/DiscordListener.java b/bungee/src/main/java/me/confuser/banmanager/bungee/listeners/DiscordListener.java new file mode 100644 index 000000000..4895d0fff --- /dev/null +++ b/bungee/src/main/java/me/confuser/banmanager/bungee/listeners/DiscordListener.java @@ -0,0 +1,100 @@ +package me.confuser.banmanager.bungee.listeners; + +import me.confuser.banmanager.bungee.api.events.*; +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.listeners.CommonDiscordListener; +import net.md_5.bungee.api.plugin.Listener; +import net.md_5.bungee.event.EventHandler; +import net.md_5.bungee.event.EventPriority; + +public class DiscordListener implements Listener { + private CommonDiscordListener listener; + + public DiscordListener(BanManagerPlugin plugin) { + this.listener = new CommonDiscordListener(plugin); + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void notifyOnBan(PlayerBannedEvent event) { + Object[] data = listener.notifyOnBan(event.getBan()); + + if (event.isSilent() && (boolean) data[2]) return; + + send(data); + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void notifyOnMute(PlayerMutedEvent event) { + Object[] data = listener.notifyOnMute(event.getMute()); + + if (event.isSilent() && (boolean) data[2]) return; + + send(data); + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void notifyOnBan(IpBannedEvent event) { + Object[] data = listener.notifyOnBan(event.getBan()); + + if (event.isSilent() && (boolean) data[2]) return; + + send(data); + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void notifyOnKick(PlayerKickedEvent event) { + Object[] data = listener.notifyOnKick(event.getKick()); + + if (event.isSilent() && (boolean) data[2]) return; + + send(data); + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void notifyOnWarn(PlayerWarnedEvent event) { + Object[] data = listener.notifyOnWarn(event.getWarning()); + + if (event.isSilent() && (boolean) data[2]) return; + + send(data); + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void notifyOnUnban(PlayerUnbanEvent event) { + Object[] data = listener.notifyOnUnban(event.getBan(), event.getActor(), event.getReason()); + + send(data); + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void notifyOnUnban(IpUnbanEvent event) { + Object[] data = listener.notifyOnUnban(event.getBan(), event.getActor(), event.getReason()); + + send(data); + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void notifyOnUnmute(PlayerUnmuteEvent event) { + Object[] data = listener.notifyOnUnmute(event.getMute(), event.getActor(), event.getReason()); + + send(data); + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void notifyOnReport(PlayerReportedEvent event) { + Object[] data = listener.notifyOnReport(event.getReport(), event.getReport().getActor(), event.getReport().getReason()); + + if (event.isSilent() && (boolean) data[2]) return; + + send(data); + } + + private void send(Object[] data) { + String url = (String) data[0]; + String payload = (String) data[1]; + + if (url == null || payload == null || url.isEmpty() || payload.isEmpty()) return; + + listener.send(url, payload); + } +} diff --git a/bungee/src/main/java/me/confuser/banmanager/bungee/listeners/HookListener.java b/bungee/src/main/java/me/confuser/banmanager/bungee/listeners/HookListener.java new file mode 100755 index 000000000..fd8a05da3 --- /dev/null +++ b/bungee/src/main/java/me/confuser/banmanager/bungee/listeners/HookListener.java @@ -0,0 +1,101 @@ +package me.confuser.banmanager.bungee.listeners; + +import me.confuser.banmanager.bungee.api.events.*; +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.listeners.CommonHooksListener; +import net.md_5.bungee.api.plugin.Listener; +import net.md_5.bungee.event.EventHandler; +import net.md_5.bungee.event.EventPriority; + +public class HookListener implements Listener { + private final CommonHooksListener listener; + + public HookListener(BanManagerPlugin plugin) { + this.listener = new CommonHooksListener(plugin); + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void onBan(final PlayerBanEvent event) { + listener.onBan(event.getBan(), true); + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void onBan(final PlayerBannedEvent event) { + listener.onBan(event.getBan(), false); + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void onUnban(final PlayerUnbanEvent event) { + listener.onUnban(event.getBan(), event.getActor(), event.getReason()); + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void onMute(final PlayerMuteEvent event) { + listener.onMute(event.getMute(), true); + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void onMute(final PlayerMutedEvent event) { + listener.onMute(event.getMute(), false); + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void onUnmute(final PlayerUnmuteEvent event) { + listener.onUnmute(event.getMute(), event.getActor(), event.getReason()); + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void onBan(final IpBanEvent event) { + listener.onBan(event.getBan(), true); + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void onBan(final IpBannedEvent event) { + listener.onBan(event.getBan(), false); + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void onUnban(final IpUnbanEvent event) { + listener.onUnban(event.getBan(), event.getActor(), event.getReason()); + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void onBan(final IpRangeBanEvent event) { + listener.onBan(event.getBan(), true); + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void onBan(final IpRangeBannedEvent event) { + listener.onBan(event.getBan(), false); + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void onUnban(final IpRangeUnbanEvent event) { + listener.onUnban(event.getBan(), event.getActor(), event.getReason()); + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void onWarn(final PlayerWarnEvent event) { + listener.onWarn(event.getWarning(), true); + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void onWarn(final PlayerWarnedEvent event) { + listener.onWarn(event.getWarning(), false); + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void onNote(final PlayerNoteCreatedEvent event) { + listener.onNote(event.getNote()); + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void onReport(final PlayerReportEvent event) { + listener.onReport(event.getReport(), true); + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void onReport(final PlayerReportedEvent event) { + listener.onReport(event.getReport(), false); + } +} diff --git a/bungee/src/main/java/me/confuser/banmanager/bungee/listeners/JoinListener.java b/bungee/src/main/java/me/confuser/banmanager/bungee/listeners/JoinListener.java new file mode 100755 index 000000000..3b35e4a09 --- /dev/null +++ b/bungee/src/main/java/me/confuser/banmanager/bungee/listeners/JoinListener.java @@ -0,0 +1,86 @@ +package me.confuser.banmanager.bungee.listeners; + +import lombok.RequiredArgsConstructor; +import me.confuser.banmanager.bungee.BMBungeePlugin; +import me.confuser.banmanager.bungee.BungeePlayer; +import me.confuser.banmanager.bungee.BungeeServer; +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.listeners.CommonJoinHandler; +import me.confuser.banmanager.common.listeners.CommonJoinListener; +import me.confuser.banmanager.common.util.IPUtils; +import me.confuser.banmanager.common.util.Message; +import net.md_5.bungee.api.event.LoginEvent; +import net.md_5.bungee.api.event.PostLoginEvent; +import net.md_5.bungee.api.plugin.Listener; +import net.md_5.bungee.event.EventHandler; +import net.md_5.bungee.event.EventPriority; + +public class JoinListener implements Listener { + private final CommonJoinListener listener; + private final BMBungeePlugin plugin; + + public JoinListener(BMBungeePlugin plugin) { + this.plugin = plugin; + this.listener = new CommonJoinListener(plugin.getPlugin()); + } + + @EventHandler(priority = EventPriority.LOW) + public void banCheck(LoginEvent event) { + event.registerIntent(plugin); + + plugin.getPlugin().getScheduler().runAsync(() -> { + listener.banCheck(event.getConnection().getUniqueId(), event.getConnection().getName(), IPUtils.toIPAddress(event.getConnection().getAddress().getAddress()), new BanJoinHandler(plugin.getPlugin(), event)); + + if (!event.isCancelled()) { + listener.onPreJoin(event.getConnection().getUniqueId(), event.getConnection().getName(), IPUtils.toIPAddress(event.getConnection().getAddress().getAddress())); + } + + event.completeIntent(plugin); + }); + } + + @EventHandler + public void onJoin(PostLoginEvent event) { + listener.onJoin(new BungeePlayer(event.getPlayer(), plugin.getPlugin().getConfig().isOnlineMode())); + } + + @EventHandler(priority = EventPriority.LOWEST) + public void onPlayerLogin(PostLoginEvent event) { + listener.onPlayerLogin(new BungeePlayer(event.getPlayer(), plugin.getPlugin().getConfig().isOnlineMode()), new LoginHandler(event)); + } + + @RequiredArgsConstructor + private class BanJoinHandler implements CommonJoinHandler { + private final BanManagerPlugin plugin; + private final LoginEvent event; + + @Override + public void handlePlayerDeny(PlayerData player, Message message) { + plugin.getServer().callEvent("PlayerDeniedEvent", player, message); + + handleDeny(message); + } + + @Override + public void handleDeny(Message message) { + event.setCancelled(true); + event.setCancelReason(BungeeServer.formatMessage(message.toString())); + } + } + + @RequiredArgsConstructor + private class LoginHandler implements CommonJoinHandler { + private final PostLoginEvent event; + + @Override + public void handlePlayerDeny(PlayerData player, Message message) { + handleDeny(message); + } + + @Override + public void handleDeny(Message message) { + event.getPlayer().disconnect(BungeeServer.formatMessage(message.toString())); + } + } +} diff --git a/bungee/src/main/java/me/confuser/banmanager/bungee/listeners/LeaveListener.java b/bungee/src/main/java/me/confuser/banmanager/bungee/listeners/LeaveListener.java new file mode 100755 index 000000000..1fef32a66 --- /dev/null +++ b/bungee/src/main/java/me/confuser/banmanager/bungee/listeners/LeaveListener.java @@ -0,0 +1,21 @@ +package me.confuser.banmanager.bungee.listeners; + + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.listeners.CommonLeaveListener; +import net.md_5.bungee.api.event.PlayerDisconnectEvent; +import net.md_5.bungee.api.plugin.Listener; +import net.md_5.bungee.event.EventHandler; + +public class LeaveListener implements Listener { + private final CommonLeaveListener listener; + + public LeaveListener(BanManagerPlugin plugin) { + this.listener = new CommonLeaveListener(plugin); + } + + @EventHandler + public void onLeave(PlayerDisconnectEvent event) { + listener.onLeave(event.getPlayer().getUniqueId(), event.getPlayer().getName()); + } +} diff --git a/bungee/src/main/java/me/confuser/banmanager/bungee/listeners/MuteListener.java b/bungee/src/main/java/me/confuser/banmanager/bungee/listeners/MuteListener.java new file mode 100755 index 000000000..acf252be3 --- /dev/null +++ b/bungee/src/main/java/me/confuser/banmanager/bungee/listeners/MuteListener.java @@ -0,0 +1,28 @@ +package me.confuser.banmanager.bungee.listeners; + + +import me.confuser.banmanager.bungee.api.events.IpMutedEvent; +import me.confuser.banmanager.bungee.api.events.PlayerMutedEvent; +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.listeners.CommonMuteListener; +import net.md_5.bungee.api.plugin.Listener; +import net.md_5.bungee.event.EventHandler; +import net.md_5.bungee.event.EventPriority; + +public class MuteListener implements Listener { + private final CommonMuteListener listener; + + public MuteListener(BanManagerPlugin plugin) { + this.listener = new CommonMuteListener(plugin); + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void notifyOnMute(PlayerMutedEvent event) { + listener.notifyOnMute(event.getMute(), event.isSilent()); + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void notifyOnMute(IpMutedEvent event) { + listener.notifyOnMute(event.getMute(), event.isSilent()); + } +} diff --git a/bungee/src/main/java/me/confuser/banmanager/bungee/listeners/NoteListener.java b/bungee/src/main/java/me/confuser/banmanager/bungee/listeners/NoteListener.java new file mode 100755 index 000000000..afdd84ebc --- /dev/null +++ b/bungee/src/main/java/me/confuser/banmanager/bungee/listeners/NoteListener.java @@ -0,0 +1,23 @@ +package me.confuser.banmanager.bungee.listeners; + + +import me.confuser.banmanager.bungee.api.events.PlayerNoteCreatedEvent; +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.listeners.CommonNoteListener; +import net.md_5.bungee.api.plugin.Listener; +import net.md_5.bungee.event.EventHandler; +import net.md_5.bungee.event.EventPriority; + +public class NoteListener implements Listener { + private final CommonNoteListener listener; + + public NoteListener(BanManagerPlugin plugin) { + this.listener = new CommonNoteListener(plugin); + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void notifyOnNote(PlayerNoteCreatedEvent event) { + listener.notifyOnNote(event.getNote()); + } + +} diff --git a/bungee/src/main/resources b/bungee/src/main/resources new file mode 120000 index 000000000..6d7fedbbf --- /dev/null +++ b/bungee/src/main/resources @@ -0,0 +1 @@ +../../../common/src/main/resources \ No newline at end of file diff --git a/common/build.gradle.kts b/common/build.gradle.kts new file mode 100644 index 000000000..ca62a04bf --- /dev/null +++ b/common/build.gradle.kts @@ -0,0 +1,63 @@ +plugins { + `java-library` + `maven-publish` + signing +} + +applyPlatformAndCoreConfiguration() + +publishing { + publications { + create("mavenJava") { + from(components["java"]) + + pom { + name.set("BanManagerCommon") + description.set("Common BanManager code needed for all platforms") + url.set("https://github.com/BanManagement/BanManager/") + licenses { + license { + name.set("Creative Commons Attribution-NonCommercial-ShareAlike 2.0 UK: England & Wales") + url.set("https://github.com/BanManagement/BanManager/blob/master/LICENCE") + } + } + developers { + developer { + id.set("confuser") + name.set("James Mortemore") + email.set("jamesmortemore@gmail.com") + } + } + scm { + connection.set("scm:git:git://github.com/BanManagement/BanManager.git") + developerConnection.set("scm:git:ssh://git@github.com/BanManagement/BanManager.git") + url.set("https://github.com/BanManagement/BanManager/") + } + } + } + } +} + +signing { + if (project.findProperty("signingKey")?.toString()?.toBoolean() == true) { + useInMemoryPgpKeys(findProperty("signingKey")?.toString(), findProperty("signingPassword")?.toString()) + + sign(publishing.publications["mavenJava"]) + } +} + +dependencies { + api(project(":BanManagerLibs")) + + testImplementation("junit:junit:4.13") + testImplementation("org.hamcrest:hamcrest-library:1.2.1") + testImplementation("org.powermock:powermock-module-junit4:2.0.2") + testImplementation("org.powermock:powermock-api-mockito2:2.0.2") + testImplementation("com.github.javafaker:javafaker:1.0.2") + testImplementation("org.awaitility:awaitility:4.0.1") + testImplementation("ch.vorburger.mariaDB4j:mariaDB4j:2.4.0") +} + +tasks.withType().configureEach { + useJUnit() +} diff --git a/common/src/main/java/me/confuser/banmanager/common/BanManagerPlugin.java b/common/src/main/java/me/confuser/banmanager/common/BanManagerPlugin.java new file mode 100644 index 000000000..9446ec9ba --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/BanManagerPlugin.java @@ -0,0 +1,462 @@ +package me.confuser.banmanager.common; + +import lombok.Getter; +import lombok.Setter; +import me.confuser.banmanager.common.api.BmAPI; +import me.confuser.banmanager.common.commands.*; +import me.confuser.banmanager.common.commands.global.*; +import me.confuser.banmanager.common.configs.*; +import me.confuser.banmanager.common.hikari.HikariDataSource; +import me.confuser.banmanager.common.ormlite.dao.GenericRawResults; +import me.confuser.banmanager.common.ormlite.db.DatabaseType; +import me.confuser.banmanager.common.ormlite.db.H2DatabaseType; +import me.confuser.banmanager.common.ormlite.jdbc.DataSourceConnectionSource; +import me.confuser.banmanager.common.ormlite.logger.LocalLog; +import me.confuser.banmanager.common.ormlite.support.ConnectionSource; +import me.confuser.banmanager.common.ormlite.support.DatabaseConnection; +import me.confuser.banmanager.common.runnables.Runner; +import me.confuser.banmanager.common.storage.*; +import me.confuser.banmanager.common.storage.global.*; +import me.confuser.banmanager.common.storage.mariadb.MariaDBDatabase; +import me.confuser.banmanager.common.storage.mysql.MySQLDatabase; + +import java.io.File; +import java.io.IOException; +import java.sql.SQLException; + +import static java.lang.Long.parseLong; + +public class BanManagerPlugin { + private static BanManagerPlugin self; + + /* + * This block prevents the Maven Shade plugin to remove the specified classes + */ + static { + @SuppressWarnings("unused") Class[] classes = new Class[]{ + BmAPI.class, + }; + } + + @Getter + private PluginInfo pluginInfo; + @Getter + private final CommonLogger logger; + @Getter + private final CommonMetrics metrics; + + // Configs + @Getter + private File dataFolder; + @Getter + private DefaultConfig config; + @Getter + private ConsoleConfig consoleConfig; + @Getter + private SchedulesConfig schedulesConfig; + @Getter + private ExemptionsConfig exemptionsConfig; + @Getter + private ReasonsConfig reasonsConfig; + @Getter + private GeoIpConfig geoIpConfig; + @Getter + private DiscordConfig discordConfig; + + // Connections + @Getter + private ConnectionSource localConn; + @Getter + private ConnectionSource globalConn; + + // Storage + @Getter + private PlayerBanStorage playerBanStorage; + @Getter + private PlayerBanRecordStorage playerBanRecordStorage; + @Getter + private PlayerKickStorage playerKickStorage; + @Getter + private PlayerMuteStorage playerMuteStorage; + @Getter + private PlayerMuteRecordStorage playerMuteRecordStorage; + @Getter + private PlayerStorage playerStorage; + @Getter + private PlayerWarnStorage playerWarnStorage; + @Getter + private PlayerNoteStorage playerNoteStorage; + @Getter + private ActivityStorage activityStorage; + @Getter + private HistoryStorage historyStorage; + @Getter + private PlayerHistoryStorage playerHistoryStorage; + @Getter + private PlayerReportStorage playerReportStorage; + @Getter + private PlayerReportLocationStorage playerReportLocationStorage; + @Getter + private ReportStateStorage reportStateStorage; + @Getter + private PlayerReportCommandStorage playerReportCommandStorage; + @Getter + private PlayerReportCommentStorage playerReportCommentStorage; + @Getter + private RollbackStorage rollbackStorage; + + @Getter + private NameBanStorage nameBanStorage; + @Getter + private NameBanRecordStorage nameBanRecordStorage; + + @Getter + private IpBanStorage ipBanStorage; + @Getter + private IpBanRecordStorage ipBanRecordStorage; + @Getter + private IpMuteStorage ipMuteStorage; + @Getter + private IpMuteRecordStorage ipMuteRecordStorage; + @Getter + private IpRangeBanStorage ipRangeBanStorage; + @Getter + private IpRangeBanRecordStorage ipRangeBanRecordStorage; + + @Getter + private GlobalPlayerBanStorage globalPlayerBanStorage; + @Getter + private GlobalPlayerBanRecordStorage globalPlayerBanRecordStorage; + @Getter + private GlobalPlayerMuteStorage globalPlayerMuteStorage; + @Getter + private GlobalPlayerMuteRecordStorage globalPlayerMuteRecordStorage; + @Getter + private GlobalPlayerNoteStorage globalPlayerNoteStorage; + + @Getter + private GlobalIpBanStorage globalIpBanStorage; + @Getter + private GlobalIpBanRecordStorage globalIpBanRecordStorage; + + @Getter + private CommonServer server; + @Getter + private CommonScheduler scheduler; + @Setter + @Getter + private Runner syncRunner; + + public BanManagerPlugin(PluginInfo pluginInfo, CommonLogger logger, File dataFolder, CommonScheduler scheduler, CommonServer server, CommonMetrics metrics) { + this.pluginInfo = pluginInfo; + this.logger = logger; + this.dataFolder = dataFolder; + this.server = server; + this.scheduler = scheduler; + this.metrics = metrics; + self = this; + } + + public final void enable() throws Exception { + setupConfigs(); + + try { + if (!config.isDebugEnabled()) { + disableDatabaseLogging(); + } + + if (!setupConnections()) { + throw new Exception("Unable to connect to database, ensure local is enabled in config and your connection details are correct"); + } + + setupStorage(); + } catch (SQLException e) { + e.printStackTrace(); + throw new Exception("An error occurred attempting to make a database connection, please see stack trace below"); + } + + String query = "SELECT UNIX_TIMESTAMP() - ? as mysqlTime"; + + GenericRawResults results = playerStorage + .queryRaw(query, String.valueOf(System.currentTimeMillis() / 1000L)); + + String result = results.getFirstResult()[0]; + + results.close(); + + long timeDiff; + + // Some drivers appear to return a decimal such as MariaDB e.g. 0.0 + if (result.contains(".")) { + timeDiff = Double.valueOf(result).longValue(); + } else { + timeDiff = parseLong(result); + } + + results.close(); + + if (timeDiff > 1) { + logger + .severe("The time on your server and MySQL database are out by " + timeDiff + " seconds, this may cause syncing issues."); + } + + String storageVersion = null; + if (!config.getLocalDb().getStorageType().equals("h2")) { + // Get database version + GenericRawResults results2 = playerStorage + .queryRaw("SELECT VERSION()"); + + storageVersion = results2.getFirstResult()[0]; + + results2.close(); + } + + if (metrics != null) { + try { + metrics.submitStorageType(config.getLocalDb().getStorageType()); + metrics.submitDiscordMode(discordConfig.isHooksEnabled()); + metrics.submitGeoMode(geoIpConfig.isEnabled()); + metrics.submitGlobalMode(config.getGlobalDb().isEnabled()); + metrics.submitOnlineMode(config.isOnlineMode()); + if (storageVersion != null) { + metrics.submitStorageVersion(storageVersion); + } + } catch (Exception e) { + logger.warning("Failed to submit stats, ignoring"); + } + } + } + + public final void disable() { + if (getSchedulesConfig() != null) { + getSchedulesConfig().save(); + } + + if (localConn != null) { + // Save all player histories + if (config.isLogIpsEnabled() && playerHistoryStorage != null) { + playerHistoryStorage.save(); + } + + localConn.closeQuietly(); + } + + if (globalConn != null) { + globalConn.closeQuietly(); + } + } + + public void setupConfigs() { + new MessagesConfig(dataFolder, logger).load(); + + config = new DefaultConfig(dataFolder, logger); + config.load(); + + consoleConfig = new ConsoleConfig(dataFolder, logger); + consoleConfig.load(); + + schedulesConfig = new SchedulesConfig(dataFolder, logger); + schedulesConfig.load(); + + exemptionsConfig = new ExemptionsConfig(dataFolder, logger); + exemptionsConfig.load(); + + reasonsConfig = new ReasonsConfig(dataFolder, logger); + reasonsConfig.load(); + + geoIpConfig = new GeoIpConfig(dataFolder, logger); + geoIpConfig.load(); + + discordConfig = new DiscordConfig(dataFolder, logger); + discordConfig.load(); + } + + private void disableDatabaseLogging() { + System.setProperty(LocalLog.LOCAL_LOG_LEVEL_PROPERTY, "WARNING"); + } + + public boolean setupConnections() throws SQLException { + localConn = createConnection(config.getLocalDb(), "bm-local"); + + if (config.getGlobalDb().isEnabled()) { + globalConn = createConnection(config.getGlobalDb(), "bm-global"); + } + + return true; + } + + public ConnectionSource createConnection(DatabaseConfig dbConfig, String type) throws SQLException { + HikariDataSource ds = new HikariDataSource(); + + if (!dbConfig.getStorageType().equals("h2")) { + if (!dbConfig.getUser().isEmpty()) { + ds.setUsername(dbConfig.getUser()); + } + if (!dbConfig.getPassword().isEmpty()) { + ds.setPassword(dbConfig.getPassword()); + } + } + + ds.setJdbcUrl(dbConfig.getJDBCUrl()); + ds.setMaximumPoolSize(dbConfig.getMaxConnections()); + ds.setMinimumIdle(2); + ds.setPoolName(type); + ds.setConnectionTimeout(dbConfig.getConnectionTimeout()); + ds.setMaxLifetime(dbConfig.getMaxLifetime()); + + if (dbConfig.getLeakDetection() != 0) ds.setLeakDetectionThreshold(dbConfig.getLeakDetection()); + + DatabaseType databaseType; + + if (dbConfig.getStorageType().equals("mariadb")) { + databaseType = new MariaDBDatabase(); + } else if (dbConfig.getStorageType().equals("mysql")) { + // Forcefully specify the newer driver + ds.setDriverClassName(me.confuser.banmanager.common.mysql.cj.jdbc.Driver.class.getName()); + + databaseType = new MySQLDatabase(); + + ds.addDataSourceProperty("cachePrepStmts", "true"); + ds.addDataSourceProperty("prepStmtCacheSize", "250"); + ds.addDataSourceProperty("prepStmtCacheSqlLimit", "2048"); + ds.addDataSourceProperty("useServerPrepStmts", "true"); + ds.addDataSourceProperty("useLocalSessionState", "true"); + ds.addDataSourceProperty("cacheResultSetMetadata", "true"); + ds.addDataSourceProperty("cacheServerConfiguration", "true"); + ds.addDataSourceProperty("elideSetAutoCommits", "true"); + ds.addDataSourceProperty("maintainTimeStats", "false"); + ds.addDataSourceProperty("alwaysSendSetIsolation", "false"); + ds.addDataSourceProperty("cacheCallableStmts", "true"); + } else { + try { + // Force usage of BM H2 in server implementations with differing versions + ds.setDriverClassName("me.confuser.banmanager.common.h2.Driver"); + } catch (RuntimeException e) { + // Required for integration tests + ds.setDriverClassName("org.h2.Driver"); + } + + databaseType = new H2DatabaseType(); + } + + return new DataSourceConnectionSource(ds, databaseType); + } + + public void setupStorage() throws SQLException { + // Setup h2 specific functions + if (config.getLocalDb().getStorageType().equals("h2")) { + try (DatabaseConnection conn = getLocalConn().getReadWriteConnection("")) { + conn.executeStatement("CREATE ALIAS IF NOT EXISTS INET6_NTOA FOR \"me.confuser.banmanager.common.util.IPUtils.toString\"", DatabaseConnection.DEFAULT_RESULT_FLAGS); + } catch (IOException | SQLException e) { + e.printStackTrace(); + } + } + + playerStorage = new PlayerStorage(this); + playerBanStorage = new PlayerBanStorage(this); + playerBanRecordStorage = new PlayerBanRecordStorage(this); + playerMuteStorage = new PlayerMuteStorage(this); + playerMuteRecordStorage = new PlayerMuteRecordStorage(this); + playerWarnStorage = new PlayerWarnStorage(this); + playerKickStorage = new PlayerKickStorage(this); + playerNoteStorage = new PlayerNoteStorage(this); + playerHistoryStorage = new PlayerHistoryStorage(this); + reportStateStorage = new ReportStateStorage(this); + playerReportCommandStorage = new PlayerReportCommandStorage(this); + playerReportCommentStorage = new PlayerReportCommentStorage(this); + playerReportStorage = new PlayerReportStorage(this); + playerReportLocationStorage = new PlayerReportLocationStorage(this); + + ipBanStorage = new IpBanStorage(this); + ipBanRecordStorage = new IpBanRecordStorage(this); + ipMuteStorage = new IpMuteStorage(this); + ipMuteRecordStorage = new IpMuteRecordStorage(this); + ipRangeBanStorage = new IpRangeBanStorage(this); + ipRangeBanRecordStorage = new IpRangeBanRecordStorage(this); + + activityStorage = new ActivityStorage(this); + historyStorage = new HistoryStorage(this); + rollbackStorage = new RollbackStorage(this); + + nameBanStorage = new NameBanStorage(this); + nameBanRecordStorage = new NameBanRecordStorage(this); + + if (globalConn == null) { + return; + } + + globalPlayerBanStorage = new GlobalPlayerBanStorage(this); + globalPlayerBanRecordStorage = new GlobalPlayerBanRecordStorage(this); + globalPlayerMuteStorage = new GlobalPlayerMuteStorage(this); + globalPlayerMuteRecordStorage = new GlobalPlayerMuteRecordStorage(this); + globalPlayerNoteStorage = new GlobalPlayerNoteStorage(this); + globalIpBanStorage = new GlobalIpBanStorage(this); + globalIpBanRecordStorage = new GlobalIpBanRecordStorage(this); + } + + public CommonCommand[] getCommands() { + return new CommonCommand[]{ + new ActivityCommand(this), + new AddNoteCommand(this), + new BanCommand(this), + new BanIpCommand(this), + new BanIpRangeCommand(this), + new BanListCommand(this), + new BanNameCommand(this), + new ClearCommand(this), + new DeleteCommand(this), + new DeleteLastWarningCommand(this), + new ExportCommand(this), + new FindAltsCommand(this), + new InfoCommand(this), + new ImportCommand(this), + new KickCommand(this), + new KickAllCommand(this), + new LoglessKickCommand(this), + new LoglessKickAllCommand(this), + new MuteCommand(this), + new MuteIpCommand(this), + new NotesCommand(this), + new ReasonsCommand(this), + new ReloadCommand(this), + new ReportCommand(this), + new ReportsCommand(this), + new RollbackCommand(this), + new SyncCommand(this), + new TempBanCommand(this), + new TempIpBanCommand(this), + new TempIpMuteCommand(this), + new TempIpRangeBanCommand(this), + new TempMuteCommand(this), + new TempNameBanCommand(this), + new TempWarnCommand(this), + new UnbanCommand(this), + new UnbanIpCommand(this), + new UnbanIpRangeCommand(this), + new UnbanNameCommand(this), + new UnmuteCommand(this), + new UnmuteIpCommand(this), + new UtilsCommand(this), + new WarnCommand(this) + }; + } + + public CommonCommand[] getGlobalCommands() { + return new CommonCommand[]{ + new AddNoteAllCommand(this), + new BanAllCommand(this), + new BanIpAllCommand(this), + new MuteAllCommand(this), + new TempBanAllCommand(this), + new TempBanIpAllCommand(this), + new TempMuteAllCommand(this), + new UnbanAllCommand(this), + new UnbanIpAllCommand(this), + new UnmuteAllCommand(this) + }; + } + + public static BanManagerPlugin getInstance() { + return self; + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/CommonExternalCommand.java b/common/src/main/java/me/confuser/banmanager/common/CommonExternalCommand.java new file mode 100755 index 000000000..f705bd85d --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/CommonExternalCommand.java @@ -0,0 +1,20 @@ +package me.confuser.banmanager.common; + +import lombok.Getter; + +import java.util.List; + +public class CommonExternalCommand { + @Getter + private final String pluginName; + @Getter + private final String name; + @Getter + private final List aliases; + + public CommonExternalCommand(String pluginName, String name, List aliases) { + this.pluginName = pluginName; + this.name = name; + this.aliases = aliases; + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/CommonLogger.java b/common/src/main/java/me/confuser/banmanager/common/CommonLogger.java new file mode 100644 index 000000000..156edf8af --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/CommonLogger.java @@ -0,0 +1,9 @@ +package me.confuser.banmanager.common; + +public interface CommonLogger { + void info(String s); + + void warning(String s); + + void severe(String s); +} diff --git a/common/src/main/java/me/confuser/banmanager/common/CommonMetrics.java b/common/src/main/java/me/confuser/banmanager/common/CommonMetrics.java new file mode 100755 index 000000000..dcab82cc8 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/CommonMetrics.java @@ -0,0 +1,10 @@ +package me.confuser.banmanager.common; + +public interface CommonMetrics { + void submitOnlineMode(boolean online); + void submitStorageType(String storageType); + void submitStorageVersion(String version); + void submitGlobalMode(boolean enabled); + void submitGeoMode(boolean enabled); + void submitDiscordMode(boolean enabled); +} diff --git a/common/src/main/java/me/confuser/banmanager/common/CommonPlayer.java b/common/src/main/java/me/confuser/banmanager/common/CommonPlayer.java new file mode 100644 index 000000000..338ffe1c3 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/CommonPlayer.java @@ -0,0 +1,46 @@ +package me.confuser.banmanager.common; + +import me.confuser.banmanager.common.commands.CommonSender; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.kyori.text.TextComponent; +import me.confuser.banmanager.common.util.Message; + +import java.net.InetAddress; +import java.util.UUID; + +public interface CommonPlayer extends CommonSender { + + void kick(String message); + + void sendMessage(String message); + + void sendMessage(Message message); + + void sendJSONMessage(TextComponent jsonString); + + void sendJSONMessage(String jsonString); + + @Override + boolean isConsole(); + + @Override + PlayerData getData(); + + boolean isOnlineMode(); + + boolean isOnline(); + + boolean hasPermission(String permission); + + String getDisplayName(); + + String getName(); + + InetAddress getAddress(); + + UUID getUniqueId(); + + boolean teleport(CommonWorld world, double x, double y, double z, float pitch, float yaw); + + boolean canSee(CommonPlayer player); +} diff --git a/common/src/main/java/me/confuser/banmanager/common/CommonScheduler.java b/common/src/main/java/me/confuser/banmanager/common/CommonScheduler.java new file mode 100644 index 000000000..29fd04bf2 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/CommonScheduler.java @@ -0,0 +1,8 @@ +package me.confuser.banmanager.common; + +public interface CommonScheduler { + void runAsync(Runnable task); + void runAsyncLater(Runnable task, long delay); + void runSync(Runnable task); + void runSyncLater(Runnable task, long delay); +} diff --git a/common/src/main/java/me/confuser/banmanager/common/CommonServer.java b/common/src/main/java/me/confuser/banmanager/common/CommonServer.java new file mode 100644 index 000000000..21f1e037e --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/CommonServer.java @@ -0,0 +1,31 @@ +package me.confuser.banmanager.common; + +import me.confuser.banmanager.common.api.events.CommonEvent; +import me.confuser.banmanager.common.commands.CommonSender; +import me.confuser.banmanager.common.kyori.text.TextComponent; + +import java.util.UUID; + +public interface CommonServer { + CommonPlayer getPlayer(UUID uniqueId); + + CommonPlayer getPlayer(String name); + + CommonPlayer[] getOnlinePlayers(); + + void broadcast(String message, String permission); + + void broadcastJSON(TextComponent message, String permission); + + void broadcast(String message, String permission, CommonSender sender); + + CommonSender getConsoleSender(); + + boolean dispatchCommand(CommonSender consoleSender, String command); + + CommonWorld getWorld(String name); + + CommonEvent callEvent(String name, Object... args); + + CommonExternalCommand getPluginCommand(String commandName); +} diff --git a/common/src/main/java/me/confuser/banmanager/common/CommonWorld.java b/common/src/main/java/me/confuser/banmanager/common/CommonWorld.java new file mode 100644 index 000000000..143283b64 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/CommonWorld.java @@ -0,0 +1,12 @@ +package me.confuser.banmanager.common; + +import lombok.Getter; + +public class CommonWorld { + @Getter + private final String name; + + public CommonWorld(String name) { + this.name = name; + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/api/BmAPI.java b/common/src/main/java/me/confuser/banmanager/common/api/BmAPI.java new file mode 100644 index 000000000..e84cd6797 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/api/BmAPI.java @@ -0,0 +1,506 @@ +package me.confuser.banmanager.common.api; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.data.*; +import me.confuser.banmanager.common.ipaddr.IPAddress; +import me.confuser.banmanager.common.ormlite.dao.CloseableIterator; +import me.confuser.banmanager.common.ormlite.support.ConnectionSource; +import me.confuser.banmanager.common.util.DateUtils; +import me.confuser.banmanager.common.util.IPUtils; +import me.confuser.banmanager.common.util.Message; +import me.confuser.banmanager.common.util.UUIDUtils; + +import java.sql.SQLException; +import java.util.List; +import java.util.UUID; + +/** + * This is a static API for BanManager + * No methods are thread safe unless stated otherwise + * Note: The API does not handle permission checks for exemptions + * + * @author James Mortemore + */ +public class BmAPI { + + /** + * @param uuid Player UUID + * @return PlayerData + * @throws SQLException + */ + public static PlayerData getPlayer(UUID uuid) throws SQLException { + return BanManagerPlugin.getInstance().getPlayerStorage().queryForId(UUIDUtils.toBytes(uuid)); + } + + /** + * @param name Player name + * @return PlayerData + * @throws SQLException + */ + public static PlayerData getPlayer(String name) throws SQLException { + return BanManagerPlugin.getInstance().getPlayerStorage().retrieve(name, false); + } + + /** + * @param ip Player IP + * @return a list of PlayerData + * @throws SQLException + */ + public static List getPlayers(IPAddress ip) throws SQLException { + return BanManagerPlugin.getInstance().getPlayerStorage().getDuplicatesInTime(ip, BanManagerPlugin.getInstance().getConfig().getTimeAssociatedAlts()); + } + + /** + * Get the console for use as an actor + * + * @return PlayerData + */ + public static PlayerData getConsole() { + return BanManagerPlugin.getInstance().getPlayerStorage().getConsole(); + } + + /** + * Convert an ip string of x.x.x.x to IPAddress + * + * @param ip IPv4 in x.x.x.x format + * @return IPv4 in number format + */ + public static IPAddress toIp(String ip) { + return IPUtils.toIPAddress(ip); + } + + /** + * Permanently ban a player. + * You must handle kicking the player if they are online. + * + * @param ban PlayerBanData + * @return Returns true if ban successful + * @throws SQLException + */ + public static boolean ban(PlayerBanData ban) throws SQLException { + return BanManagerPlugin.getInstance().getPlayerBanStorage().ban(ban); + } + + /** + * Permanently ban a player. + * You must handle kicking the player if they are online. + * + * @param player Player to ban + * @param actor Who the ban is by + * @param reason Why they are banned + * @param silent Whether the ban should be broadcast + * @return Returns true if ban successful + * @throws SQLException + */ + public static boolean ban(PlayerData player, PlayerData actor, String reason, boolean silent) throws SQLException { + return ban(new PlayerBanData(player, actor, reason, silent)); + } + + /** + * Temporarily ban a player + * You must handle kicking the player if they are online. + * + * @param player Player to ban + * @param actor Who the ban is by + * @param reason Why they are banned + * @param expires Unix Timestamp in seconds stating the time of when the ban ends + * @return Returns true if ban successful + * @throws SQLException + */ + public static boolean ban(PlayerData player, PlayerData actor, String reason, boolean silent, long expires) throws SQLException { + return ban(new PlayerBanData(player, actor, reason, silent, expires)); + } + + /** + * @param ban The ban (can be retrieved via getBan) + * @param actor Who is unbanning the player + * @return Returns true if the unban is successful + * @throws SQLException + */ + public static boolean unban(PlayerBanData ban, PlayerData actor) throws SQLException { + return BanManagerPlugin.getInstance().getPlayerBanStorage().unban(ban, actor); + } + + /** + * Thread safe + * + * @param uuid Player UUID + * @return Returns true if player is banned + */ + public static boolean isBanned(UUID uuid) { + return BanManagerPlugin.getInstance().getPlayerBanStorage().isBanned(uuid); + } + + /** + * Thread safe + * + * @param name Player name + * @return Returns true if player is banned + */ + public static boolean isBanned(String name) { + return BanManagerPlugin.getInstance().getPlayerBanStorage().isBanned(name); + } + + + /** + * Thread safe + * + * @param name Player name + * @return Returns the active ban of a player; if the player is not banned this returns null + */ + public static PlayerBanData getCurrentBan(String name) { + return BanManagerPlugin.getInstance().getPlayerBanStorage().getBan(name); + } + + /** + * Thread safe + * + * @param uuid Player UUID + * @return Returns the active ban of a player; if the player is not banned this returns null + */ + public static PlayerBanData getCurrentBan(UUID uuid) { + return BanManagerPlugin.getInstance().getPlayerBanStorage().getBan(uuid); + } + + /** + * @param player BanManager's player record + * @return An iterator of ban records + * @throws SQLException + */ + public static CloseableIterator getBanRecords(PlayerData player) throws SQLException { + return BanManagerPlugin.getInstance().getPlayerBanRecordStorage().getRecords(player); + } + + /** + * Permanently mute a player. + * You must handle kicking the player if they are online. + * + * @param mute PlayerMuteData + * @return Returns true if the mute is successful + * @throws SQLException + */ + public static boolean mute(PlayerMuteData mute) throws SQLException { + return BanManagerPlugin.getInstance().getPlayerMuteStorage().mute(mute); + } + + /** + * Permanently mute a player. + * You must handle kicking the player if they are online. + * + * @param player Player to mute + * @param actor Who the mute is by + * @param reason Why they are muted + * @return Returns true if the mute is successful + * @throws SQLException + */ + public static boolean mute(PlayerData player, PlayerData actor, String reason) throws SQLException { + return mute(new PlayerMuteData(player, actor, reason, false, false)); + } + + /** + * Permanently mute a player. + * You must handle kicking the player if they are online. + * + * @param player Player to mute + * @param actor Who the mute is by + * @param reason Why they are mutened + * @param silent Whether the mute should be broadcast + * @return Returns true if mute is successful + * @throws SQLException + */ + public static boolean mute(PlayerData player, PlayerData actor, String reason, boolean silent) throws SQLException { + return mute(new PlayerMuteData(player, actor, reason, silent, false)); + } + + /** + * Permanently mute a player. + * You must handle kicking the player if they are online. + * + * @param player Player to mute + * @param actor Who the mute is by + * @param reason Why they are mutened + * @param silent Whether the mute should be broadcast + * @param isSoft Whether the player should be aware they are muted; they will still see their own messages but nobody else will + * @return Returns true if the mute is successful + * @throws SQLException + */ + public static boolean mute(PlayerData player, PlayerData actor, String reason, boolean silent, boolean isSoft) throws SQLException { + return mute(new PlayerMuteData(player, actor, reason, silent, isSoft)); + } + + + /** + * Temporarily mute a player + * You must handle kicking the player if they are online. + * + * @param player Player to mute + * @param actor Who the mute is by + * @param reason Why they are mutened + * @param silent Whether the mute should be broadcast + * @param isSoft Whether the player should be aware they are muted; they will still see their own messages but nobody else will + * @param expires Unix Timestamp in seconds stating the time of when the mute ends + * @return Returns true if mute successful + * @throws SQLException + */ + public static boolean mute(PlayerData player, PlayerData actor, String reason, boolean silent, boolean isSoft, long expires) throws SQLException { + return mute(new PlayerMuteData(player, actor, reason, silent, isSoft, expires)); + } + + /** + * Mute an IP. + * + * @param mute IpMuteData + * @return Returns true if the mute is successful + * @throws SQLException + */ + public static boolean mute(IpMuteData mute) throws SQLException { + return BanManagerPlugin.getInstance().getIpMuteStorage().mute(mute); + } + + /** + * @param mute PlayerMuteData + * @param actor Who unmuted the player + * @return Returns true if unmute successful + * @throws SQLException + */ + public static boolean unmute(PlayerMuteData mute, PlayerData actor) throws SQLException { + return BanManagerPlugin.getInstance().getPlayerMuteStorage().unmute(mute, actor); + } + + /** + * @param mute IP Mute record + * @param actor Who unmuted the ip + * @return Returns true if unmute is successful + * @throws SQLException + */ + public static boolean unmute(IpMuteData mute, PlayerData actor) throws SQLException { + return BanManagerPlugin.getInstance().getIpMuteStorage().unmute(mute, actor); + } + + /** + * Thread safe + * + * @param uuid Player UUID + * @return Returns true if player muted + */ + public static boolean isMuted(UUID uuid) { + return BanManagerPlugin.getInstance().getPlayerMuteStorage().isMuted(uuid); + } + + /** + * Thread safe + * + * @param name Player Name + * @return Returns true if player muted + */ + public static boolean isMuted(String name) { + return BanManagerPlugin.getInstance().getPlayerMuteStorage().isMuted(name); + } + + /** + * Thread safe + * + * @param ip IP address + * @return Returns true if IP address muted + */ + public static boolean isMuted(IPAddress ip) { + return BanManagerPlugin.getInstance().getIpMuteStorage().isMuted(ip); + } + + /** + * Thread safe + * + * @param name + * @return Returns the active mute of a player; if the player is not muted this returns null + */ + public static PlayerMuteData getCurrentMute(String name) { + return BanManagerPlugin.getInstance().getPlayerMuteStorage().getMute(name); + } + + /** + * Thread safe + * + * @param uuid + * @return Returns the active mute of a player; if the player is not muted this returns null + */ + public static PlayerMuteData getCurrentMute(UUID uuid) { + return BanManagerPlugin.getInstance().getPlayerMuteStorage().getMute(uuid); + } + + /** + * @param player Player record + * @return Iterator of previous mutes + * @throws SQLException + */ + public static CloseableIterator getMuteRecords(PlayerData player) throws SQLException { + return BanManagerPlugin.getInstance().getPlayerMuteRecordStorage().getRecords(player); + } + + /** + * Permanently ban an ip. + * You must handle kicking the player if they are online. + * + * @param ban IpBanData + * @return Returns true if ban is successful + * @throws SQLException + */ + public static boolean ban(IpBanData ban) throws SQLException { + return BanManagerPlugin.getInstance().getIpBanStorage().ban(ban); + } + + /** + * Permanently ban an ip. + * You must handle kicking the player if they are online. + * + * @param ip IP to ban, use toIp to convert x.x.x.x to IPAddress + * @param actor Who the ban is by + * @param reason Why they are banned + * @param silent Whether the ban should be broadcast + * @return Returns true if ban is successful + * @throws SQLException + */ + public static boolean ban(IPAddress ip, PlayerData actor, String reason, boolean silent) throws SQLException { + return ban(new IpBanData(ip, actor, reason, silent)); + } + + /** + * Temporarily ban an ip + * You must handle kicking the player if they are online. + * + * @param ip IP to ban, use toIp to convert x.x.x.x to IPAddress + * @param actor Who the ban is by + * @param reason Why they are banned + * @param silent Whether the ban should be broadcast + * @param expires Unix Timestamp in seconds stating the time of when the ban ends + * @return Returns true if ban is successful + * @throws SQLException + */ + public static boolean ban(IPAddress ip, PlayerData actor, String reason, boolean silent, long expires) throws SQLException { + return ban(new IpBanData(ip, actor, reason, silent, expires)); + } + + /** + * @param ban IP Ban record + * @param actor Who unbanned the ip + * @return Returns true if unban is successful + * @throws SQLException + */ + public static boolean unban(IpBanData ban, PlayerData actor) throws SQLException { + return BanManagerPlugin.getInstance().getIpBanStorage().unban(ban, actor); + } + + /** + * Thread safe + * + * @param ip IP to ban, use toIp to convert x.x.x.x to IPAddress + * @return Returns true if ip is banned + */ + public static boolean isBanned(IPAddress ip) { + return BanManagerPlugin.getInstance().getIpBanStorage().isBanned(ip); + } + + /** + * Thread safe + * + * @param ip IP to ban, use toIp to convert x.x.x.x to IPAddress + * @return Returns the active ban of an ip if the ip is not banned this returns null + */ + public static IpBanData getCurrentBan(IPAddress ip) { + return BanManagerPlugin.getInstance().getIpBanStorage().getBan(ip); + } + + /** + * @param ip IP to ban, use toIp to convert x.x.x.x to IPAddress + * @return Returns previous bans of an ip + * @throws SQLException + */ + public static CloseableIterator getBanRecords(IPAddress ip) throws SQLException { + return BanManagerPlugin.getInstance().getIpBanRecordStorage().getRecords(ip); + } + + /** + * Warn a player. + * You must handle the notification to the warned player yourself. + * + * @param player Player record + * @param actor Player record of who warned the player + * @param reason What the player was warned for + * @param read Whether the player has already viewed the warning + * @return Returns true if warning is successful + * @throws SQLException + */ + public static boolean warn(PlayerData player, PlayerData actor, String reason, boolean read) throws SQLException { + return warn(new PlayerWarnData(player, actor, reason, 1, read)); + } + + /** + * Warn a player. + * You must handle the notification to the warned player yourself. + * + * @param player Player record + * @param actor Player record of who warned the player + * @param reason What the player was warned for + * @param read Whether the player has already viewed the warning + * @param silent Whether the warning should be broadcast + * @return Returns true if warning is successful + * @throws SQLException + */ + public static boolean warn(PlayerData player, PlayerData actor, String reason, boolean read, boolean silent) throws + SQLException { + return warn(new PlayerWarnData(player, actor, reason, 1, read), silent); + } + + /** + * Warn a player. + * You must handle the notification to the warned player yourself. + * + * @param data PlayerWarnData + * @return Returns true if warning is successful + * @throws SQLException + */ + public static boolean warn(PlayerWarnData data) throws SQLException { + return warn(data, false); + } + + /** + * Warn a player. + * You must handle the notification to the warned player yourself. + * + * @param data PlayerWarnData + * @param silent Whether the warning should be broadcast + * @return Returns true if warning is successful + * @throws SQLException + */ + public static boolean warn(PlayerWarnData data, boolean silent) throws SQLException { + return BanManagerPlugin.getInstance().getPlayerWarnStorage().addWarning(data, silent); + } + + /** + * Retrieve past warnings of a player. + * This method is not thread safe and should not be called on the main thread. + * + * @param player Player record + * @return Iterator containing previous player warningss + * @throws SQLException + */ + public static CloseableIterator getWarnings(PlayerData player) throws SQLException { + return BanManagerPlugin.getInstance().getPlayerWarnStorage().getWarnings(player); + } + + /** + * @param key The message config node within messages.yml, e.g. "ban.notify" + * @return String + */ + public static Message getMessage(String key) { + return Message.get(key); + } + + public static ConnectionSource getLocalConnection() { + return BanManagerPlugin.getInstance().getLocalConn(); + } + + public static long toTimestamp(String time, boolean future) throws Exception { + return DateUtils.parseDateDiff(time, future); + } +} + diff --git a/common/src/main/java/me/confuser/banmanager/common/api/events/CommonEvent.java b/common/src/main/java/me/confuser/banmanager/common/api/events/CommonEvent.java new file mode 100644 index 000000000..5acf9b260 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/api/events/CommonEvent.java @@ -0,0 +1,17 @@ +package me.confuser.banmanager.common.api.events; + + +import lombok.Getter; + +public class CommonEvent { + + @Getter + private boolean cancelled; + @Getter + private boolean silent; + + public CommonEvent(boolean cancelled, boolean silent) { + this.cancelled = cancelled; + this.silent = silent; + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/commands/ActivityCommand.java b/common/src/main/java/me/confuser/banmanager/common/commands/ActivityCommand.java new file mode 100644 index 000000000..2f3b9ced9 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/commands/ActivityCommand.java @@ -0,0 +1,88 @@ +package me.confuser.banmanager.common.commands; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.util.DateUtils; +import me.confuser.banmanager.common.util.Message; +import me.confuser.banmanager.common.util.UUIDUtils; + +import java.sql.SQLException; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +public class ActivityCommand extends CommonCommand { + + public ActivityCommand(BanManagerPlugin plugin) { + super(plugin, "bmactivity", true); + } + + @Override + public boolean onCommand(final CommonSender sender, CommandParser parser) { + if (parser.args.length == 0 || parser.args.length > 2) { + return false; + } + + long sinceCheck; + + try { + sinceCheck = DateUtils.parseDateDiff(parser.args[0], false); + } catch (Exception e1) { + sender.sendMessage(Message.get("time.error.invalid")); + return true; + } + + final long since = sinceCheck; + + getPlugin().getScheduler().runAsync(() -> { + List> results; + String messageType = "bmactivity.row.all"; + + if (parser.args.length == 2) { + messageType = "bmactivity.row.player"; + + PlayerData player = null; + final boolean isUUID = parser.args[1].length() > 16; + + if (isUUID) { + try { + player = getPlugin().getPlayerStorage().queryForId(UUIDUtils.toBytes(UUID.fromString(parser.args[1]))); + } catch (SQLException e) { + e.printStackTrace(); + } + } else { + player = getPlugin().getPlayerStorage().retrieve(parser.args[1], false); + } + + if (player == null) { + sender.sendMessage(Message.get("sender.error.notFound").set("player", parser.args[1]).toString()); + return; + } + + results = getPlugin().getActivityStorage().getSince(since, player); + } else { + results = getPlugin().getActivityStorage().getSince(since); + } + + if (results == null || results.size() == 0) { + Message.get("bmactivity.noResults").sendTo(sender); + return; + } + + String dateTimeFormat = Message.getString("bmactivity.row.dateTimeFormat"); + + for (Map result : results) { + Message message = Message.get(messageType) + .set("player", (String) result.get("player")) + .set("type", (String) result.get("type")) + .set("created", DateUtils.format(dateTimeFormat, (long) result.get("created"))); + + if (result.get("actor") != null) message.set("actor", (String) result.get("actor")); + + message.sendTo(sender); + } + }); + + return true; + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/commands/AddNoteCommand.java b/common/src/main/java/me/confuser/banmanager/common/commands/AddNoteCommand.java new file mode 100644 index 000000000..7e6b94c15 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/commands/AddNoteCommand.java @@ -0,0 +1,59 @@ +package me.confuser.banmanager.common.commands; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.data.PlayerNoteData; +import me.confuser.banmanager.common.util.Message; +import me.confuser.banmanager.common.util.StringUtils; + +import java.sql.SQLException; + +public class AddNoteCommand extends CommonCommand { + + public AddNoteCommand(BanManagerPlugin plugin) { + super(plugin, "addnote", true); + } + + @Override + public boolean onCommand(final CommonSender sender, CommandParser parser) { + if (parser.args.length < 2) { + return false; + } + + if (parser.isInvalidReason()) { + Message.get("sender.error.invalidReason") + .set("reason", parser.getReason().getMessage()) + .sendTo(sender); + return true; + } + + if (parser.args[0].equalsIgnoreCase(sender.getName())) { + sender.sendMessage(Message.getString("sender.error.noSelf")); + return true; + } + + final String playerName = parser.args[0]; + final String message = StringUtils.join(parser.args, " ", 1, parser.args.length); + + getPlugin().getScheduler().runAsync(() -> { + final PlayerData player = getPlayer(sender, playerName, true); + + if (player == null) { + sender.sendMessage(Message.get("sender.error.notFound").set("player", playerName).toString()); + return; + } + + final PlayerData actor = sender.getData(); + final PlayerNoteData warning = new PlayerNoteData(player, actor, message); + + try { + getPlugin().getPlayerNoteStorage().addNote(warning); + } catch (SQLException e) { + sender.sendMessage(Message.get("sender.error.exception").toString()); + e.printStackTrace(); + } + }); + + return true; + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/commands/BanCommand.java b/common/src/main/java/me/confuser/banmanager/common/commands/BanCommand.java new file mode 100644 index 000000000..7d8f938b5 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/commands/BanCommand.java @@ -0,0 +1,167 @@ +package me.confuser.banmanager.common.commands; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.CommonPlayer; +import me.confuser.banmanager.common.data.PlayerBanData; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.util.Message; + +import java.sql.SQLException; +import java.util.UUID; + +public class BanCommand extends CommonCommand { + + public BanCommand(BanManagerPlugin plugin) { + super(plugin, "ban", true, 1); + } + + @Override + public boolean onCommand(CommonSender sender, CommandParser parser) { + final boolean isSilent = parser.isSilent(); + + if (isSilent && !sender.hasPermission(getPermission() + ".silent")) { + sender.sendMessage(Message.getString("sender.error.noPermission")); + return true; + } + + if (parser.args.length < 2) { + return false; + } + + if (parser.isInvalidReason()) { + Message.get("sender.error.invalidReason") + .set("reason", parser.getReason().getMessage()) + .sendTo(sender); + return true; + } + + if (parser.args[0].equalsIgnoreCase(sender.getName())) { + sender.sendMessage(Message.getString("sender.error.noSelf")); + return true; + } + + // Check if UUID vs name + final String playerName = parser.args[0]; + final boolean isUUID = isUUID(playerName); + final boolean isBanned; + + if (isUUID) { + try { + isBanned = getPlugin().getPlayerBanStorage().isBanned(UUID.fromString(playerName)); + } catch (IllegalArgumentException e) { + sender.sendMessage(Message.get("sender.error.notFound").set("player", playerName).toString()); + return true; + } + } else { + isBanned = getPlugin().getPlayerBanStorage().isBanned(playerName); + } + + if (isBanned && !sender.hasPermission("bm.command.ban.override")) { + Message message = Message.get("ban.error.exists"); + message.set("player", playerName); + + sender.sendMessage(message.toString()); + return true; + } + + final CommonPlayer onlinePlayer; + + if (isUUID) { + onlinePlayer = getPlugin().getServer().getPlayer(UUID.fromString(playerName)); + } else { + onlinePlayer = getPlugin().getServer().getPlayer(playerName); + } + + if (onlinePlayer == null) { + if (!sender.hasPermission("bm.command.ban.offline")) { + sender.sendMessage(Message.getString("sender.error.offlinePermission")); + return true; + } + } else if (!sender.hasPermission("bm.exempt.override.ban") && onlinePlayer.hasPermission("bm.exempt.ban")) { + Message.get("sender.error.exempt").set("player", onlinePlayer.getName()).sendTo(sender); + return true; + } + + getPlugin().getScheduler().runAsync(() -> { + final PlayerData player = getPlayer(sender, playerName, true); + + if (player == null) { + sender.sendMessage(Message.get("sender.error.notFound").set("player", playerName).toString()); + return; + } + + if (getPlugin().getExemptionsConfig().isExempt(player, "ban")) { + sender.sendMessage(Message.get("sender.error.exempt").set("player", playerName).toString()); + return; + } + + try { + if (getPlugin().getPlayerBanStorage().isRecentlyBanned(player, getCooldown())) { + Message.get("ban.error.cooldown").sendTo(sender); + return; + } + } catch (SQLException e) { + sender.sendMessage(Message.get("sender.error.exception").toString()); + e.printStackTrace(); + return; + } + + final PlayerData actor = sender.getData(); + + if (actor == null) return; + + if (isBanned) { + PlayerBanData ban; + + if (isUUID) { + ban = getPlugin().getPlayerBanStorage().getBan(UUID.fromString(playerName)); + } else { + ban = getPlugin().getPlayerBanStorage().getBan(playerName); + } + + if (ban != null) { + try { + getPlugin().getPlayerBanStorage().unban(ban, actor); + } catch (SQLException e) { + sender.sendMessage(Message.get("sender.error.exception").toString()); + e.printStackTrace(); + return; + } + } + } + + final PlayerBanData ban = new PlayerBanData(player, actor, parser.getReason().getMessage(), isSilent); + boolean created; + + try { + created = getPlugin().getPlayerBanStorage().ban(ban); + } catch (SQLException e) { + handlePunishmentCreateException(e, sender, Message.get("ban.error.exists").set("player", + playerName)); + return; + } + + if (!created) { + return; + } + + handlePrivateNotes(player, actor, parser.getReason()); + + getPlugin().getScheduler().runSync(() -> { + if (onlinePlayer == null) return; + + Message kickMessage = Message.get("ban.player.kick") + .set("displayName", onlinePlayer.getDisplayName()) + .set("player", player.getName()) + .set("playerId", player.getUUID().toString()) + .set("reason", ban.getReason()) + .set("id", ban.getId()) + .set("actor", actor.getName()); + + onlinePlayer.kick(kickMessage.toString()); + }); + }); + + return true; + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/commands/BanIpCommand.java b/common/src/main/java/me/confuser/banmanager/common/commands/BanIpCommand.java new file mode 100644 index 000000000..1cf6a4878 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/commands/BanIpCommand.java @@ -0,0 +1,141 @@ +package me.confuser.banmanager.common.commands; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.CommonPlayer; +import me.confuser.banmanager.common.data.IpBanData; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.ipaddr.IPAddress; +import me.confuser.banmanager.common.util.IPUtils; +import me.confuser.banmanager.common.util.Message; + +import java.sql.SQLException; + +public class BanIpCommand extends CommonCommand { + + public BanIpCommand(BanManagerPlugin plugin) { + super(plugin, "banip", false, 1); + } + + @Override + public boolean onCommand(CommonSender sender, CommandParser parser) { + final boolean isSilent = parser.isSilent(); + + if (isSilent && !sender.hasPermission(getPermission() + ".silent")) { + sender.sendMessage(Message.getString("sender.error.noPermission")); + return true; + } + + if (parser.args.length < 2) { + return false; + } + + if (parser.isInvalidReason()) { + Message.get("sender.error.invalidReason") + .set("reason", parser.getReason().getMessage()) + .sendTo(sender); + return true; + } + + if (parser.args[0].equalsIgnoreCase(sender.getName())) { + sender.sendMessage(Message.getString("sender.error.noSelf")); + return true; + } + + final String ipStr = parser.args[0]; + final boolean isName = !IPUtils.isValid(ipStr); + + if (isName && ipStr.length() > 16) { + Message message = Message.get("sender.error.invalidIp"); + message.set("ip", ipStr); + + sender.sendMessage(message.toString()); + return true; + } + + if (isName) { + CommonPlayer onlinePlayer = getPlugin().getServer().getPlayer(ipStr); + + if (onlinePlayer != null && !sender.hasPermission("bm.exempt.override.banip") + && onlinePlayer.hasPermission("bm.exempt.banip")) { + Message.get("sender.error.exempt").set("player", onlinePlayer.getName()).sendTo(sender); + return true; + } + } + + getPlugin().getScheduler().runAsync(() -> { + final IPAddress ip = getIp(ipStr); + + if (ip == null) { + sender.sendMessage(Message.get("sender.error.notFound").set("player", ipStr).toString()); + return; + } + + final boolean isBanned = getPlugin().getIpBanStorage().isBanned(ip); + + if (isBanned && !sender.hasPermission("bm.command.banip.override")) { + Message message = Message.get("banip.error.exists"); + message.set("ip", ipStr); + + sender.sendMessage(message.toString()); + return; + } + + try { + if (getPlugin().getIpBanStorage().isRecentlyBanned(ip, getCooldown())) { + Message.get("banip.error.cooldown").sendTo(sender); + return; + } + } catch (SQLException e) { + sender.sendMessage(Message.get("sender.error.exception").toString()); + e.printStackTrace(); + return; + } + + final PlayerData actor = sender.getData(); + + if (isBanned) { + IpBanData ban = getPlugin().getIpBanStorage().getBan(ip); + + if (ban != null) { + try { + getPlugin().getIpBanStorage().unban(ban, actor); + } catch (SQLException e) { + sender.sendMessage(Message.get("sender.error.exception").toString()); + e.printStackTrace(); + return; + } + } + } + + final IpBanData ban = new IpBanData(ip, actor, parser.getReason().getMessage(), isSilent); + boolean created; + + try { + created = getPlugin().getIpBanStorage().ban(ban); + } catch (SQLException e) { + handlePunishmentCreateException(e, sender, Message.get("banip.error.exists").set("ip", + ipStr)); + return; + } + + if (!created) { + return; + } + + getPlugin().getScheduler().runSync(() -> { + Message kickMessage = Message.get("banip.ip.kick") + .set("reason", ban.getReason()) + .set("id", ban.getId()) + .set("actor", actor.getName()); + + for (CommonPlayer onlinePlayer : getPlugin().getServer().getOnlinePlayers()) { + if (IPUtils.toIPAddress(onlinePlayer.getAddress()).equals(ip)) { + onlinePlayer.kick(kickMessage.toString()); + } + } + }); + }); + + return true; + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/commands/BanIpRangeCommand.java b/common/src/main/java/me/confuser/banmanager/common/commands/BanIpRangeCommand.java new file mode 100644 index 000000000..5c7428c73 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/commands/BanIpRangeCommand.java @@ -0,0 +1,95 @@ +package me.confuser.banmanager.common.commands; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.CommonPlayer; +import me.confuser.banmanager.common.data.IpRangeBanData; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.ipaddr.IPAddress; +import me.confuser.banmanager.common.ipaddr.IPAddressSeqRange; +import me.confuser.banmanager.common.ipaddr.IPAddressString; +import me.confuser.banmanager.common.util.IPUtils; +import me.confuser.banmanager.common.util.Message; + +import java.sql.SQLException; + +public class BanIpRangeCommand extends CommonCommand { + + public BanIpRangeCommand(BanManagerPlugin plugin) { + super(plugin, "baniprange", false, 1); + } + + @Override + public boolean onCommand(final CommonSender sender, CommandParser parser) { + final boolean isSilent = parser.isSilent(); + + if (isSilent && !sender.hasPermission(getPermission() + ".silent")) { + sender.sendMessage(Message.getString("sender.error.noPermission")); + return true; + } + + if (parser.args.length < 2) { + return false; + } + + if (parser.isInvalidReason()) { + Message.get("sender.error.invalidReason") + .set("reason", parser.getReason().getMessage()) + .sendTo(sender); + return true; + } + + IPAddressString ip = new IPAddressString(parser.args[0]); + + if (!ip.isSequential()) { + Message.get("baniprange.error.invalid").sendTo(sender); + return true; + } + + IPAddressSeqRange range = ip.getSequentialRange(); + + final IPAddress fromIp = range.getLower(); + final IPAddress toIp = range.getUpper(); + + if (getPlugin().getIpRangeBanStorage().isBanned(fromIp) || getPlugin().getIpRangeBanStorage().isBanned(toIp)) { + Message.get("baniprange.error.exists").sendTo(sender); + return true; + } + + final Reason reason = parser.getReason(); + + getPlugin().getScheduler().runAsync(() -> { + final PlayerData actor = sender.getData(); + final IpRangeBanData ban = new IpRangeBanData(fromIp, toIp, actor, reason.getMessage(), isSilent); + boolean created; + + try { + created = getPlugin().getIpRangeBanStorage().ban(ban); + } catch (SQLException e) { + handlePunishmentCreateException(e, sender, Message.get("baniprange.error.exists")); + return; + } + + if (!created) { + return; + } + + // Find online players + getPlugin().getScheduler().runSync(() -> { + Message kickMessage = Message.get("baniprange.ip.kick") + .set("id", ban.getId()) + .set("reason", ban.getReason()) + .set("actor", actor.getName()); + + for (CommonPlayer onlinePlayer : getPlugin().getServer().getOnlinePlayers()) { + if (ban.inRange(IPUtils.toIPAddress(onlinePlayer.getAddress()))) { + onlinePlayer.kick(kickMessage.toString()); + } + } + }); + }); + + return true; + + } +} + diff --git a/common/src/main/java/me/confuser/banmanager/common/commands/BanListCommand.java b/common/src/main/java/me/confuser/banmanager/common/commands/BanListCommand.java new file mode 100644 index 000000000..398284b1f --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/commands/BanListCommand.java @@ -0,0 +1,77 @@ +package me.confuser.banmanager.common.commands; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.data.IpBanData; +import me.confuser.banmanager.common.data.IpRangeBanData; +import me.confuser.banmanager.common.data.PlayerBanData; +import me.confuser.banmanager.common.util.Message; + +public class BanListCommand extends CommonCommand { + + public BanListCommand(BanManagerPlugin plugin) { + super(plugin, "banlist", false); + } + + @Override + public boolean onCommand(CommonSender sender, CommandParser parser) { + if (parser.args.length > 1) return false; + + String type = "players"; + + if (parser.args.length == 1) { + type = parser.args[0]; + } + + StringBuilder list = new StringBuilder(); + int total = 0; + + if (type.startsWith("play")) { + if (!sender.hasPermission(getPermission() + ".players")) { + sender.sendMessage(Message.getString("sender.error.noPermission")); + return true; + } + + for (PlayerBanData ban : getPlugin().getPlayerBanStorage().getBans().values()) { + list.append(ban.getPlayer().getName()); + list.append(", "); + + total++; + } + } else if (type.startsWith("ipr")) { + if (!sender.hasPermission(getPermission() + ".ipranges")) { + sender.sendMessage(Message.getString("sender.error.noPermission")); + return true; + } + + for (IpRangeBanData ban : getPlugin().getIpRangeBanStorage().getBans().values()) { + list.append(ban.getFromIp().toString()); + list.append(" - "); + list.append(ban.getToIp().toString()); + list.append(", "); + + total++; + } + } else if (type.startsWith("ip")) { + if (!sender.hasPermission(getPermission() + ".ips")) { + sender.sendMessage(Message.getString("sender.error.noPermission")); + return true; + } + + for (IpBanData ban : getPlugin().getIpBanStorage().getBans().values()) { + list.append(ban.getIp().toString()); + list.append(", "); + + total++; + } + } else { + return false; + } + + if (list.length() >= 2) list.setLength(list.length() - 2); + + Message.get("banlist.header").set("bans", total).set("type", type).sendTo(sender); + if (list.length() > 0) sender.sendMessage(list.toString()); + + return true; + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/commands/BanNameCommand.java b/common/src/main/java/me/confuser/banmanager/common/commands/BanNameCommand.java new file mode 100644 index 000000000..f7f5c3004 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/commands/BanNameCommand.java @@ -0,0 +1,103 @@ +package me.confuser.banmanager.common.commands; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.CommonPlayer; +import me.confuser.banmanager.common.data.NameBanData; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.util.Message; + +import java.sql.SQLException; + +public class BanNameCommand extends CommonCommand { + + public BanNameCommand(BanManagerPlugin plugin) { + super(plugin, "banname", true, 1); + } + + @Override + public boolean onCommand(final CommonSender sender, CommandParser parser) { + final boolean isSilent = parser.isSilent(); + + if (isSilent && !sender.hasPermission(getPermission() + ".silent")) { + sender.sendMessage(Message.getString("sender.error.noPermission")); + return true; + } + + if (parser.args.length < 2) { + return false; + } + + if (parser.isInvalidReason()) { + Message.get("sender.error.invalidReason") + .set("reason", parser.getReason().getMessage()) + .sendTo(sender); + return true; + } + + final String name = parser.args[0]; + final Reason reason = parser.getReason(); + + getPlugin().getScheduler().runAsync(() -> { + final boolean isBanned = getPlugin().getNameBanStorage().isBanned(name); + + if (isBanned && !sender.hasPermission("bm.command.banname.override")) { + Message message = Message.get("banname.error.exists"); + message.set("name", name); + + sender.sendMessage(message.toString()); + return; + } + + final PlayerData actor = sender.getData(); + + if (actor == null) return; + + if (isBanned) { + NameBanData ban = getPlugin().getNameBanStorage().getBan(name); + + if (ban != null) { + try { + getPlugin().getNameBanStorage().unban(ban, actor); + } catch (SQLException e) { + sender.sendMessage(Message.get("sender.error.exception").toString()); + e.printStackTrace(); + return; + } + } + } + + final NameBanData ban = new NameBanData(name, actor, reason.getMessage(), isSilent); + boolean created; + + try { + created = getPlugin().getNameBanStorage().ban(ban); + } catch (SQLException e) { + handlePunishmentCreateException(e, sender, Message.get("banname.error.exists").set("name", + name)); + return; + } + + if (!created) { + return; + } + + // Find online players + getPlugin().getScheduler().runSync(() -> { + Message kickMessage = Message.get("banname.name.kick") + .set("reason", ban.getReason()) + .set("actor", actor.getName()) + .set("id", ban.getId()) + .set("name", name); + + for (CommonPlayer onlinePlayer : getPlugin().getServer().getOnlinePlayers()) { + if (onlinePlayer.getName().equalsIgnoreCase(name)) { + onlinePlayer.kick(kickMessage.toString()); + } + } + }); + }); + + return true; + } + +} diff --git a/common/src/main/java/me/confuser/banmanager/common/commands/ClearCommand.java b/common/src/main/java/me/confuser/banmanager/common/commands/ClearCommand.java new file mode 100644 index 000000000..1deb943a4 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/commands/ClearCommand.java @@ -0,0 +1,115 @@ +package me.confuser.banmanager.common.commands; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.util.Message; + +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.HashSet; + +public class ClearCommand extends CommonCommand { + + private static HashSet types = new HashSet() { + + { + add("banrecords"); + add("baniprecords"); + add("kicks"); + add("muterecords"); + add("notes"); + add("reports"); + add("warnings"); + } + }; + + public ClearCommand(BanManagerPlugin plugin) { + super(plugin, "bmclear", true); + } + + @Override + public boolean onCommand(final CommonSender sender, CommandParser parser) { + if (parser.args.length == 0) return false; + + // Check if UUID vs name + final String playerName = parser.args[0]; + + getPlugin().getScheduler().runAsync(() -> { + final PlayerData player = getPlayer(sender, playerName, true); + + if (player == null) { + sender.sendMessage(Message.get("sender.error.notFound").set("player", playerName).toString()); + return; + } + + ArrayList types = new ArrayList<>(); + + if (parser.args.length == 1) { + // Clear everything + for (String type : ClearCommand.types) { + if (!sender.hasPermission("bm.command.clear." + type)) { + Message.get("sender.error.noPermission").sendTo(sender); + return; + } + } + types.addAll(ClearCommand.types); + } else if (parser.args.length == 2) { + String type = parser.args[1].toLowerCase(); + + if (!ClearCommand.types.contains(type)) { + Message.get("bmclear.error.invalid").sendTo(sender); + return; + } else if (sender.hasPermission("bm.command.clear." + type)) { + types.add(type); + } + } + + for (String type : types) { + try { + switch (type) { + case "banrecords": + getPlugin().getPlayerBanRecordStorage().deleteAll(player); + break; + + case "baniprecords": + getPlugin().getIpBanRecordStorage().deleteAll(player.getIp()); + break; + + case "kicks": + getPlugin().getPlayerKickStorage().deleteAll(player); + break; + + case "muterecords": + getPlugin().getPlayerMuteRecordStorage().deleteAll(player); + break; + + case "notes": + getPlugin().getPlayerNoteStorage().deleteAll(player); + break; + + case "reports": + getPlugin().getPlayerReportStorage().deleteAll(player); + break; + + case "warnings": + getPlugin().getPlayerWarnStorage().deleteAll(player); + break; + } + } catch (SQLException e) { + sender.sendMessage(Message.get("sender.error.exception").toString()); + e.printStackTrace(); + return; + } + + Message.get("bmclear.notify") + .set("type", type) + .set("player", player.getName()) + .set("playerId", player.getUUID().toString()) + .sendTo(sender); + } + }); + + return true; + } + +} diff --git a/common/src/main/java/me/confuser/banmanager/common/commands/CommandParser.java b/common/src/main/java/me/confuser/banmanager/common/commands/CommandParser.java new file mode 100644 index 000000000..05ca2d632 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/commands/CommandParser.java @@ -0,0 +1,101 @@ +package me.confuser.banmanager.common.commands; + +import lombok.Getter; +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.cli.Args; +import me.confuser.banmanager.common.cli.Argument; +import me.confuser.banmanager.common.util.StringUtils; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +public class CommandParser { + + @Getter + protected String[] args; + + private BanManagerPlugin plugin; + + @Argument(alias = "s") + @Getter + private boolean silent = false; + + @Argument(alias = "st") + @Getter + private boolean soft = false; + + @Getter + private Reason reason; + + @Getter + private boolean invalidReason = false; + + + public CommandParser(BanManagerPlugin plugin, String[] args) { + this.plugin = plugin; + + List parsedArgs = Args.parse(this, args, false); + this.args = parsedArgs.toArray(new String[parsedArgs.size()]); + } + + public CommandParser(BanManagerPlugin plugin, String[] args, int start) { + this.plugin = plugin; + this.args = args; + reason = getReason(start); + ArrayList newArgs = new ArrayList<>(); + String[] reasonArgs = reason.getMessage().split(" "); + + if (reasonArgs.length > 0 && !reasonArgs[0].isEmpty()) { + Collections.addAll(newArgs, reasonArgs); + } + + if (args.length > start) { + // @TODO inefficient + for (int i = start - 1; i >= 0; i--) { + newArgs.add(0, args[i]); + } + } + + List parsedArgs = Args.parse(this, newArgs.toArray(new String[0]), false); + this.args = parsedArgs.toArray(new String[parsedArgs.size()]); + + reason.setMessage(StringUtils.join(this.args, " ", start, this.args.length)); + } + + public Reason getReason(int start) { + String reason = StringUtils.join(args, " ", start, args.length); + List notes = new ArrayList<>(); + + String[] matches = null; + if (plugin.getConfig().isCreateNoteReasons()) { + matches = StringUtils.substringsBetween(reason, "(", ")"); + } + + if (matches != null) notes = Arrays.asList(matches); + + for (int i = start; i < args.length; i++) { + if (!args[i].startsWith("#")) continue; + + String key = args[i].replace("#", ""); + String replace = plugin.getReasonsConfig().getReason(key); + + if (replace != null) reason = reason.replace("#" + key, replace); + if (replace != null) { + reason = reason.replace("#" + key, replace); + } else if(plugin.getConfig().isBlockInvalidReasons()) { + invalidReason = true; + } + } + + for (String note : notes) { + reason = reason.replace("(" + note + ")", ""); + } + + reason = reason.trim(); + + return new Reason(reason, notes); + } + +} diff --git a/common/src/main/java/me/confuser/banmanager/common/commands/CommonCommand.java b/common/src/main/java/me/confuser/banmanager/common/commands/CommonCommand.java new file mode 100644 index 000000000..839679ece --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/commands/CommonCommand.java @@ -0,0 +1,221 @@ +package me.confuser.banmanager.common.commands; + + +import lombok.Getter; +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.CommonPlayer; +import me.confuser.banmanager.common.configs.PluginInfo; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.data.PlayerNoteData; +import me.confuser.banmanager.common.ipaddr.IPAddress; +import me.confuser.banmanager.common.ipaddr.IPAddressString; +import me.confuser.banmanager.common.util.IPUtils; +import me.confuser.banmanager.common.util.Message; +import me.confuser.banmanager.common.util.UUIDUtils; + +import java.lang.reflect.InvocationTargetException; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; +import java.util.stream.Collectors; + +public abstract class CommonCommand { + + @Getter + private BanManagerPlugin plugin; + @Getter + private final String usage; + @Getter + private final String permission; + @Getter + private final String commandName; + @Getter + private boolean enableTabCompletion; + @Getter + private final List aliases; + private Class parser; + private Integer start = null; + + public CommonCommand(BanManagerPlugin plugin, String commandName, boolean enableTabCompletion) { + this.plugin = plugin; + this.commandName = commandName; + this.enableTabCompletion = enableTabCompletion; + + PluginInfo.CommandInfo info = plugin.getPluginInfo().getCommand(commandName); + + this.usage = info.getUsage(); + this.permission = info.getPermission(); + this.aliases = info.getAliases(); + this.parser = CommandParser.class; + } + + public CommonCommand(BanManagerPlugin plugin, String commandName, boolean enableTabCompletion, PluginInfo pluginInfo) { + this.plugin = plugin; + this.commandName = commandName; + this.enableTabCompletion = enableTabCompletion; + + PluginInfo.CommandInfo info = pluginInfo.getCommand(commandName); + + this.usage = info.getUsage(); + this.permission = info.getPermission(); + this.aliases = info.getAliases(); + this.parser = CommandParser.class; + } + + public CommonCommand(BanManagerPlugin plugin, String commandName, boolean enableTabCompletion, int start) { + this(plugin, commandName, enableTabCompletion); + + this.start = start; + } + + public CommonCommand(BanManagerPlugin plugin, String commandName, boolean enableTabCompletion, Class parser, int + start) { + this(plugin, commandName, enableTabCompletion); + + this.parser = parser; + this.start = start; + } + + public static boolean isUUID(String player) { + return player.length() > 16; + } + + public static PlayerData getPlayer(CommonSender sender, String playerName, boolean mojangLookup) { + boolean isUUID = isUUID(playerName); + PlayerData player = null; + + if (isUUID) { + try { + player = BanManagerPlugin.getInstance().getPlayerStorage().queryForId(UUIDUtils.toBytes(UUID.fromString(playerName))); + } catch (SQLException e) { + sender.sendMessage(Message.get("sender.error.exception").toString()); + e.printStackTrace(); + } + } else { + player = BanManagerPlugin.getInstance().getPlayerStorage().retrieve(playerName, mojangLookup); + } + + return player; + } + + public static void handlePunishmentCreateException(SQLException e, CommonSender sender, Message duplicateMessage) { + // For some reason ORMLite hides the error code (returns 0 instead of 1062) + if (e.getCause().getMessage().startsWith("Duplicate entry")) { + duplicateMessage.sendTo(sender); + return; + } + + Message.get("sender.error.exception").sendTo(sender); + e.printStackTrace(); + } + + public static void handlePrivateNotes(PlayerData player, PlayerData actor, Reason reason) { + if (BanManagerPlugin.getInstance().getConfig().isCreateNoteReasons()) + if (reason.getNotes().size() == 0) return; + + for (String note : reason.getNotes()) { + try { + BanManagerPlugin.getInstance().getPlayerNoteStorage().create(new PlayerNoteData(player, actor, note)); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + } + + public static IPAddress getIp(String ipStr) { + final boolean isName = !IPUtils.isValid(ipStr); + IPAddress ip = null; + + if (isName) { + PlayerData player = BanManagerPlugin.getInstance().getPlayerStorage().retrieve(ipStr, false); + if (player == null) return null; + + ip = player.getIp(); + } else { + ip = new IPAddressString(ipStr).getAddress(); + } + + return ip; + } + + public static boolean isValidNameDelimiter(String names) { + return names.contains("|") || names.contains(","); + } + + public static String[] splitNameDelimiter(String str) { + String delimiter; + + if (str.contains("|")) { + delimiter = "\\|"; + } else { + delimiter = ","; + } + + return str.split(delimiter); + } + + public CommandParser getParser(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException { + if (start == null) { + return (CommandParser) parser.getDeclaredConstructor(BanManagerPlugin.class, String[].class).newInstance(plugin, + args); + } + + return (CommandParser) parser.getDeclaredConstructor(BanManagerPlugin.class, String[].class, int.class) + .newInstance(plugin, + args, start); + } + + public CommandParser getParser(List args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException { + return getParser(args.toArray(new String[0])); + } + + public List handlePlayerNameTabComplete(CommonSender sender, String[] args) { + ArrayList mostLike = new ArrayList<>(); + if(args.length == 1) { + if (isValidNameDelimiter(args[0])) { + String[] names = splitNameDelimiter(args[0]); + + String lookup = names[names.length - 1]; + + if (plugin.getConfig().isOfflineAutoComplete()) { + for (CharSequence charSequence : plugin.getPlayerStorage().getAutoCompleteTree().getKeysStartingWith(lookup)) { + mostLike.add(args[0] + charSequence.toString().substring(lookup.length())); + } + } + } else if (plugin.getConfig().isOfflineAutoComplete()) { + for (CharSequence charSequence : plugin.getPlayerStorage().getAutoCompleteTree().getKeysStartingWith(args[0])) { + mostLike.add(charSequence.toString()); + } + } else { + CommonPlayer senderPlayer = sender instanceof CommonPlayer ? (CommonPlayer) sender : null; + String lower = args[0].toLowerCase(); + for (CommonPlayer player : plugin.getServer().getOnlinePlayers()) { + if ((senderPlayer == null || senderPlayer.canSee(player)) && player.getName().toLowerCase().startsWith(lower)) { + mostLike.add(player.getName()); + } + } + } + } + if(args.length > 1) { + // Reasons? + // TODO: Only allow reasons for valid commands. + String lookup = args[args.length - 1]; + if(lookup.startsWith("#")) { + return plugin.getReasonsConfig().getReasons().keySet().stream().map(k -> "#" + k) + .filter(k -> k.startsWith(lookup)).collect(Collectors.toList()); + } + } + + if (mostLike.size() > 100) return mostLike.subList(0, 99); + + return mostLike; + } + + public long getCooldown() { + return plugin.getConfig().getCooldownsConfig().getCommand(getCommandName()); + } + + public abstract boolean onCommand(final CommonSender sender, CommandParser args); +} diff --git a/common/src/main/java/me/confuser/banmanager/common/commands/CommonSender.java b/common/src/main/java/me/confuser/banmanager/common/commands/CommonSender.java new file mode 100644 index 000000000..81f919361 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/commands/CommonSender.java @@ -0,0 +1,13 @@ +package me.confuser.banmanager.common.commands; + +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.util.Message; + +public interface CommonSender { + String getName(); + boolean hasPermission(String permission); + void sendMessage(String message); + void sendMessage(Message message); + boolean isConsole(); + PlayerData getData(); +} diff --git a/common/src/main/java/me/confuser/banmanager/common/commands/CommonSubCommand.java b/common/src/main/java/me/confuser/banmanager/common/commands/CommonSubCommand.java new file mode 100644 index 000000000..a2155d852 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/commands/CommonSubCommand.java @@ -0,0 +1,23 @@ +package me.confuser.banmanager.common.commands; + +import lombok.Getter; +import me.confuser.banmanager.common.BanManagerPlugin; + +public abstract class CommonSubCommand { + + @Getter + private BanManagerPlugin plugin; + @Getter + private String name; + + public CommonSubCommand(BanManagerPlugin plugin, String name) { + this.plugin = plugin; + this.name = name.toLowerCase(); + } + + public abstract boolean onCommand(CommonSender sender, CommandParser args); + + public abstract String getHelp(); + + public abstract String getPermission(); +} diff --git a/src/main/java/me/confuser/banmanager/commands/DeleteCommand.java b/common/src/main/java/me/confuser/banmanager/common/commands/DeleteCommand.java similarity index 52% rename from src/main/java/me/confuser/banmanager/commands/DeleteCommand.java rename to common/src/main/java/me/confuser/banmanager/common/commands/DeleteCommand.java index 94f4474df..92d528b53 100644 --- a/src/main/java/me/confuser/banmanager/commands/DeleteCommand.java +++ b/common/src/main/java/me/confuser/banmanager/common/commands/DeleteCommand.java @@ -1,21 +1,19 @@ -package me.confuser.banmanager.commands; +package me.confuser.banmanager.common.commands; -import me.confuser.banmanager.BanManager; -import me.confuser.bukkitutil.Message; -import me.confuser.bukkitutil.commands.BukkitCommand; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.util.Message; import java.sql.SQLException; import java.util.ArrayList; import java.util.HashSet; -public class DeleteCommand extends BukkitCommand { +public class DeleteCommand extends CommonCommand { private static HashSet types = new HashSet() { { add("banrecords"); + add("baniprecords"); add("kicks"); add("muterecords"); add("notes"); @@ -24,17 +22,17 @@ public class DeleteCommand extends BukkitCommand { } }; - public DeleteCommand() { - super("bmdelete"); + public DeleteCommand(BanManagerPlugin plugin) { + super(plugin, "bmdelete", false); } @Override - public boolean onCommand(final CommandSender sender, Command command, String commandName, String[] args) { - if (args.length < 2) return false; + public boolean onCommand(final CommonSender sender, CommandParser parser) { + if (parser.args.length < 2) return false; - final String type = args[0]; + final String type = parser.args[0]; - if (!DeleteCommand.types.contains(type)) { + if (!types.contains(type)) { Message.get("bmdelete.error.invalid").sendTo(sender); return true; } else if (!sender.hasPermission("bm.command.delete." + type)) { @@ -44,18 +42,18 @@ public boolean onCommand(final CommandSender sender, Command command, String com final ArrayList ids = new ArrayList<>(); - for (int i = 1; i < args.length; i++) { + for (int i = 1; i < parser.args.length; i++) { try { - ids.add(Integer.parseInt(args[i])); + ids.add(Integer.parseInt(parser.args[i])); } catch (NumberFormatException e) { - Message.get("bmdelete.error.invalidId").set("id", args[i]).sendTo(sender); + Message.get("bmdelete.error.invalidId").set("id", parser.args[i]).sendTo(sender); return true; } } if (ids.size() == 0) return false; - plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() { + getPlugin().getScheduler().runAsync(new Runnable() { @Override public void run() { @@ -64,27 +62,31 @@ public void run() { try { switch (type) { case "banrecords": - rows = plugin.getPlayerBanRecordStorage().deleteIds(ids); + rows = getPlugin().getPlayerBanRecordStorage().deleteIds(ids); + break; + + case "baniprecords": + rows = getPlugin().getIpBanRecordStorage().deleteIds(ids); break; case "kicks": - rows = plugin.getPlayerKickStorage().deleteIds(ids); + rows = getPlugin().getPlayerKickStorage().deleteIds(ids); break; case "muterecords": - rows = plugin.getPlayerMuteRecordStorage().deleteIds(ids); + rows = getPlugin().getPlayerMuteRecordStorage().deleteIds(ids); break; case "notes": - rows = plugin.getPlayerNoteStorage().deleteIds(ids); + rows = getPlugin().getPlayerNoteStorage().deleteIds(ids); break; case "reports": - rows = plugin.getPlayerReportStorage().deleteIds(ids); + rows = getPlugin().getPlayerReportStorage().deleteIds(ids); break; case "warnings": - rows = plugin.getPlayerWarnStorage().deleteIds(ids); + rows = getPlugin().getPlayerWarnStorage().deleteIds(ids); break; } } catch (SQLException e) { diff --git a/common/src/main/java/me/confuser/banmanager/common/commands/DeleteLastWarningCommand.java b/common/src/main/java/me/confuser/banmanager/common/commands/DeleteLastWarningCommand.java new file mode 100644 index 000000000..2a2b28a77 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/commands/DeleteLastWarningCommand.java @@ -0,0 +1,59 @@ +package me.confuser.banmanager.common.commands; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.CommonPlayer; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.util.Message; + +import java.sql.SQLException; + +public class DeleteLastWarningCommand extends CommonCommand { + + public DeleteLastWarningCommand(BanManagerPlugin plugin) { + super(plugin, "dwarn", true); + } + + @Override + public boolean onCommand(final CommonSender sender, CommandParser parser) { + if (parser.args.length < 1) { + return false; + } + + // Check if UUID vs name + final String playerName = parser.args[0]; + final boolean isUUID = playerName.length() > 16; + + getPlugin().getScheduler().runAsync(() -> { + final PlayerData player = getPlayer(sender, playerName, true); + + if (player == null) { + sender.sendMessage(Message.get("sender.error.notFound").set("player", playerName).toString()); + return; + } + + int updated = 0; + try { + updated = getPlugin().getPlayerWarnStorage().deleteRecent(player); + } catch (SQLException e) { + e.printStackTrace(); + } + + if (updated == 0) { + Message.get("dwarn.error.noWarnings").set("player", player.getName()).sendTo(sender); + } else { + Message.get("dwarn.notify").set("player", player.getName()).set("actor", sender.getName()).sendTo(sender); + + CommonPlayer commonPlayer = getPlugin().getServer().getPlayer(player.getUUID()); + + if (commonPlayer == null) return; + + commonPlayer.sendMessage(Message.get("dwarn.player.notify") + .set("player", player.getName()) + .set("playerId", player.getUUID().toString()) + .set("actor", sender.getName())); + } + }); + + return true; + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/commands/ExportCommand.java b/common/src/main/java/me/confuser/banmanager/common/commands/ExportCommand.java new file mode 100644 index 000000000..1a258dfca --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/commands/ExportCommand.java @@ -0,0 +1,168 @@ +package me.confuser.banmanager.common.commands; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.data.IpBanData; +import me.confuser.banmanager.common.data.PlayerBanData; +import me.confuser.banmanager.common.gson.stream.JsonWriter; +import me.confuser.banmanager.common.ormlite.dao.CloseableIterator; +import me.confuser.banmanager.common.util.DateUtils; +import me.confuser.banmanager.common.util.Message; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.nio.charset.Charset; + +public class ExportCommand extends CommonCommand { + + private static final String BANNED_JSON_TIME_FORMAT = "yyyy-MM-dd_HH-mm-ss"; + private static final String EXPORT_FORMAT = "yyyy-MM-dd HH:mm:ss Z"; + private boolean inProgress = false; + + public ExportCommand(BanManagerPlugin plugin) { + super(plugin, "bmexport", false); + } + + @Override + public boolean onCommand(final CommonSender sender, CommandParser parser) { + if (parser.args.length != 1) return false; + + if (inProgress) { + sender.sendMessage(Message.getString("export.error.inProgress")); + return true; + } + + if (!parser.args[0].startsWith("play") && !parser.args[0].startsWith("ip")) return false; + + getPlugin().getScheduler().runAsync(() -> { + Message finishedMessage; + String fileName; + + if (parser.args[0].startsWith("play")) { + sender.sendMessage(Message.getString("export.player.started")); + finishedMessage = Message.get("export.player.finished"); + fileName = "banned-players-" + DateUtils.format(BANNED_JSON_TIME_FORMAT, System.currentTimeMillis() / 1000L) + ".json"; + + finishedMessage.set("file", fileName); + + try { + exportPlayers(fileName); + } catch (IOException e) { + sender.sendMessage(Message.get("sender.error.exception").toString()); + e.printStackTrace(); + return; + } + } else if (parser.args[0].startsWith("ip")) { + sender.sendMessage(Message.getString("export.ip.started")); + finishedMessage = Message.get("export.player.finished"); + + fileName = "banned-ips-" + DateUtils.format(BANNED_JSON_TIME_FORMAT, System.currentTimeMillis() / 1000L) + ".json"; + + finishedMessage.set("file", fileName); + + try { + exportIps(fileName); + } catch (IOException e) { + sender.sendMessage(Message.get("sender.error.exception").toString()); + e.printStackTrace(); + return; + } + } else { + return; + } + + finishedMessage.sendTo(sender); + }); + + return true; + } + + private void exportIps(String fileName) throws IOException { + File file = new File(getPlugin().getDataFolder(), fileName); + + if (!file.exists()) { + file.createNewFile(); + } else { + throw new IOException("File already exists"); + } + + JsonWriter jsonWriter = new JsonWriter(new OutputStreamWriter(new FileOutputStream(file), Charset.forName("UTF-8") + .newEncoder())); + + jsonWriter.beginArray(); + jsonWriter.setIndent(" "); + + CloseableIterator itr = getPlugin().getIpBanStorage().iterator(); + + while (itr.hasNext()) { + IpBanData next = itr.next(); + + jsonWriter.beginObject(); + + jsonWriter.name("ip").value(next.getIp().toString()); + jsonWriter.name("created").value(DateUtils.format(EXPORT_FORMAT, next.getCreated())); + jsonWriter.name("source").value(next.getActor().getName()); + jsonWriter.name("expires"); + + if (next.getExpires() == 0) { + jsonWriter.value("forever"); + } else { + jsonWriter.value(DateUtils.format(EXPORT_FORMAT, next.getExpires())); + } + + jsonWriter.name("reason").value(next.getReason()); + + jsonWriter.endObject(); + } + + itr.closeQuietly(); + + jsonWriter.endArray(); + jsonWriter.close(); + } + + private void exportPlayers(String fileName) throws IOException { + File file = new File(getPlugin().getDataFolder(), fileName); + + if (!file.exists()) { + file.createNewFile(); + } else { + throw new IOException("File already exists"); + } + + JsonWriter jsonWriter = new JsonWriter(new OutputStreamWriter(new FileOutputStream(file), Charset.forName("UTF-8") + .newEncoder())); + jsonWriter.beginArray(); + jsonWriter.setIndent(" "); + + CloseableIterator itr = getPlugin().getPlayerBanStorage().iterator(); + + while (itr.hasNext()) { + PlayerBanData next = itr.next(); + + jsonWriter.beginObject(); + + jsonWriter.name("uuid").value(next.getPlayer().getUUID().toString()); + jsonWriter.name("name").value(next.getPlayer().getName()); + jsonWriter.name("created").value(DateUtils.format(EXPORT_FORMAT, next.getCreated())); + jsonWriter.name("source").value(next.getActor().getName()); + jsonWriter.name("expires"); + + if (next.getExpires() == 0) { + jsonWriter.value("forever"); + } else { + jsonWriter.value(DateUtils.format(EXPORT_FORMAT, next.getExpires())); + } + + jsonWriter.name("reason").value(next.getReason()); + + jsonWriter.endObject(); + } + + itr.closeQuietly(); + + jsonWriter.endArray(); + jsonWriter.close(); + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/commands/FindAltsCommand.java b/common/src/main/java/me/confuser/banmanager/common/commands/FindAltsCommand.java new file mode 100644 index 000000000..ea6a98729 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/commands/FindAltsCommand.java @@ -0,0 +1,125 @@ +package me.confuser.banmanager.common.commands; + + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.CommonPlayer; +import me.confuser.banmanager.common.data.PlayerBanData; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.ipaddr.IPAddress; +import me.confuser.banmanager.common.kyori.text.Component; +import me.confuser.banmanager.common.kyori.text.TextComponent; +import me.confuser.banmanager.common.kyori.text.event.ClickEvent; +import me.confuser.banmanager.common.kyori.text.format.NamedTextColor; +import me.confuser.banmanager.common.kyori.text.format.TextColor; +import me.confuser.banmanager.common.util.IPUtils; +import me.confuser.banmanager.common.util.Message; + +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +public class FindAltsCommand extends CommonCommand { + + public FindAltsCommand(BanManagerPlugin plugin) { + super(plugin, "alts", true); + } + + @Override + public boolean onCommand(final CommonSender sender, CommandParser parser) { + if (parser.args.length < 1) { + return false; + } + + final String ipStr = parser.args[0]; + final boolean isName = !IPUtils.isValid(ipStr); + + if (isName && ipStr.length() > 16) { + Message message = Message.get("sender.error.invalidIp"); + message.set("ip", ipStr); + + sender.sendMessage(message.toString()); + return true; + } + + getPlugin().getScheduler().runAsync(() -> { + final IPAddress ip = getIp(ipStr); + + if (ip == null) { + sender.sendMessage(Message.get("alts.header")); + sender.sendMessage(Message.get("none").toString()); + return; + } + + List players = getPlugin().getPlayerStorage().getDuplicatesInTime(ip, getPlugin().getConfig().getTimeAssociatedAlts()); + + if (!sender.isConsole()) { + sender.sendMessage(Message.get("alts.header").set("ip", ipStr).toString()); + + if (players.isEmpty()) { + sender.sendMessage(Message.get("none").toString()); + return; + } + + ((CommonPlayer) sender).sendJSONMessage(alts(players)); + } else { + ArrayList names = new ArrayList<>(players.size()); + + for (PlayerData player : players) { + names.add(player.getName()); + } + + sender.sendMessage(Message.get("alts.header").set("ip", ipStr).toString()); + + if (names.isEmpty()) { + sender.sendMessage(Message.get("none").toString()); + return; + } + + sender.sendMessage(String.join(", ", names)); + } + }); + + return true; + } + + public static TextComponent alts(List players) { + TextComponent.Builder message = Component.text(); + int index = 0; + + for (PlayerData player : players) { + TextColor colour = NamedTextColor.GREEN; + + if (BanManagerPlugin.getInstance().getPlayerBanStorage().isBanned(player.getUUID())) { + PlayerBanData ban = BanManagerPlugin.getInstance().getPlayerBanStorage().getBan(player.getUUID()); + + if (ban.getExpires() == 0) { + colour = NamedTextColor.RED; + } else { + colour = NamedTextColor.GOLD; + } + } else { + try { + if (BanManagerPlugin.getInstance().getPlayerBanRecordStorage().getCount(player) != 0) { + colour = NamedTextColor.YELLOW; + } + } catch (SQLException e) { + e.printStackTrace(); + } + } + + message + .append( + Component.text(player.getName()) + .color(colour) + .clickEvent(ClickEvent.runCommand("/bminfo " + player.getName()))); + + if (index != players.size() - 1) { + message.append(Component.text(", ")); + } + + index++; + } + + return message.build(); + } +} diff --git a/src/main/java/me/confuser/banmanager/commands/ImportCommand.java b/common/src/main/java/me/confuser/banmanager/common/commands/ImportCommand.java similarity index 58% rename from src/main/java/me/confuser/banmanager/commands/ImportCommand.java rename to common/src/main/java/me/confuser/banmanager/common/commands/ImportCommand.java index ab527d8d8..8fb4afdf2 100644 --- a/src/main/java/me/confuser/banmanager/commands/ImportCommand.java +++ b/common/src/main/java/me/confuser/banmanager/common/commands/ImportCommand.java @@ -1,82 +1,99 @@ -package me.confuser.banmanager.commands; - -import com.google.common.net.InetAddresses; -import com.google.gson.stream.JsonReader; -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.IpBanData; -import me.confuser.banmanager.data.PlayerBanData; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.storage.conversion.SimpleWarnings; -import me.confuser.banmanager.util.IPUtils; -import me.confuser.banmanager.util.UUIDUtils; -import me.confuser.bukkitutil.Message; -import me.confuser.bukkitutil.commands.BukkitCommand; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; +package me.confuser.banmanager.common.commands; + + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.data.IpBanData; +import me.confuser.banmanager.common.data.PlayerBanData; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.gson.stream.JsonReader; +import me.confuser.banmanager.common.ipaddr.IPAddress; +import me.confuser.banmanager.common.storage.conversion.AdvancedBan; +import me.confuser.banmanager.common.storage.conversion.H2; +import me.confuser.banmanager.common.storage.conversion.SimpleWarnings; +import me.confuser.banmanager.common.util.IPUtils; +import me.confuser.banmanager.common.util.Message; +import me.confuser.banmanager.common.util.UUIDUtils; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import java.sql.SQLException; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.HashSet; import java.util.UUID; -public class ImportCommand extends BukkitCommand { - +public class ImportCommand extends CommonCommand { private boolean importInProgress = false; - private static HashSet validConverters = new HashSet(){{ + private static HashSet validConverters = new HashSet() {{ add("player"); add("players"); add("ip"); add("ips"); add("simplewarnings"); + add("advancedban"); + add("h2"); }}; - public ImportCommand() { - super("bmimport"); + public ImportCommand(BanManagerPlugin plugin) { + super(plugin, "bmimport", false); } @Override - public boolean onCommand(final CommandSender sender, Command command, String commandName, final String[] args) { - if (args.length != 1) { + public boolean onCommand(CommonSender sender, CommandParser parser) { + if (parser.args.length < 1) { return false; } - if (!validConverters.contains(args[0].toLowerCase())) return false; + if (!validConverters.contains(parser.args[0].toLowerCase())) return false; if (importInProgress) { sender.sendMessage(Message.getString("import.error.inProgress")); return true; } - plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() { - - @Override - public void run() { - String finishedMessage = ""; - - if (args[0].startsWith("player")) { - sender.sendMessage(Message.getString("import.player.started")); - finishedMessage = Message.getString("import.player.finished"); + getPlugin().getScheduler().runAsync(() -> { + String finishedMessage = ""; + + if (parser.args[0].startsWith("player")) { + sender.sendMessage(Message.getString("import.player.started")); + finishedMessage = Message.getString("import.player.finished"); + + importPlayers(); + } else if (parser.args[0].startsWith("ip")) { + sender.sendMessage(Message.getString("import.ip.started")); + finishedMessage = Message.getString("import.ip.finished"); + + importIps(); + } else if (parser.args[0].startsWith("simplew")) { + new SimpleWarnings(getPlugin()); + } else if (parser.args[0].startsWith("advancedb")) { + if (parser.args.length < 5) { + sender.sendMessage("/bmimport advancedban [username] [password]"); + return; + } - importPlayers(); - } else if (args[0].startsWith("ip")) { - sender.sendMessage(Message.getString("import.ip.started")); - finishedMessage = Message.getString("import.ip.finished"); + sender.sendMessage(Message.getString("import.advancedban.started")); + finishedMessage = Message.getString("import.advancedban.finished"); - importIps(); - } else if (args[0].startsWith("simplew")) { - new SimpleWarnings(); + new AdvancedBan(getPlugin(), parser.args); + } else if (parser.args[0].equals("h2")) { + if (parser.args.length < 2) { + sender.sendMessage("/bmimport h2 "); + return; } - if (sender != null) { - sender.sendMessage(finishedMessage); - } + sender.sendMessage(Message.getString("import.h2.started")); + finishedMessage = Message.getString("import.h2.finished"); + + new H2(getPlugin(), parser.args[1]); } + if (sender != null) { + sender.sendMessage(finishedMessage); + } }); return true; @@ -85,10 +102,10 @@ public void run() { private void importPlayers() { importInProgress = true; - plugin.getLogger().info(Message.getString("import.player.started")); + getPlugin().getLogger().info(Message.getString("import.player.started")); try { - JsonReader reader = new JsonReader(new InputStreamReader(new FileInputStream("banned-players.json"), Charset.forName("UTF-8").newDecoder())); + JsonReader reader = new JsonReader(new InputStreamReader(new FileInputStream("banned-players.json"), StandardCharsets.UTF_8.newDecoder())); reader.beginArray(); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z"); @@ -124,12 +141,12 @@ private void importPlayers() { String sourceName = reader.nextString(); if (!isValidSource(sourceName)) { - actor = plugin.getPlayerStorage().getConsole(); + actor = getPlugin().getPlayerStorage().getConsole(); } else { - actor = plugin.getPlayerStorage().retrieve(sourceName, false); + actor = getPlugin().getPlayerStorage().retrieve(sourceName, false); if (actor == null) { - actor = plugin.getPlayerStorage().getConsole(); + actor = getPlugin().getPlayerStorage().getConsole(); } } break; @@ -161,25 +178,25 @@ private void importPlayers() { } if (!isValidSource(name)) { - plugin.getLogger().warning("Invalid name " + name + " skipping its import"); + getPlugin().getLogger().warning("Invalid name " + name + " skipping its import"); continue; } - if (plugin.getPlayerBanStorage().isBanned(uuid)) { + if (getPlugin().getPlayerBanStorage().isBanned(uuid)) { continue; } - PlayerData player = plugin.getPlayerStorage().queryForId(UUIDUtils.toBytes(uuid)); + PlayerData player = getPlugin().getPlayerStorage().queryForId(UUIDUtils.toBytes(uuid)); if (player == null) { player = new PlayerData(uuid, name); - plugin.getPlayerStorage().create(player); + getPlugin().getPlayerStorage().create(player); } - PlayerBanData ban = new PlayerBanData(player, actor, reason, expires, created); + PlayerBanData ban = new PlayerBanData(player, actor, reason, false, expires, created); try { - plugin.getPlayerBanStorage().create(ban); + getPlugin().getPlayerBanStorage().create(ban); } catch (SQLException e) { e.printStackTrace(); continue; @@ -194,13 +211,13 @@ private void importPlayers() { } importInProgress = false; - plugin.getLogger().info(Message.getString("import.player.finished")); + getPlugin().getLogger().info(Message.getString("import.player.finished")); } private void importIps() { importInProgress = true; - plugin.getLogger().info(Message.getString("import.ip.started")); + getPlugin().getLogger().info(Message.getString("import.ip.started")); try { JsonReader reader = new JsonReader(new InputStreamReader(new FileInputStream("banned-ips.json"), Charset.forName("UTF-8").newDecoder())); @@ -235,12 +252,12 @@ private void importIps() { String sourceName = reader.nextString(); if (!isValidSource(sourceName)) { - actor = plugin.getPlayerStorage().getConsole(); + actor = getPlugin().getPlayerStorage().getConsole(); } else { - actor = plugin.getPlayerStorage().retrieve(sourceName, false); + actor = getPlugin().getPlayerStorage().retrieve(sourceName, false); if (actor == null) { - actor = plugin.getPlayerStorage().getConsole(); + actor = getPlugin().getPlayerStorage().getConsole(); } } break; @@ -271,19 +288,19 @@ private void importIps() { continue; } - if (!InetAddresses.isInetAddress(ipStr)) { + if (!IPUtils.isValid(ipStr)) { continue; } - long ip = IPUtils.toLong(ipStr); + IPAddress ip = getIp(ipStr); - if (plugin.getIpBanStorage().isBanned(ip)) { + if (getPlugin().getIpBanStorage().isBanned(ip)) { continue; } - IpBanData ban = new IpBanData(ip, actor, reason, expires, created); + IpBanData ban = new IpBanData(ip, actor, reason, false, expires, created); try { - plugin.getIpBanStorage().create(ban); + getPlugin().getIpBanStorage().create(ban); } catch (SQLException e) { e.printStackTrace(); continue; @@ -299,7 +316,7 @@ private void importIps() { importInProgress = false; - plugin.getLogger().info(Message.getString("import.ip.finished")); + getPlugin().getLogger().info(Message.getString("import.ip.finished")); } private boolean isValidSource(String name) { diff --git a/common/src/main/java/me/confuser/banmanager/common/commands/InfoCommand.java b/common/src/main/java/me/confuser/banmanager/common/commands/InfoCommand.java new file mode 100644 index 000000000..95429e8ee --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/commands/InfoCommand.java @@ -0,0 +1,615 @@ +package me.confuser.banmanager.common.commands; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.CommonPlayer; +import me.confuser.banmanager.common.data.*; +import me.confuser.banmanager.common.gson.JsonElement; +import me.confuser.banmanager.common.ipaddr.IPAddress; +import me.confuser.banmanager.common.kyori.text.Component; +import me.confuser.banmanager.common.kyori.text.TextComponent; +import me.confuser.banmanager.common.kyori.text.event.ClickEvent; +import me.confuser.banmanager.common.maxmind.db.model.CountryResponse; +import me.confuser.banmanager.common.ormlite.dao.CloseableIterator; +import me.confuser.banmanager.common.util.DateUtils; +import me.confuser.banmanager.common.util.IPUtils; +import me.confuser.banmanager.common.util.Message; +import me.confuser.banmanager.common.util.StringUtils; +import me.confuser.banmanager.common.util.parsers.InfoCommandParser; + +import java.io.IOException; +import java.net.InetAddress; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public class InfoCommand extends CommonCommand { + + public InfoCommand(BanManagerPlugin plugin) { + super(plugin, "bminfo", true, InfoCommandParser.class, 0); + } + + @Override + public boolean onCommand(final CommonSender sender, CommandParser originalParser) { + final InfoCommandParser parser = (InfoCommandParser) originalParser; + + if (parser.args.length > 2) { + return false; + } + + if (parser.args.length == 0 && sender.isConsole()) { + return false; + } + + if (parser.args.length >= 1 && !sender.hasPermission("bm.command.bminfo.others")) { + Message.get("sender.error.noPermission").sendTo(sender); + return true; + } + + final String search = parser.args.length > 0 ? parser.args[0] : sender.getName(); + final boolean isValidName = StringUtils.isValidPlayerName(search, getPlugin().getConfig().getGeyserPrefix()); + + if (!isValidName && !IPUtils.isValid(search)) { + sender.sendMessage(Message.getString("sender.error.invalidIp")); + return true; + } + + final Integer index; + + try { + index = parser.args.length == 2 ? Integer.parseInt(parser.args[1]) : null; + } catch (NumberFormatException e) { + Message.get("info.error.invalidIndex").sendTo(sender); + return true; + } + + getPlugin().getScheduler().runAsync(() -> { + try { + if (isValidName) { + playerInfo(sender, search, index, parser); + } else { + ipInfo(sender, IPUtils.toIPAddress(search), parser); + } + } catch (SQLException e) { + sender.sendMessage(Message.getString("sender.error.exception")); + e.printStackTrace(); + return; + } + }); + + return true; + } + + public void ipInfo(CommonSender sender, IPAddress ip, InfoCommandParser parser) throws + SQLException { + ArrayList messages = new ArrayList<>(); + + boolean hasFlags = parser.isBans() || parser.isMutes(); + + if (hasFlags) { + long since = 0; + + if (parser.getTime() != null && !parser.getTime().isEmpty()) { + try { + since = DateUtils.parseDateDiff(parser.getTime(), false); + } catch (Exception e1) { + sender.sendMessage(Message.get("time.error.invalid").toString()); + return; + } + } + + if (parser.isBans() && !sender.hasPermission("bm.command.bminfo.history.ipbans")) { + Message.get("sender.error.noPermission").sendTo(sender); + return; + } + + if (parser.isMutes() && !sender.hasPermission("bm.command.bminfo.history.ipmutes")) { + Message.get("sender.error.noPermission").sendTo(sender); + return; + } + + ArrayList> results; + + if (parser.getTime() != null && !parser.getTime().isEmpty()) { + results = getPlugin().getHistoryStorage().getSince(ip, since, parser); + } else { + results = getPlugin().getHistoryStorage().getAll(ip, parser); + } + + if (results == null || results.size() == 0) { + Message.get("info.history.noResults").sendTo(sender); + return; + } + + String dateTimeFormat = Message.getString("info.history.dateTimeFormat"); + + for (HashMap result : results) { + Message message = Message.get("info.history.row") + .set("id", (int) result.get("id")) + .set("reason", (String) result.get("reason")) + .set("type", (String) result.get("type")) + .set("created", DateUtils + .format(dateTimeFormat, (long) result.get("created"))) + .set("actor", (String) result.get("actor")) + .set("meta", (String) result.get("meta")); + + messages.add(message.toString()); + } + } else { + if (sender.hasPermission("bm.command.bminfo.ipstats")) { + + long ipBanTotal = getPlugin().getIpBanRecordStorage().getCount(ip); + long ipMuteTotal = getPlugin().getIpMuteRecordStorage().getCount(ip); + long ipRangeBanTotal = getPlugin().getIpRangeBanRecordStorage().getCount(ip); + + messages.add(Message.get("info.stats.ip") + .set("bans", Long.toString(ipBanTotal)) + .set("mutes", Long.toString(ipMuteTotal)) + .set("rangebans", Long.toString(ipRangeBanTotal)) + .toString()); + } + + if (getPlugin().getGeoIpConfig().isEnabled() && sender.hasPermission("bm.command.bminfo.geoip")) { + try { + CountryResponse countryResponse = getPlugin().getGeoIpConfig().getCountryDatabase().getCountry(ip.toInetAddress()); + + if (countryResponse != null) { + String country = countryResponse.getCountry().getName(); + String countryIso = countryResponse.getCountry().getIsoCode(); + String city = ""; + JsonElement cityResponse = getPlugin().getGeoIpConfig().getCityDatabase().get(ip.toInetAddress()); + + if (cityResponse != null && !cityResponse.isJsonNull()) { + city = cityResponse.getAsJsonObject().get("city").getAsJsonObject().get("names").getAsJsonObject().get("en").getAsString(); + } + + Message message = Message.get("info.geoip"); + + message.set("country", country) + .set("countryIso", countryIso) + .set("city", city); + messages.add(message.toString()); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + + if (sender.hasPermission("bm.command.bminfo.alts")) { + messages.add(Message.getString("alts.header")); + + List duplicatePlayers = getPlugin().getPlayerStorage().getDuplicatesInTime(ip, getPlugin().getConfig().getTimeAssociatedAlts()); + + if (!sender.isConsole()) { + messages.add(FindAltsCommand.alts(duplicatePlayers)); + } else { + StringBuilder duplicates = new StringBuilder(); + + for (PlayerData duplicatePlayer : duplicatePlayers) { + duplicates.append(duplicatePlayer.getName()).append(", "); + } + + if (duplicates.length() >= 2) duplicates.setLength(duplicates.length() - 2); + + messages.add(duplicates.toString()); + } + } + + if (getPlugin().getIpBanStorage().isBanned(ip)) { + IpBanData ban = getPlugin().getIpBanStorage().getBan(ip); + + Message message; + + if (ban.getExpires() == 0) { + message = Message.get("info.ipban.permanent"); + } else { + message = Message.get("info.ipban.temporary"); + message.set("expires", DateUtils.getDifferenceFormat(ban.getExpires())); + } + + String dateTimeFormat = Message.getString("info.ipban.dateTimeFormat"); + + messages.add(message + .set("reason", ban.getReason()) + .set("actor", ban.getActor().getName()) + .set("id", ban.getId()) + .set("created", DateUtils.format(dateTimeFormat, ban.getCreated())) + .toString()); + } + + if (getPlugin().getIpMuteStorage().isMuted(ip)) { + IpMuteData mute = getPlugin().getIpMuteStorage().getMute(ip); + + Message message; + + if (mute.getExpires() == 0) { + message = Message.get("info.ipmute.permanent"); + } else { + message = Message.get("info.ipmute.temporary"); + message.set("expires", DateUtils.getDifferenceFormat(mute.getExpires())); + } + + String dateTimeFormat = Message.getString("info.ipmute.dateTimeFormat"); + + messages.add(message + .set("reason", mute.getReason()) + .set("actor", mute.getActor().getName()) + .set("id", mute.getId()) + .set("created", DateUtils.format(dateTimeFormat, mute.getCreated())) + .toString()); + } + + if (getPlugin().getIpRangeBanStorage().isBanned(ip)) { + IpRangeBanData ban = getPlugin().getIpRangeBanStorage().getBan(ip); + + Message message; + + if (ban.getExpires() == 0) { + message = Message.get("info.iprangeban.permanent"); + } else { + message = Message.get("info.iprangeban.temporary"); + message.set("expires", DateUtils.getDifferenceFormat(ban.getExpires())); + } + + String dateTimeFormat = Message.getString("info.iprangeban.dateTimeFormat"); + + messages.add(message + .set("reason", ban.getReason()) + .set("actor", ban.getActor().getName()) + .set("id", ban.getId()) + .set("created", DateUtils.format(dateTimeFormat, ban.getCreated())) + .set("from", ban.getFromIp().toString()) + .set("to", ban.getToIp().toString()) + .toString()); + } + } + + for (Object message : messages) { + if (message instanceof String) { + sender.sendMessage((String) message); + } else if (message instanceof TextComponent) { + ((CommonPlayer) sender).sendJSONMessage((TextComponent) message); + } else { + getPlugin().getLogger().warning("Invalid info message, please report the following as a bug: " + message.toString()); + } + } + } + + public void playerInfo(CommonSender sender, String name, Integer index, InfoCommandParser parser) throws + SQLException { + List players = getPlugin().getPlayerStorage().retrieve(name); + + if (players == null || players.size() == 0) { + sender.sendMessage(Message.get("sender.error.notFound").set("player", name).toString()); + return; + } + + if (players.size() > 1 && (index == null || index > players.size() || index < 1)) { + Message.get("info.error.indexRequired") + .set("size", players.size()) + .set("name", name) + .sendTo(sender); + + int i = 0; + for (PlayerData player : players) { + i++; + + Message.get("info.error.index") + .set("index", i) + .set("uuid", player.getUUID().toString()) + .set("name", player.getName()) + .sendTo(sender); + } + + return; + } + + if (players.size() == 1) index = 1; + + PlayerData player = players.get(index - 1); + + ArrayList messages = new ArrayList<>(); + + boolean hasFlags = parser.isBans() || parser.isKicks() || parser.isMutes() || parser.isNotes() || parser + .isWarnings() || parser.isReports() || parser.getIps() != null; + + if (hasFlags) { + long since = 0; + + if (parser.getTime() != null && !parser.getTime().isEmpty()) { + try { + since = DateUtils.parseDateDiff(parser.getTime(), false); + } catch (Exception e1) { + sender.sendMessage(Message.get("time.error.invalid").toString()); + return; + } + } + + if (parser.isBans() && !sender.hasPermission("bm.command.bminfo.history.bans")) { + Message.get("sender.error.noPermission").sendTo(sender); + return; + } + + if (parser.isKicks() && !sender.hasPermission("bm.command.bminfo.history.kicks")) { + Message.get("sender.error.noPermission").sendTo(sender); + return; + } + + if (parser.isMutes() && !sender.hasPermission("bm.command.bminfo.history.mutes")) { + Message.get("sender.error.noPermission").sendTo(sender); + return; + } + + if (parser.isNotes() && !sender.hasPermission("bm.command.bminfo.history.notes")) { + Message.get("sender.error.noPermission").sendTo(sender); + return; + } + + if (parser.isReports() && !sender.hasPermission("bm.command.bminfo.history.reports")) { + Message.get("sender.error.noPermission").sendTo(sender); + return; + } + + if (parser.isWarnings() && !sender.hasPermission("bm.command.bminfo.history.warnings")) { + Message.get("sender.error.noPermission").sendTo(sender); + return; + } + + if (parser.getIps() != null) { + if (!sender.hasPermission("bm.command.bminfo.history.ips")) { + Message.get("sender.error.noPermission").sendTo(sender); + return; + } + + int page = parser.getIps() - 1; + + if (page < 0) page = 0; + + handleIpHistory(messages, player, since, page); + } else { + + ArrayList> results; + + if (parser.getTime() != null && !parser.getTime().isEmpty()) { + results = getPlugin().getHistoryStorage().getSince(player, since, parser); + } else { + results = getPlugin().getHistoryStorage().getAll(player, parser); + } + + if (results == null || results.size() == 0) { + Message.get("info.history.noResults").sendTo(sender); + return; + } + + String dateTimeFormat = Message.getString("info.history.dateTimeFormat"); + + for (HashMap result : results) { + Message message = Message.get("info.history.row") + .set("id", (int) result.get("id")) + .set("reason", (String) result.get("reason")) + .set("type", (String) result.get("type")) + .set("created", DateUtils + .format(dateTimeFormat, (long) result.get("created"))) + .set("actor", (String) result.get("actor")) + .set("meta", (String) result.get("meta")); + + messages.add(message.toString()); + } + } + + } else { + + if (sender.hasPermission("bm.command.bminfo.playerstats")) { + long banTotal = getPlugin().getPlayerBanRecordStorage().getCount(player); + long muteTotal = getPlugin().getPlayerMuteRecordStorage().getCount(player); + long warnTotal = getPlugin().getPlayerWarnStorage().getCount(player); + double warnPointsTotal = getPlugin().getPlayerWarnStorage().getPointsCount(player); + long kickTotal = getPlugin().getPlayerKickStorage().getCount(player); + long noteTotal = getPlugin().getPlayerNoteStorage().getCount(player); + long reportTotal = getPlugin().getPlayerReportStorage().getCount(player); + + messages.add(Message.get("info.stats.player") + .set("player", player.getName()) + .set("playerId", player.getUUID().toString()) + .set("bans", Long.toString(banTotal)) + .set("notes", Long.toString(noteTotal)) + .set("mutes", Long.toString(muteTotal)) + .set("warns", Long.toString(warnTotal)) + .set("warnPoints", warnPointsTotal) + .set("kicks", Long.toString(kickTotal)) + .set("reports", Long.toString(reportTotal)) + .toString()); + } + + if (sender.hasPermission("bm.command.bminfo.connection")) { + messages.add(Message.get("info.connection") + .set("player", player.getName()) + .set("ip", player.getIp().toString()) + .set("lastSeen", DateUtils.format("dd-MM-yyyy HH:mm:ss", player.getLastSeen())) + .toString()); + } + + if (getPlugin().getGeoIpConfig().isEnabled() && sender.hasPermission("bm.command.bminfo.geoip")) { + + try { + InetAddress ip = player.getIp().toInetAddress(); + CountryResponse countryResponse = getPlugin().getGeoIpConfig().getCountryDatabase().getCountry(ip); + + if (countryResponse != null) { + String country = countryResponse.getCountry().getName(); + String countryIso = countryResponse.getCountry().getIsoCode(); + String city = ""; + JsonElement cityResponse = getPlugin().getGeoIpConfig().getCityDatabase().get(ip); + + if (cityResponse != null && !cityResponse.isJsonNull()) { + city = cityResponse.getAsJsonObject().get("city").getAsJsonObject().get("names").getAsJsonObject().get("en").getAsString(); + } + + Message message = Message.get("info.geoip"); + + message.set("country", country) + .set("countryIso", countryIso) + .set("city", city); + messages.add(message.toString()); + } + } catch (IOException e) { + e.printStackTrace(); + } + + } + + if (sender.hasPermission("bm.command.bminfo.alts")) { + messages.add(Message.getString("alts.header")); + + List duplicatePlayers = getPlugin().getPlayerStorage().getDuplicatesInTime(player.getIp(), getPlugin().getConfig().getTimeAssociatedAlts()); + + if (!sender.isConsole()) { + messages.add(FindAltsCommand.alts(duplicatePlayers)); + } else { + StringBuilder duplicates = new StringBuilder(); + + for (PlayerData duplicatePlayer : duplicatePlayers) { + duplicates.append(duplicatePlayer.getName()).append(", "); + } + + if (duplicates.length() >= 2) duplicates.setLength(duplicates.length() - 2); + + messages.add(duplicates.toString()); + } + } + + if (sender.hasPermission("bm.command.bminfo.ipstats")) { + + long ipBanTotal = getPlugin().getIpBanRecordStorage().getCount(player.getIp()); + long ipMuteTotal = getPlugin().getIpMuteRecordStorage().getCount(player.getIp()); + long ipRangeBanTotal = getPlugin().getIpRangeBanRecordStorage().getCount(player.getIp()); + + messages.add(Message.get("info.stats.ip") + .set("bans", Long.toString(ipBanTotal)) + .set("mutes", Long.toString(ipMuteTotal)) + .set("rangebans", Long.toString(ipRangeBanTotal)) + .toString()); + + if (getPlugin().getIpBanStorage().isBanned(player.getIp())) { + IpBanData ban = getPlugin().getIpBanStorage().getBan(player.getIp()); + + Message message; + + if (ban.getExpires() == 0) { + message = Message.get("info.ipban.permanent"); + } else { + message = Message.get("info.ipban.temporary"); + message.set("expires", DateUtils.getDifferenceFormat(ban.getExpires())); + } + + String dateTimeFormat = Message.getString("info.ipban.dateTimeFormat"); + + messages.add(message + .set("reason", ban.getReason()) + .set("actor", ban.getActor().getName()) + .set("id", ban.getId()) + .set("created", DateUtils.format(dateTimeFormat, ban.getCreated())) + .toString()); + } + } + + if (getPlugin().getPlayerBanStorage().isBanned(player.getUUID())) { + PlayerBanData ban = getPlugin().getPlayerBanStorage().getBan(player.getUUID()); + + Message message; + + if (ban.getExpires() == 0) { + message = Message.get("info.ban.permanent"); + } else { + message = Message.get("info.ban.temporary"); + message.set("expires", DateUtils.getDifferenceFormat(ban.getExpires())); + } + + String dateTimeFormat = Message.getString("info.ban.dateTimeFormat"); + + messages.add(message + .set("player", player.getName()) + .set("reason", ban.getReason()) + .set("actor", ban.getActor().getName()) + .set("created", DateUtils.format(dateTimeFormat, ban.getCreated())) + .set("id", ban.getId()) + .toString()); + } + + if (getPlugin().getPlayerMuteStorage().isMuted(player.getUUID())) { + PlayerMuteData mute = getPlugin().getPlayerMuteStorage().getMute(player.getUUID()); + + Message message; + + if (mute.getExpires() == 0) { + message = Message.get("info.mute.permanent"); + } else { + message = Message.get("info.mute.temporary"); + message.set("expires", DateUtils.getDifferenceFormat(mute.getExpires())); + } + + String dateTimeFormat = Message.getString("info.mute.dateTimeFormat"); + + messages.add(message + .set("player", player.getName()) + .set("reason", mute.getReason()) + .set("actor", mute.getActor().getName()) + .set("created", DateUtils.format(dateTimeFormat, mute.getCreated())) + .set("id", mute.getId()) + .toString()); + } + + if (sender.hasPermission("bm.command.bminfo.website")) { + String websiteMsg = Message.get("info.website.player") + .set("player", player.getName()) + .set("uuid", player.getUUID().toString()) + .set("playerId", player.getUUID().toString()) + .toString(); + + if (!websiteMsg.isEmpty()) { + if (sender.isConsole()) { + messages.add(websiteMsg); + } else { + TextComponent.Builder message = Component.text(); + message.append(Component.text(websiteMsg).clickEvent(ClickEvent.openUrl(websiteMsg))); + messages.add(message.build()); + } + } + } + } + + // TODO Show last warning + for (Object message : messages) { + if (message instanceof String) { + sender.sendMessage((String) message); + } else if (message instanceof TextComponent) { + ((CommonPlayer) sender).sendJSONMessage((TextComponent) message); + } else { + getPlugin().getLogger().warning("Invalid info message, please report the following as a bug: " + message.toString()); + } + } + } + + private void handleIpHistory(ArrayList messages, PlayerData player, long since, int page) { + CloseableIterator iterator = null; + try { + iterator = getPlugin().getPlayerHistoryStorage().getSince(player, since, page); + + String dateTimeFormat = Message.getString("info.ips.dateTimeFormat"); + + while (iterator.hasNext()) { + PlayerHistoryData data = iterator.next(); + + messages.add(Message.get("info.ips.row") + .set("join", DateUtils.format(dateTimeFormat, data.getJoin())) + .set("leave", DateUtils.format(dateTimeFormat, data.getLeave())) + .set("ip", data.getIp().toString()) + .toString()); + } + } catch (SQLException e) { + e.printStackTrace(); + } finally { + if (iterator != null) iterator.closeQuietly(); + } + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/commands/KickAllCommand.java b/common/src/main/java/me/confuser/banmanager/common/commands/KickAllCommand.java new file mode 100644 index 000000000..cf05f87bb --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/commands/KickAllCommand.java @@ -0,0 +1,101 @@ +package me.confuser.banmanager.common.commands; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.CommonPlayer; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.data.PlayerKickData; +import me.confuser.banmanager.common.util.Message; + +import java.sql.SQLException; + +public class KickAllCommand extends CommonCommand { + + public KickAllCommand(BanManagerPlugin plugin) { + super(plugin, "kickall", true, 0); + } + + @Override + public boolean onCommand(final CommonSender sender, CommandParser parser) { + final boolean isSilent = parser.isSilent(); + + if (parser.isInvalidReason()) { + Message.get("sender.error.invalidReason") + .set("reason", parser.getReason().getMessage()) + .sendTo(sender); + return true; + } + + if (isSilent && !sender.hasPermission(getPermission() + ".silent")) { + sender.sendMessage(Message.getString("sender.error.noPermission")); + return true; + } + + final String reason = parser.args.length > 0 ? parser.getReason().getMessage() : ""; + + getPlugin().getScheduler().runAsync(() -> { + final PlayerData actor = sender.getData(); + + if (actor == null) return; + + CommonPlayer[] onlinePlayers = getPlugin().getServer().getOnlinePlayers(); + + if (getPlugin().getConfig().isKickLoggingEnabled()) { + for (CommonPlayer player : onlinePlayers) { + if (!sender.hasPermission("bm.exempt.override.kick") && player.hasPermission("bm.exempt.kick")) { + continue; + } + + PlayerData playerData = player.getData(); + + if (playerData == null) continue; + + PlayerKickData data = new PlayerKickData(playerData, actor, reason); + + try { + getPlugin().getPlayerKickStorage().addKick(data, isSilent); + } catch (SQLException e) { + sender.sendMessage(Message.get("sender.error.exception").toString()); + e.printStackTrace(); + } + } + } + + + getPlugin().getScheduler().runSync(() -> { + Message message = Message.get(reason.isEmpty() ? "kickall.notify.noReason" : "kickall.notify.reason"); + message.set("actor", actor.getName()).set("reason", reason); + + for (CommonPlayer player : onlinePlayers) { + if (!sender.hasPermission("bm.exempt.override.kick") && player.hasPermission("bm.exempt.kick")) { + continue; + } + + Message kickMessage; + + if (reason.isEmpty()) { + kickMessage = Message.get("kickall.player.noReason"); + } else { + kickMessage = Message.get("kickall.player.reason").set("reason", reason); + } + + kickMessage + .set("displayName", player.getDisplayName()) + .set("player", player.getName()) + .set("playerId", player.getUniqueId().toString()) + .set("actor", actor.getName()); + + player.kick(kickMessage.toString()); + } + + if (isSilent || !sender.hasPermission("bm.notify.kick")) { + message.sendTo(sender); + } + + if (!isSilent) getPlugin().getServer().broadcast(message.toString(), "bm.notify.kick"); + }); + }); + + return true; + } + +} diff --git a/common/src/main/java/me/confuser/banmanager/common/commands/KickCommand.java b/common/src/main/java/me/confuser/banmanager/common/commands/KickCommand.java new file mode 100644 index 000000000..4353bbe29 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/commands/KickCommand.java @@ -0,0 +1,121 @@ +package me.confuser.banmanager.common.commands; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.CommonPlayer; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.data.PlayerKickData; +import me.confuser.banmanager.common.util.Message; + +import java.sql.SQLException; + +public class KickCommand extends CommonCommand { + + public KickCommand(BanManagerPlugin plugin) { + super(plugin, "kick", true); + } + + @Override + public boolean onCommand(final CommonSender sender, CommandParser parser) { + if (parser.args.length < 1 || parser.args[0].isEmpty()) { + return false; + } + + final boolean isSilent = parser.isSilent(); + + if (parser.args.length > 1) { + parser = new CommandParser(getPlugin(), parser.args, 1); + } + + if (parser.isInvalidReason()) { + Message.get("sender.error.invalidReason") + .set("reason", parser.getReason().getMessage()) + .sendTo(sender); + return true; + } + + if (isSilent && !sender.hasPermission(getPermission() + ".silent")) { + sender.sendMessage(Message.getString("sender.error.noPermission")); + return true; + } + + if (parser.args[0].equalsIgnoreCase(sender.getName())) { + sender.sendMessage(Message.getString("sender.error.noSelf")); + return true; + } + + final String playerName = parser.args[0]; + final CommonPlayer player = getPlugin().getServer().getPlayer(playerName); + + if (player == null) { + Message.get("sender.error.offline") + .set("player", playerName) + .sendTo(sender); + + return true; + } else if (!sender.hasPermission("bm.exempt.override.kick") && player.hasPermission("bm.exempt.kick")) { + Message.get("sender.error.exempt").set("player", player.getName()).sendTo(sender); + return true; + } + + final String reason = parser.args.length > 1 ? parser.getReason().getMessage() : ""; + + getPlugin().getScheduler().runAsync(() -> { + final PlayerData actor = sender.getData(); + + if (actor == null) return; + + final Message kickMessage; + + if (reason.isEmpty()) { + kickMessage = Message.get("kick.player.noReason"); + } else { + kickMessage = Message.get("kick.player.reason").set("reason", reason); + } + + kickMessage + .set("displayName", player.getDisplayName()) + .set("player", player.getName()) + .set("playerId", player.getUniqueId().toString()) + .set("actor", actor.getName()); + + getPlugin().getScheduler().runSync(() -> { + Message message = Message.get(reason.isEmpty() ? "kick.notify.noReason" : "kick.notify.reason"); + message.set("player", player.getName()).set("actor", actor.getName()).set("reason", reason); + + player.kick(kickMessage.toString()); + + if (isSilent || !sender.hasPermission("bm.notify.kick")) { + message.sendTo(sender); + } + + if (!isSilent) getPlugin().getServer().broadcast(message.toString(), "bm.notify.kick"); + }); + + if (getPlugin().getConfig().isKickLoggingEnabled()) { + PlayerData player1 = getPlugin().getPlayerStorage().retrieve(playerName, false); + + if (player1 == null) return; + + PlayerKickData data = new PlayerKickData(player1, actor, reason); + + boolean created; + + try { + created = getPlugin().getPlayerKickStorage().addKick(data, isSilent); + } catch (SQLException e) { + sender.sendMessage(Message.get("sender.error.exception").toString()); + e.printStackTrace(); + return; + } + + if (!created) { + return; + } + } + + }); + + return true; + } + +} diff --git a/common/src/main/java/me/confuser/banmanager/common/commands/LoglessKickAllCommand.java b/common/src/main/java/me/confuser/banmanager/common/commands/LoglessKickAllCommand.java new file mode 100644 index 000000000..182fd3660 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/commands/LoglessKickAllCommand.java @@ -0,0 +1,74 @@ +package me.confuser.banmanager.common.commands; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.CommonPlayer; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.util.Message; + +public class LoglessKickAllCommand extends CommonCommand { + + public LoglessKickAllCommand(BanManagerPlugin plugin) { + super(plugin, "nlkickall", true, 0); + } + + @Override + public boolean onCommand(final CommonSender sender, CommandParser parser) { + final boolean isSilent = parser.isSilent(); + + if (parser.isInvalidReason()) { + Message.get("sender.error.invalidReason") + .set("reason", parser.getReason().getMessage()) + .sendTo(sender); + return true; + } + + if (isSilent && !sender.hasPermission(getPermission() + ".silent")) { + sender.sendMessage(Message.getString("sender.error.noPermission")); + return true; + } + + final String reason = parser.args.length > 0 ? parser.getReason().getMessage() : ""; + + getPlugin().getScheduler().runAsync(() -> { + final PlayerData actor = sender.getData(); + + if (actor == null) return; + + getPlugin().getScheduler().runSync(() -> { + Message message = Message.get(reason.isEmpty() ? "kickall.notify.noReason" : "kickall.notify.reason"); + message.set("actor", actor.getName()).set("reason", reason); + + for (CommonPlayer player : getPlugin().getServer().getOnlinePlayers()) { + if (!sender.hasPermission("bm.exempt.override.kick") && player.hasPermission("bm.exempt.kick")) { + continue; + } + + Message kickMessage; + + if (reason.isEmpty()) { + kickMessage = Message.get("kickall.player.noReason"); + } else { + kickMessage = Message.get("kickall.player.reason").set("reason", reason); + } + + kickMessage + .set("displayName", player.getDisplayName()) + .set("player", player.getName()) + .set("playerId", player.getUniqueId().toString()) + .set("actor", actor.getName()); + + player.kick(kickMessage.toString()); + } + + if (isSilent || !sender.hasPermission("bm.notify.kick")) { + message.sendTo(sender); + } + + if (!isSilent) getPlugin().getServer().broadcast(message.toString(), "bm.notify.kick"); + }); + }); + + return true; + } + +} diff --git a/common/src/main/java/me/confuser/banmanager/common/commands/LoglessKickCommand.java b/common/src/main/java/me/confuser/banmanager/common/commands/LoglessKickCommand.java new file mode 100644 index 000000000..699de15e9 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/commands/LoglessKickCommand.java @@ -0,0 +1,96 @@ +package me.confuser.banmanager.common.commands; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.CommonPlayer; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.util.Message; + +public class LoglessKickCommand extends CommonCommand { + + public LoglessKickCommand(BanManagerPlugin plugin) { + super(plugin, "nlkick", true); + } + + @Override + public boolean onCommand(final CommonSender sender, CommandParser parser) { + boolean isSilent; + + if (parser.getArgs().length != 1) { + parser = new CommandParser(getPlugin(), parser.getArgs(), 1); + isSilent = parser.isSilent(); + + if (parser.isInvalidReason()) { + Message.get("sender.error.invalidReason") + .set("reason", parser.getReason().getMessage()) + .sendTo(sender); + return true; + } + } else { + isSilent = false; + } + + if (isSilent && !sender.hasPermission(getPermission() + ".silent")) { + sender.sendMessage(Message.getString("sender.error.noPermission")); + return true; + } + + if (parser.args.length < 1 || parser.args[0].isEmpty()) { + return false; + } + + if (parser.args[0].equalsIgnoreCase(sender.getName())) { + sender.sendMessage(Message.getString("sender.error.noSelf")); + return true; + } + + String playerName = parser.args[0]; + final CommonPlayer player = getPlugin().getServer().getPlayer(playerName); + + if (player == null) { + Message.get("sender.error.offline") + .set("player", playerName) + .sendTo(sender); + + return true; + } else if (!sender.hasPermission("bm.exempt.override.kick") && player.hasPermission("bm.exempt.kick")) { + Message.get("sender.error.exempt").set("player", player.getName()).sendTo(sender); + return true; + } + + final String reason = parser.args.length > 1 ? parser.getReason().getMessage() : ""; + + getPlugin().getScheduler().runAsync(() -> { + final PlayerData actor = sender.getData(); + final Message kickMessage; + + if (reason.isEmpty()) { + kickMessage = Message.get("kick.player.noReason"); + } else { + kickMessage = Message.get("kick.player.reason").set("reason", reason); + } + + kickMessage + .set("displayName", player.getDisplayName()) + .set("player", player.getName()) + .set("playerId", player.getUniqueId().toString()) + .set("actor", actor.getName()); + + getPlugin().getScheduler().runSync((Runnable) () -> { + Message message = Message.get(reason.isEmpty() ? "kick.notify.noReason" : "kick.notify.reason"); + message.set("player", player.getName()).set("actor", actor.getName()).set("reason", reason); + + player.kick(kickMessage.toString()); + + if (isSilent || !sender.hasPermission("bm.notify.kick")) { + message.sendTo(sender); + } + + if (!isSilent) getPlugin().getServer().broadcast(message.toString(), "bm.notify.kick"); + }); + + }); + + return true; + } + +} diff --git a/common/src/main/java/me/confuser/banmanager/common/commands/MultiCommonCommand.java b/common/src/main/java/me/confuser/banmanager/common/commands/MultiCommonCommand.java new file mode 100644 index 000000000..1e9bf56e8 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/commands/MultiCommonCommand.java @@ -0,0 +1,100 @@ +package me.confuser.banmanager.common.commands; + +import lombok.Getter; +import me.confuser.banmanager.common.BanManagerPlugin; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.Vector; + +public abstract class MultiCommonCommand extends CommonCommand { + + @Getter + private HashMap commands = new HashMap<>(); + + // Custom messages, allow whatever is using this to override + private String commandMessage = "BanManager"; + private String commandTypeHelpMessage; + private String commandNoExistMessage = "Command doesn't exist."; + private String errorOccuredMessage = "An error occured while executing the command. Check the console"; + private String noPermissionMessage = "You do not have permission for this command"; + + public MultiCommonCommand(BanManagerPlugin plugin, String commandName) { + super(plugin, commandName, false); + + commandTypeHelpMessage = "Type /" + commandName + " help for help"; + } + + public abstract void registerCommands(); + + public void commandNotFound(CommonSender sender, CommandParser args) { + sender.sendMessage(commandNoExistMessage); + sender.sendMessage(commandTypeHelpMessage); + } + + public void registerCommonSubCommand(CommonSubCommand command) { + commands.put(command.getName(), command); + } + + @Override + public boolean onCommand(CommonSender sender, CommandParser args) { + if (args == null || args.getArgs().length < 1) { + sender.sendMessage(commandMessage); + sender.sendMessage(commandTypeHelpMessage); + return true; + } + + if (args.getArgs()[0].equalsIgnoreCase("help")) { + help(sender); + return true; + } + + String sub = args.getArgs()[0].toLowerCase(); + + // Remove sub from args + Vector vec = new Vector<>(); + vec.addAll(Arrays.asList(args.getArgs())); + vec.remove(0); + String[] subArgs = vec.toArray(new String[0]); + + // Clean up + vec = null; + + if (!commands.containsKey(sub)) { + commandNotFound(sender, args); + return true; + } + try { + CommonSubCommand command = commands.get(sub); + + if (!hasPermission(sender, command)) + sender.sendMessage(noPermissionMessage); + else { + boolean showHelp = command.onCommand(sender, new CommandParser(getPlugin(), subArgs)); + + if (!showHelp && command.getHelp() != null) { + sender.sendMessage("/" + getCommandName() + " " + command.getName() + " " + command.getHelp()); + } + } + } catch (Exception e) { + e.printStackTrace(); + sender.sendMessage(errorOccuredMessage); + sender.sendMessage(commandTypeHelpMessage); + } + return true; + } + + private boolean hasPermission(CommonSender sender, CommonSubCommand command) { + return sender.hasPermission("bm." + command.getPermission()); + } + + public void help(CommonSender p) { + p.sendMessage("/" + getCommandName() + " "); + p.sendMessage("Commands are as follows:"); + + for (CommonSubCommand v : commands.values()) { + if (hasPermission(p, v) && v.getHelp() != null) + p.sendMessage(v.getName() + " " + v.getHelp()); + } + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/commands/MuteCommand.java b/common/src/main/java/me/confuser/banmanager/common/commands/MuteCommand.java new file mode 100644 index 000000000..67c87c541 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/commands/MuteCommand.java @@ -0,0 +1,175 @@ +package me.confuser.banmanager.common.commands; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.CommonPlayer; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.data.PlayerMuteData; +import me.confuser.banmanager.common.util.Message; + +import java.sql.SQLException; +import java.util.UUID; + +public class MuteCommand extends CommonCommand { + + public MuteCommand(BanManagerPlugin plugin) { + super(plugin, "mute", true, 1); + } + + @Override + public boolean onCommand(final CommonSender sender, CommandParser parser) { + final boolean isSilent = parser.isSilent(); + + if (isSilent && !sender.hasPermission(getPermission() + ".silent")) { + sender.sendMessage(Message.getString("sender.error.noPermission")); + return true; + } + + final boolean isSoft = parser.isSoft(); + + if (isSoft && !sender.hasPermission(getPermission() + ".soft")) { + sender.sendMessage(Message.getString("sender.error.noPermission")); + return true; + } + + if (parser.args.length < 2) { + return false; + } + + if (parser.isInvalidReason()) { + Message.get("sender.error.invalidReason") + .set("reason", parser.getReason().getMessage()) + .sendTo(sender); + return true; + } + + if (parser.args[0].equalsIgnoreCase(sender.getName())) { + sender.sendMessage(Message.getString("sender.error.noSelf")); + return true; + } + + // Check if UUID vs name + final String playerName = parser.args[0]; + final boolean isUUID = playerName.length() > 16; + final boolean isMuted; + + if (isUUID) { + try { + isMuted = getPlugin().getPlayerMuteStorage().isMuted(UUID.fromString(playerName)); + } catch (IllegalArgumentException e) { + sender.sendMessage(Message.get("sender.error.notFound").set("player", playerName).toString()); + return true; + } + } else { + isMuted = getPlugin().getPlayerMuteStorage().isMuted(playerName); + } + + if (isMuted && !sender.hasPermission("bm.command.mute.override")) { + Message message = Message.get("mute.error.exists"); + message.set("player", playerName); + + sender.sendMessage(message.toString()); + return true; + } + + CommonPlayer onlinePlayer; + + if (isUUID) { + onlinePlayer = getPlugin().getServer().getPlayer(UUID.fromString(playerName)); + } else { + onlinePlayer = getPlugin().getServer().getPlayer(playerName); + } + + if (onlinePlayer == null) { + if (!sender.hasPermission("bm.command.mute.offline")) { + sender.sendMessage(Message.getString("sender.error.offlinePermission")); + return true; + } + } else if (!sender.hasPermission("bm.exempt.override.mute") && onlinePlayer.hasPermission("bm.exempt.mute")) { + Message.get("sender.error.exempt").set("player", onlinePlayer.getName()).sendTo(sender); + return true; + } + + final Reason reason = parser.getReason(); + + getPlugin().getScheduler().runAsync(() -> { + final PlayerData player = getPlayer(sender, playerName, true); + + if (player == null) { + sender.sendMessage(Message.get("sender.error.notFound").set("player", playerName).toString()); + return; + } + + if (getPlugin().getExemptionsConfig().isExempt(player, "mute")) { + sender.sendMessage(Message.get("sender.error.exempt").set("player", playerName).toString()); + return; + } + + try { + if (getPlugin().getPlayerMuteStorage().isRecentlyMuted(player, getCooldown())) { + Message.get("mute.error.cooldown").sendTo(sender); + return; + } + } catch (SQLException e) { + sender.sendMessage(Message.get("sender.error.exception").toString()); + e.printStackTrace(); + return; + } + + PlayerData actor = sender.getData(); + + if (isMuted) { + PlayerMuteData mute; + + if (isUUID) { + mute = getPlugin().getPlayerMuteStorage().getMute(UUID.fromString(playerName)); + } else { + mute = getPlugin().getPlayerMuteStorage().getMute(playerName); + } + + if (mute != null) { + try { + getPlugin().getPlayerMuteStorage().unmute(mute, actor); + } catch (SQLException e) { + sender.sendMessage(Message.get("sender.error.exception").toString()); + e.printStackTrace(); + return; + } + } + } + + PlayerMuteData mute = new PlayerMuteData(player, actor, reason.getMessage(), isSilent, isSoft); + boolean created; + + try { + created = getPlugin().getPlayerMuteStorage().mute(mute); + } catch (SQLException e) { + handlePunishmentCreateException(e, sender, Message.get("mute.error.exists").set("player", + playerName)); + return; + } + + if (!created) { + return; + } + + handlePrivateNotes(player, actor, reason); + + CommonPlayer commonPlayer = getPlugin().getServer().getPlayer(player.getUUID()); + + if (isSoft || commonPlayer == null) return; + + Message muteMessage = Message.get("mute.player.disallowed") + .set("displayName", commonPlayer.getDisplayName()) + .set("player", player.getName()) + .set("playerId", player.getUUID().toString()) + .set("reason", mute.getReason()) + .set("id", mute.getId()) + .set("actor", actor.getName()); + + commonPlayer.sendMessage(muteMessage.toString()); + }); + + return true; + } + +} diff --git a/common/src/main/java/me/confuser/banmanager/common/commands/MuteIpCommand.java b/common/src/main/java/me/confuser/banmanager/common/commands/MuteIpCommand.java new file mode 100644 index 000000000..44ea62e1b --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/commands/MuteIpCommand.java @@ -0,0 +1,143 @@ +package me.confuser.banmanager.common.commands; + + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.CommonPlayer; +import me.confuser.banmanager.common.data.IpMuteData; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.ipaddr.IPAddress; +import me.confuser.banmanager.common.util.IPUtils; +import me.confuser.banmanager.common.util.Message; + +import java.sql.SQLException; + +public class MuteIpCommand extends CommonCommand { + + public MuteIpCommand(BanManagerPlugin plugin) { + super(plugin, "muteip", false, 1); + } + + @Override + public boolean onCommand(final CommonSender sender, CommandParser parser) { + final boolean isSilent = parser.isSilent(); + + if (isSilent && !sender.hasPermission(getPermission() + ".silent")) { + sender.sendMessage(Message.getString("sender.error.noPermission")); + return true; + } + + final boolean isSoft = parser.isSoft(); + + if (isSoft && !sender.hasPermission(getPermission() + ".soft")) { + sender.sendMessage(Message.getString("sender.error.noPermission")); + return true; + } + + if (parser.args.length < 2) { + return false; + } + + if (parser.isInvalidReason()) { + Message.get("sender.error.invalidReason") + .set("reason", parser.getReason().getMessage()) + .sendTo(sender); + return true; + } + + if (parser.args[0].equalsIgnoreCase(sender.getName())) { + sender.sendMessage(Message.getString("sender.error.noSelf")); + return true; + } + + final String ipStr = parser.args[0]; + final boolean isName = !IPUtils.isValid(ipStr); + + if (isName && ipStr.length() > 16) { + Message message = Message.get("sender.error.invalidIp"); + message.set("ip", ipStr); + + sender.sendMessage(message.toString()); + return true; + } + + if (isName) { + CommonPlayer onlinePlayer = getPlugin().getServer().getPlayer(ipStr); + + if (onlinePlayer != null && !sender.hasPermission("bm.exempt.override.muteip") + && onlinePlayer.hasPermission("bm.exempt.muteip")) { + Message.get("sender.error.exempt").set("player", onlinePlayer.getName()).sendTo(sender); + return true; + } + } + + final String reason = parser.getReason().getMessage(); + + getPlugin().getScheduler().runAsync(() -> { + final IPAddress ip = getIp(ipStr); + + if (ip == null) { + sender.sendMessage(Message.get("sender.error.notFound").set("player", ipStr).toString()); + return; + } + + final boolean isMuted = getPlugin().getIpMuteStorage().isMuted(ip); + + if (isMuted && !sender.hasPermission("bm.command.muteip.override")) { + Message message = Message.get("muteip.error.exists"); + message.set("ip", ipStr); + + sender.sendMessage(message.toString()); + return; + } + + final PlayerData actor = sender.getData(); + + if (actor == null) return; + + if (isMuted) { + IpMuteData mute = getPlugin().getIpMuteStorage().getMute(ip); + + if (mute != null) { + try { + getPlugin().getIpMuteStorage().unmute(mute, actor); + } catch (SQLException e) { + sender.sendMessage(Message.get("sender.error.exception").toString()); + e.printStackTrace(); + return; + } + } + } + + final IpMuteData mute = new IpMuteData(ip, actor, reason, isSilent, isSoft); + boolean created; + + try { + created = getPlugin().getIpMuteStorage().mute(mute); + } catch (SQLException e) { + handlePunishmentCreateException(e, sender, Message.get("muteip.error.exists").set("ip", + ipStr)); + return; + } + + if (!created) return; + if (isSoft) return; + + // Find online players + getPlugin().getScheduler().runSync(() -> { + Message message = Message.get("muteip.ip.disallowed") + .set("reason", mute.getReason()) + .set("id", mute.getId()) + .set("actor", actor.getName()); + + for (CommonPlayer onlinePlayer : getPlugin().getServer().getOnlinePlayers()) { + if (IPUtils.toIPAddress(onlinePlayer.getAddress()).equals(ip)) { + onlinePlayer.sendMessage(message); + } + } + }); + }); + + return true; + } + +} diff --git a/common/src/main/java/me/confuser/banmanager/common/commands/NotesCommand.java b/common/src/main/java/me/confuser/banmanager/common/commands/NotesCommand.java new file mode 100644 index 000000000..b275fd0be --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/commands/NotesCommand.java @@ -0,0 +1,148 @@ +package me.confuser.banmanager.common.commands; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.CommonPlayer; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.data.PlayerNoteData; +import me.confuser.banmanager.common.kyori.text.TextComponent; +import me.confuser.banmanager.common.kyori.text.event.ClickEvent; +import me.confuser.banmanager.common.kyori.text.serializer.legacy.LegacyComponentSerializer; +import me.confuser.banmanager.common.ormlite.dao.CloseableIterator; +import me.confuser.banmanager.common.util.DateUtils; +import me.confuser.banmanager.common.util.Message; +import me.confuser.banmanager.common.util.UUIDUtils; + +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.stream.Collectors; + +public class NotesCommand extends CommonCommand { + + public NotesCommand(BanManagerPlugin plugin) { + super(plugin, "notes", true); + } + + @Override + public boolean onCommand(final CommonSender sender, CommandParser parser) { + if (parser.args.length == 0 && !sender.hasPermission("bm.command.notes.online")) { + Message.get("sender.error.noPermission").sendTo(sender); + return true; + } + + if (parser.args.length > 1) { + return false; + } + + if (parser.args.length == 1) { + final String name = parser.args[0]; + + getPlugin().getScheduler().runAsync(() -> { + PlayerData player = getPlugin().getPlayerStorage().retrieve(name, false); + + if (player == null) { + sender.sendMessage(Message.get("sender.error.notFound").set("player", name).toString()); + return; + } + + CloseableIterator notesItr = null; + + try { + notesItr = getPlugin().getPlayerNoteStorage().getNotes(player.getUUID()); + ArrayList notes = new ArrayList<>(); + String dateTimeFormat = Message.getString("notes.dateTimeFormat"); + + while (notesItr.hasNext()) { + PlayerNoteData note = notesItr.next(); + + Message noteMessage = Message.get("notes.note") + .set("player", note.getActor().getName()) + .set("message", note.getMessage()) + .set("id", note.getId()) + .set("created", DateUtils.format(dateTimeFormat, note.getCreated())); + notes.add(noteMessage); + } + + if (notes.size() == 0) { + Message.get("notes.error.noNotes").set("player", player.getName()).sendTo(sender); + return; + } + + Message header = Message.get("notes.header") + .set("player", player.getName()); + + header.sendTo(sender); + + for (Message message : notes) { + message.sendTo(sender); + } + + } catch (SQLException e) { + e.printStackTrace(); + } finally { + if (notesItr != null) notesItr.closeQuietly(); + } + }); + } else { + getPlugin().getScheduler().runAsync(new Runnable() { + + @Override + public void run() { + CommonPlayer[] onlinePlayers = getPlugin().getServer().getOnlinePlayers(); + + if (onlinePlayers.length == 0) { + Message.get("notes.error.noOnlineNotes").sendTo(sender); + return; + } + + CloseableIterator notesItr = null; + + try { + notesItr = getPlugin().getPlayerNoteStorage() + .queryBuilder() + .where() + .in("player_id", Arrays.stream(onlinePlayers).map(player -> UUIDUtils.toBytes(player + .getUniqueId())).collect(Collectors.toList())) + .iterator(); + ArrayList notes = new ArrayList<>(); + String dateTimeFormat = Message.getString("notes.dateTimeFormat"); + + while (notesItr.hasNext()) { + PlayerNoteData note = notesItr.next(); + + Message noteMessage = Message.get("notes.playerNote") + .set("player", note.getPlayer().getName()) + .set("actor", note.getActor().getName()) + .set("message", note.getMessage()) + .set("id", note.getId()) + .set("created", DateUtils.format(dateTimeFormat, note.getCreated())); + notes.add(noteMessage); + } + + if (notes.size() == 0) { + Message.get("notes.error.noOnlineNotes").sendTo(sender); + return; + } + + for (Message message : notes) { + message.sendTo(sender); + } + + } catch (SQLException e) { + e.printStackTrace(); + } finally { + if (notesItr != null) notesItr.closeQuietly(); + } + } + }); + } + + return true; + } + + public static TextComponent notesAmountMessage(String playerName, Message text) { + return LegacyComponentSerializer.legacy('&').deserialize( + text.set("player", playerName).toString()) + .clickEvent(ClickEvent.runCommand("/notes " + playerName)); + } +} diff --git a/src/main/java/me/confuser/banmanager/util/parsers/Reason.java b/common/src/main/java/me/confuser/banmanager/common/commands/Reason.java similarity index 86% rename from src/main/java/me/confuser/banmanager/util/parsers/Reason.java rename to common/src/main/java/me/confuser/banmanager/common/commands/Reason.java index f2cf30242..bee8c82b8 100644 --- a/src/main/java/me/confuser/banmanager/util/parsers/Reason.java +++ b/common/src/main/java/me/confuser/banmanager/common/commands/Reason.java @@ -1,4 +1,4 @@ -package me.confuser.banmanager.util.parsers; +package me.confuser.banmanager.common.commands; import lombok.Getter; import lombok.Setter; diff --git a/common/src/main/java/me/confuser/banmanager/common/commands/ReasonsCommand.java b/common/src/main/java/me/confuser/banmanager/common/commands/ReasonsCommand.java new file mode 100644 index 000000000..b597ac209 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/commands/ReasonsCommand.java @@ -0,0 +1,24 @@ +package me.confuser.banmanager.common.commands; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.util.Message; + +import java.util.Map; + +public class ReasonsCommand extends CommonCommand { + + public ReasonsCommand(BanManagerPlugin plugin) { + super(plugin, "reasons", false); + } + + @Override + public boolean onCommand(final CommonSender sender, CommandParser parser) { + if (parser.args.length != 0) return false; + + for (Map.Entry entry : getPlugin().getReasonsConfig().getReasons().entrySet()) { + Message.get("reasons.row").set("hashtag", entry.getKey()).set("reason", entry.getValue()).sendTo(sender); + } + + return true; + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/commands/ReloadCommand.java b/common/src/main/java/me/confuser/banmanager/common/commands/ReloadCommand.java new file mode 100644 index 000000000..f8ad114cb --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/commands/ReloadCommand.java @@ -0,0 +1,22 @@ +package me.confuser.banmanager.common.commands; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.util.Message; + +public class ReloadCommand extends CommonCommand { + + public ReloadCommand(BanManagerPlugin plugin) { + super(plugin, "bmreload", false); + } + + @Override + public boolean onCommand(CommonSender sender, CommandParser parser) { + getPlugin().setupConfigs(); + + getPlugin().getServer().callEvent("PluginReloadedEvent", sender.getData()); + + sender.sendMessage(Message.get("configReloaded").toString()); + + return true; + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/commands/ReportCommand.java b/common/src/main/java/me/confuser/banmanager/common/commands/ReportCommand.java new file mode 100644 index 000000000..638a48c1c --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/commands/ReportCommand.java @@ -0,0 +1,108 @@ +package me.confuser.banmanager.common.commands; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.CommonPlayer; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.data.PlayerReportData; +import me.confuser.banmanager.common.util.Message; + +import java.sql.SQLException; +import java.util.UUID; + +public class ReportCommand extends CommonCommand { + + public ReportCommand(BanManagerPlugin plugin) { + super(plugin, "report", true, 1); + } + + @Override + public boolean onCommand(final CommonSender sender, CommandParser parser) { + final boolean isSilent = parser.isSilent(); + + if (isSilent && !sender.hasPermission(getPermission() + ".silent")) { + sender.sendMessage(Message.getString("sender.error.noPermission")); + return true; + } + + if (parser.args.length < 2) { + return false; + } + + if (parser.isInvalidReason()) { + Message.get("sender.error.invalidReason") + .set("reason", parser.getReason().getMessage()) + .sendTo(sender); + return true; + } + + if (parser.args[0].equalsIgnoreCase(sender.getName())) { + sender.sendMessage(Message.getString("sender.error.noSelf")); + return true; + } + + // Check if UUID vs name + final String playerName = parser.args[0]; + final boolean isUUID = playerName.length() > 16; + + CommonPlayer onlinePlayer; + + if (isUUID) { + onlinePlayer = getPlugin().getServer().getPlayer(UUID.fromString(playerName)); + } else { + onlinePlayer = getPlugin().getServer().getPlayer(playerName); + } + + if (onlinePlayer == null) { + if (!sender.hasPermission("bm.command.report.offline")) { + sender.sendMessage(Message.getString("sender.error.offlinePermission")); + return true; + } + } else if (!sender.hasPermission("bm.exempt.override.report") && onlinePlayer.hasPermission("bm.exempt.report")) { + Message.get("sender.error.exempt").set("player", onlinePlayer.getName()).sendTo(sender); + return true; + } + + final String reason = parser.getReason().getMessage(); + + getPlugin().getScheduler().runAsync(() -> { + final PlayerData player = getPlayer(sender, playerName, false); + + if (player == null) { + sender.sendMessage(Message.get("sender.error.notFound").set("player", playerName).toString()); + return; + } + + if (getPlugin().getExemptionsConfig().isExempt(player, "ban")) { + sender.sendMessage(Message.get("sender.error.exempt").set("player", playerName).toString()); + return; + } + + try { + if (getPlugin().getPlayerReportStorage().isRecentlyReported(player, getCooldown())) { + Message.get("report.error.cooldown").sendTo(sender); + return; + } + } catch (SQLException e) { + sender.sendMessage(Message.get("sender.error.exception").toString()); + e.printStackTrace(); + return; + } + + final PlayerData actor = sender.getData(); + + if (actor == null) return; + + try { + PlayerReportData report = new PlayerReportData(player, actor, reason, getPlugin().getReportStateStorage() + .queryForId(1)); + getPlugin().getPlayerReportStorage().report(report, isSilent); + } catch (SQLException e) { + sender.sendMessage(Message.get("sender.error.exception").toString()); + e.printStackTrace(); + } + + }); + + return true; + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/commands/ReportsCommand.java b/common/src/main/java/me/confuser/banmanager/common/commands/ReportsCommand.java new file mode 100644 index 000000000..f640fa295 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/commands/ReportsCommand.java @@ -0,0 +1,33 @@ +package me.confuser.banmanager.common.commands; + + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.commands.report.*; + +public class ReportsCommand extends MultiCommonCommand { + + public ReportsCommand(BanManagerPlugin plugin) { + super(plugin, "reports"); + + registerCommands(); + } + + @Override + public void registerCommands() { + registerCommonSubCommand(new AssignSubCommand(getPlugin())); + registerCommonSubCommand(new CloseSubCommand(getPlugin())); + registerCommonSubCommand(new InfoSubCommand(getPlugin())); + registerCommonSubCommand(new ListSubCommand(getPlugin())); + registerCommonSubCommand(new TeleportSubCommand(getPlugin())); + registerCommonSubCommand(new UnassignSubCommand(getPlugin())); + } + + @Override + public boolean onCommand(final CommonSender sender, CommandParser parser) { + if (parser.args.length == 0 && !sender.isConsole()) return getCommands().get("list").onCommand(sender, parser); + + return super.onCommand(sender, parser); + } + + +} diff --git a/common/src/main/java/me/confuser/banmanager/common/commands/RollbackCommand.java b/common/src/main/java/me/confuser/banmanager/common/commands/RollbackCommand.java new file mode 100644 index 000000000..f3c37572b --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/commands/RollbackCommand.java @@ -0,0 +1,272 @@ +package me.confuser.banmanager.common.commands; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.configs.TimeLimitType; +import me.confuser.banmanager.common.data.*; +import me.confuser.banmanager.common.ormlite.stmt.DeleteBuilder; +import me.confuser.banmanager.common.ormlite.stmt.QueryBuilder; +import me.confuser.banmanager.common.util.DateUtils; +import me.confuser.banmanager.common.util.Message; + +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Arrays; + +public class RollbackCommand extends CommonCommand { + + // Must be ArrayList as needs to execute in this order + private static ArrayList types = new ArrayList() { + + { + add("bans"); + add("banrecords"); + add("ipbans"); + add("ipbanrecords"); + add("ipmutes"); + add("ipmuterecords"); + add("kicks"); + add("mutes"); + add("muterecords"); + add("notes"); + add("reports"); + add("warnings"); + } + }; + + public RollbackCommand(BanManagerPlugin plugin) { + super(plugin, "bmrollback", true); + } + + @Override + public boolean onCommand(final CommonSender sender, CommandParser parser) { + if (parser.args.length < 2) return false; + + long expiresCheck; + + try { + expiresCheck = DateUtils.parseDateDiff(parser.args[1], false); + } catch (Exception e) { + sender.sendMessage(Message.get("time.error.invalid").toString()); + return true; + } + + if (getPlugin().getConfig().getTimeLimits().isPastLimit(sender, TimeLimitType.ROLLBACK, expiresCheck)) { + Message.get("time.error.limit").sendTo(sender); + return true; + } + + final long expires = expiresCheck; + + // Check if UUID vs name + final String playerName = parser.args[0]; + + getPlugin().getScheduler().runAsync(() -> { + final PlayerData player = getPlayer(sender, playerName, false); + + if (player == null) { + sender.sendMessage(Message.get("sender.error.notFound").set("player", playerName).toString()); + return; + } + + ArrayList types = new ArrayList<>(); + + if (parser.args.length == 2) { + for (String type : RollbackCommand.types) { + if (!sender.hasPermission("bm.command.bmrollback." + type)) { + Message.get("sender.error.noPermission").sendTo(sender); + return; + } + } + + types.addAll(RollbackCommand.types); + } else { + for (int i = 2; i < parser.args.length; i++) { + String type = parser.args[2].toLowerCase(); + + if (type.contains(",")) { + types.addAll(Arrays.asList(type.split(","))); + } else { + types.add(type); + } + } + } + + long now = System.currentTimeMillis() / 1000L; + + for (String type : types) { + if (!RollbackCommand.types.contains(type)) { + Message.get("bmrollback.error.invalid").set("type", type).set("types", String.join(",", types)).sendTo(sender); + return; + } else if (sender.hasPermission("bm.command.bmrollback." + type)) { + try { + getPlugin().getRollbackStorage() + .create(new RollbackData(player, sender.getData(), type, expires, now)); + } catch (SQLException e) { + sender.sendMessage(Message.get("sender.error.exception").toString()); + e.printStackTrace(); + return; + } + } + } + + // Forces running in order + // I.e bans must be executed before banrecords etc + for (String type : RollbackCommand.types) { + if (!types.contains(type)) continue; + + // @TODO Transactions for robustness + try { + switch (type) { + case "bans": + DeleteBuilder bans = getPlugin().getPlayerBanStorage().deleteBuilder(); + bans.where().eq("actor_id", player.getId()).and().le("created", now).and().ge("created", expires); + bans.delete(); + break; + + case "banrecords": + QueryBuilder banRecords = getPlugin().getPlayerBanRecordStorage() + .queryBuilder(); + banRecords.where().eq("actor_id", player.getId()).and().le("created", now).and().ge("created", expires); + + for (PlayerBanRecord record : banRecords.query()) { + try { + if (getPlugin().getPlayerBanStorage().retrieveBan(record.getPlayer().getUUID()) == null) { + getPlugin().getPlayerBanStorage().create(new PlayerBanData(record)); + } + + getPlugin().getPlayerBanRecordStorage().delete(record); + } catch (SQLException e) { + sender.sendMessage(Message.get("sender.error.exception").toString()); + e.printStackTrace(); + return; + } + } + + break; + + case "ipbans": + DeleteBuilder ipBans = getPlugin().getIpBanStorage().deleteBuilder(); + ipBans.where().eq("actor_id", player.getId()).and().le("created", now).and().ge("created", expires); + ipBans.delete(); + break; + + case "ipbanrecords": + QueryBuilder ipBanRecords = getPlugin().getIpBanRecordStorage().queryBuilder(); + ipBanRecords.where().eq("actor_id", player.getId()).and().le("created", now).and() + .ge("created", expires); + + for (IpBanRecord record : ipBanRecords.query()) { + try { + if (getPlugin().getIpBanStorage().retrieveBan(record.getIp()) == null) { + getPlugin().getIpBanStorage().create(new IpBanData(record)); + } + + getPlugin().getIpBanRecordStorage().delete(record); + } catch (SQLException e) { + sender.sendMessage(Message.get("sender.error.exception").toString()); + e.printStackTrace(); + return; + } + } + + break; + + case "kicks": + DeleteBuilder kicks = getPlugin().getPlayerKickStorage().deleteBuilder(); + kicks.where().eq("actor_id", player.getId()).and().le("created", now).and().ge("created", expires); + kicks.delete(); + + break; + + case "mutes": + DeleteBuilder mutes = getPlugin().getPlayerMuteStorage().deleteBuilder(); + mutes.where().eq("actor_id", player.getId()).and().le("created", now).and().ge("created", expires); + mutes.delete(); + break; + + case "muterecords": + QueryBuilder muteRecords = getPlugin().getPlayerMuteRecordStorage() + .queryBuilder(); + muteRecords.where().eq("actor_id", player.getId()).and().le("created", now).and() + .ge("created", expires); + + for (PlayerMuteRecord record : muteRecords.query()) { + try { + if (getPlugin().getPlayerMuteStorage().retrieveMute(record.getPlayer().getUUID()) == null) { + getPlugin().getPlayerMuteStorage().create(new PlayerMuteData(record)); + } + + getPlugin().getPlayerMuteRecordStorage().delete(record); + } catch (SQLException e) { + sender.sendMessage(Message.get("sender.error.exception").toString()); + e.printStackTrace(); + return; + } + } + break; + + case "ipmutes": + DeleteBuilder ipMutes = getPlugin().getIpMuteStorage().deleteBuilder(); + ipMutes.where().eq("actor_id", player.getId()).and().le("created", now).and().ge("created", expires); + ipMutes.delete(); + break; + + case "ipmuterecords": + QueryBuilder ipMuteRecords = getPlugin().getIpMuteRecordStorage().queryBuilder(); + ipMuteRecords.where().eq("actor_id", player.getId()).and().le("created", now).and() + .ge("created", expires); + + for (IpMuteRecord record : ipMuteRecords.query()) { + try { + if (getPlugin().getIpMuteStorage().retrieveMute(record.getIp()) == null) { + getPlugin().getIpMuteStorage().create(new IpMuteData(record)); + } + + getPlugin().getIpMuteRecordStorage().delete(record); + } catch (SQLException e) { + sender.sendMessage(Message.get("sender.error.exception").toString()); + e.printStackTrace(); + return; + } + } + break; + + case "notes": + DeleteBuilder notes = getPlugin().getPlayerNoteStorage().deleteBuilder(); + notes.where().eq("actor_id", player.getId()).and().le("created", now).and().ge("created", expires); + notes.delete(); + break; + + case "reports": + QueryBuilder reports = getPlugin().getPlayerReportStorage().queryBuilder(); + reports.where().eq("actor_id", player.getId()).and().le("created", now).and().ge("created", expires); + + for (PlayerReportData record : reports.query()) { + getPlugin().getPlayerReportStorage().deleteById(record.getId()); + } + break; + + case "warnings": + DeleteBuilder warnings = getPlugin().getPlayerWarnStorage().deleteBuilder(); + warnings.where().eq("actor_id", player.getId()).and().le("created", now).and().ge("created", expires); + warnings.delete(); + break; + } + } catch (SQLException e) { + sender.sendMessage(Message.get("sender.error.exception").toString()); + e.printStackTrace(); + return; + } + + Message.get("bmrollback.notify") + .set("type", type) + .set("player", player.getName()) + .set("playerId", player.getUUID().toString()) + .sendTo(sender); + } + }); + + return true; + } + +} diff --git a/common/src/main/java/me/confuser/banmanager/common/commands/SyncCommand.java b/common/src/main/java/me/confuser/banmanager/common/commands/SyncCommand.java new file mode 100644 index 000000000..800bde3fa --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/commands/SyncCommand.java @@ -0,0 +1,61 @@ +package me.confuser.banmanager.common.commands; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.runnables.BmRunnable; +import me.confuser.banmanager.common.util.Message; + +public class SyncCommand extends CommonCommand { + + private final String[] localSync = new String[]{"playerBans", "playerMutes", "ipBans", "ipRangeBans", "expiresCheck"}; + private final String[] globalSync = new String[]{"externalPlayerBans", "externalPlayerMutes", "externalPlayerNotes", + "externalIpBans"}; + + public SyncCommand(BanManagerPlugin plugin) { + super(plugin, "bmsync", false); + } + + @Override + public boolean onCommand(final CommonSender sender, CommandParser parser) { + if (parser.args.length != 1) return false; + + final String type = parser.args[0]; + + if (!type.equals("local") && !type.equals("global")) return false; + + getPlugin().getScheduler().runAsync(() -> { + Message.get("sync.player.started").set("type", type).sendTo(sender); + + if (type.equals("local")) { + handleLocalSync(); + } else { + handleGlobalSync(); + } + + Message.get("sync.player.finished").set("type", type).sendTo(sender); + }); + + return true; + } + + private void handleLocalSync() { + for (String aLocalSync : localSync) { + BmRunnable runner = getPlugin().getSyncRunner().getRunner(aLocalSync); + + if (runner.isRunning()) continue; + + runner.run(); + } + } + + private void handleGlobalSync() { + if (getPlugin().getGlobalPlayerBanStorage() == null) return; + + for (String aGlobalSync : globalSync) { + BmRunnable runner = getPlugin().getSyncRunner().getRunner(aGlobalSync); + + if (runner.isRunning()) continue; + + runner.run(); + } + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/commands/TempBanCommand.java b/common/src/main/java/me/confuser/banmanager/common/commands/TempBanCommand.java new file mode 100644 index 000000000..7c5f85269 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/commands/TempBanCommand.java @@ -0,0 +1,193 @@ +package me.confuser.banmanager.common.commands; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.CommonPlayer; +import me.confuser.banmanager.common.configs.TimeLimitType; +import me.confuser.banmanager.common.data.PlayerBanData; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.util.DateUtils; +import me.confuser.banmanager.common.util.Message; + +import java.sql.SQLException; +import java.util.UUID; + +public class TempBanCommand extends CommonCommand { + + public TempBanCommand(BanManagerPlugin plugin) { + super(plugin, "tempban", true, 2); + } + + @Override + public boolean onCommand(final CommonSender sender, CommandParser parser) { + final boolean isSilent = parser.isSilent(); + + if (isSilent && !sender.hasPermission(getPermission() + ".silent")) { + sender.sendMessage(Message.getString("sender.error.noPermission")); + return true; + } + + if (parser.args.length < 3) { + return false; + } + + if (parser.isInvalidReason()) { + Message.get("sender.error.invalidReason") + .set("reason", parser.getReason().getMessage()) + .sendTo(sender); + return true; + } + + if (parser.args[0].equalsIgnoreCase(sender.getName())) { + sender.sendMessage(Message.getString("sender.error.noSelf")); + return true; + } + + // Check if UUID vs name + final String playerName = parser.args[0]; + final boolean isUUID = playerName.length() > 16; + final boolean isBanned; + + if (isUUID) { + try { + isBanned = getPlugin().getPlayerBanStorage().isBanned(UUID.fromString(playerName)); + } catch (IllegalArgumentException e) { + sender.sendMessage(Message.get("sender.error.notFound").set("player", playerName).toString()); + return true; + } + } else { + isBanned = getPlugin().getPlayerBanStorage().isBanned(playerName); + } + + if (isBanned && !sender.hasPermission("bm.command.tempban.override")) { + Message message = Message.get("ban.error.exists"); + message.set("player", playerName); + + sender.sendMessage(message.toString()); + return true; + } + + final CommonPlayer onlinePlayer; + + if (isUUID) { + onlinePlayer = getPlugin().getServer().getPlayer(UUID.fromString(playerName)); + } else { + onlinePlayer = getPlugin().getServer().getPlayer(playerName); + } + + if (onlinePlayer == null) { + if (!sender.hasPermission("bm.command.tempban.offline")) { + sender.sendMessage(Message.getString("sender.error.offlinePermission")); + return true; + } + } else if (!sender.hasPermission("bm.exempt.override.tempban") && onlinePlayer.hasPermission("bm.exempt.tempban")) { + Message.get("sender.error.exempt").set("player", onlinePlayer.getName()).sendTo(sender); + return true; + } + + long expiresCheck; + + try { + expiresCheck = DateUtils.parseDateDiff(parser.args[1], true); + } catch (Exception e1) { + sender.sendMessage(Message.get("time.error.invalid").toString()); + return true; + } + + if (getPlugin().getConfig().getTimeLimits().isPastLimit(sender, TimeLimitType.PLAYER_BAN, expiresCheck)) { + Message.get("time.error.limit").sendTo(sender); + return true; + } + + final long expires = expiresCheck; + final Reason reason = parser.getReason(); + + getPlugin().getScheduler().runAsync(new Runnable() { + + @Override + public void run() { + final PlayerData player = getPlayer(sender, playerName, true); + + if (player == null) { + sender.sendMessage(Message.get("sender.error.notFound").set("player", playerName).toString()); + return; + } + + if (getPlugin().getExemptionsConfig().isExempt(player, "tempban")) { + sender.sendMessage(Message.get("sender.error.exempt").set("player", playerName).toString()); + return; + } + + try { + if (getPlugin().getPlayerBanStorage().isRecentlyBanned(player, getCooldown())) { + Message.get("ban.error.cooldown").sendTo(sender); + return; + } + } catch (SQLException e) { + sender.sendMessage(Message.get("sender.error.exception").toString()); + e.printStackTrace(); + return; + } + + final PlayerData actor = sender.getData(); + + if (actor == null) return; + + if (isBanned) { + PlayerBanData ban; + + if (isUUID) { + ban = getPlugin().getPlayerBanStorage().getBan(UUID.fromString(playerName)); + } else { + ban = getPlugin().getPlayerBanStorage().getBan(playerName); + } + + if (ban != null) { + try { + getPlugin().getPlayerBanStorage().unban(ban, actor); + } catch (SQLException e) { + sender.sendMessage(Message.get("sender.error.exception").toString()); + e.printStackTrace(); + return; + } + } + } + + final PlayerBanData ban = new PlayerBanData(player, actor, reason.getMessage(), isSilent, expires); + boolean created; + + try { + created = getPlugin().getPlayerBanStorage().ban(ban); + } catch (SQLException e) { + handlePunishmentCreateException(e, sender, Message.get("ban.error.exists").set("player", + playerName)); + return; + } + + if (!created) { + return; + } + + handlePrivateNotes(player, actor, reason); + + getPlugin().getScheduler().runSync(() -> { + if (onlinePlayer == null) return; + + Message kickMessage = Message.get("tempban.player.kick") + .set("displayName", onlinePlayer.getDisplayName()) + .set("player", player.getName()) + .set("playerId", player.getUUID().toString()) + .set("reason", ban.getReason()) + .set("actor", actor.getName()) + .set("id", ban.getId()) + .set("expires", DateUtils.getDifferenceFormat(ban.getExpires())); + + onlinePlayer.kick(kickMessage.toString()); + }); + + } + + }); + + return true; + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/commands/TempIpBanCommand.java b/common/src/main/java/me/confuser/banmanager/common/commands/TempIpBanCommand.java new file mode 100644 index 000000000..b67d0711e --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/commands/TempIpBanCommand.java @@ -0,0 +1,160 @@ +package me.confuser.banmanager.common.commands; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.CommonPlayer; +import me.confuser.banmanager.common.configs.TimeLimitType; +import me.confuser.banmanager.common.data.IpBanData; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.ipaddr.IPAddress; +import me.confuser.banmanager.common.util.DateUtils; +import me.confuser.banmanager.common.util.IPUtils; +import me.confuser.banmanager.common.util.Message; + +import java.sql.SQLException; + +public class TempIpBanCommand extends CommonCommand { + + public TempIpBanCommand(BanManagerPlugin plugin) { + super(plugin, "tempbanip", false, 2); + } + + @Override + public boolean onCommand(final CommonSender sender, CommandParser parser) { + final boolean isSilent = parser.isSilent(); + + if (isSilent && !sender.hasPermission(getPermission() + ".silent")) { + sender.sendMessage(Message.getString("sender.error.noPermission")); + return true; + } + + if (parser.args.length < 3) { + return false; + } + + if (parser.isInvalidReason()) { + Message.get("sender.error.invalidReason") + .set("reason", parser.getReason().getMessage()) + .sendTo(sender); + return true; + } + + final String ipStr = parser.args[0]; + final boolean isName = !IPUtils.isValid(ipStr); + + if (isName && ipStr.length() > 16) { + Message message = Message.get("sender.error.invalidIp"); + message.set("ip", ipStr); + + sender.sendMessage(message.toString()); + return true; + } + + if (isName) { + CommonPlayer onlinePlayer = getPlugin().getServer().getPlayer(ipStr); + + if (onlinePlayer != null && !sender.hasPermission("bm.exempt.override.tempbanip") + && onlinePlayer.hasPermission("bm.exempt.tempbanip")) { + Message.get("sender.error.exempt").set("player", onlinePlayer.getName()).sendTo(sender); + return true; + } + } + + long expiresCheck; + + try { + expiresCheck = DateUtils.parseDateDiff(parser.args[1], true); + } catch (Exception e1) { + sender.sendMessage(Message.get("time.error.invalid").toString()); + return true; + } + + if (getPlugin().getConfig().getTimeLimits().isPastLimit(sender, TimeLimitType.IP_BAN, expiresCheck)) { + Message.get("time.error.limit").sendTo(sender); + return true; + } + + final long expires = expiresCheck; + final String reason = parser.getReason().getMessage(); + + getPlugin().getScheduler().runAsync(() -> { + final IPAddress ip = getIp(ipStr); + + if (ip == null) { + sender.sendMessage(Message.get("sender.error.notFound").set("player", ipStr).toString()); + return; + } + + final boolean isBanned = getPlugin().getIpBanStorage().isBanned(ip); + + if (isBanned && !sender.hasPermission("bm.command.tempbanip.override")) { + Message message = Message.get("banip.error.exists"); + message.set("ip", ipStr); + + sender.sendMessage(message.toString()); + return; + } + + try { + if (getPlugin().getIpBanStorage().isRecentlyBanned(ip, getCooldown())) { + Message.get("banip.error.cooldown").sendTo(sender); + return; + } + } catch (SQLException e) { + sender.sendMessage(Message.get("sender.error.exception").toString()); + e.printStackTrace(); + return; + } + + final PlayerData actor = sender.getData(); + + if (actor == null) return; + + if (isBanned) { + IpBanData ban = getPlugin().getIpBanStorage().getBan(ip); + + if (ban != null) { + try { + getPlugin().getIpBanStorage().unban(ban, actor); + } catch (SQLException e) { + sender.sendMessage(Message.get("sender.error.exception").toString()); + e.printStackTrace(); + return; + } + } + } + + final IpBanData ban = new IpBanData(ip, actor, reason, isSilent, expires); + boolean created; + + try { + created = getPlugin().getIpBanStorage().ban(ban); + } catch (SQLException e) { + handlePunishmentCreateException(e, sender, Message.get("banip.error.exists").set("ip", + ipStr)); + return; + } + + if (!created) { + return; + } + + // Find online players + getPlugin().getScheduler().runSync(() -> { + Message kickMessage = Message.get("tempbanip.ip.kick") + .set("reason", ban.getReason()) + .set("actor", actor.getName()) + .set("id", ban.getId()) + .set("expires", DateUtils.getDifferenceFormat(ban.getExpires())); + + for (CommonPlayer onlinePlayer : getPlugin().getServer().getOnlinePlayers()) { + if (IPUtils.toIPAddress(onlinePlayer.getAddress()).equals(ip)) { + onlinePlayer.kick(kickMessage.toString()); + } + } + }); + + }); + + return true; + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/commands/TempIpMuteCommand.java b/common/src/main/java/me/confuser/banmanager/common/commands/TempIpMuteCommand.java new file mode 100644 index 000000000..bc427dc12 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/commands/TempIpMuteCommand.java @@ -0,0 +1,159 @@ +package me.confuser.banmanager.common.commands; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.CommonPlayer; +import me.confuser.banmanager.common.configs.TimeLimitType; +import me.confuser.banmanager.common.data.IpMuteData; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.ipaddr.IPAddress; +import me.confuser.banmanager.common.util.DateUtils; +import me.confuser.banmanager.common.util.IPUtils; +import me.confuser.banmanager.common.util.Message; + +import java.sql.SQLException; + +public class TempIpMuteCommand extends CommonCommand { + + public TempIpMuteCommand(BanManagerPlugin plugin) { + super(plugin, "tempmuteip", false, 2); + } + + @Override + public boolean onCommand(final CommonSender sender, CommandParser parser) { + final boolean isSilent = parser.isSilent(); + + if (isSilent && !sender.hasPermission(getPermission() + ".silent")) { + sender.sendMessage(Message.getString("sender.error.noPermission")); + return true; + } + + final boolean isSoft = parser.isSoft(); + + if (isSoft && !sender.hasPermission(getPermission() + ".soft")) { + sender.sendMessage(Message.getString("sender.error.noPermission")); + return true; + } + + if (parser.args.length < 3) { + return false; + } + + if (parser.isInvalidReason()) { + Message.get("sender.error.invalidReason") + .set("reason", parser.getReason().getMessage()) + .sendTo(sender); + return true; + } + + if (parser.args[0].equalsIgnoreCase(sender.getName())) { + sender.sendMessage(Message.getString("sender.error.noSelf")); + return true; + } + + final String ipStr = parser.args[0]; + final boolean isName = !IPUtils.isValid(ipStr); + + if (isName && ipStr.length() > 16) { + Message message = Message.get("sender.error.invalidIp"); + message.set("ip", ipStr); + + sender.sendMessage(message.toString()); + return true; + } + + if (isName) { + CommonPlayer onlinePlayer = getPlugin().getServer().getPlayer(ipStr); + + if (onlinePlayer != null && !sender.hasPermission("bm.exempt.override.tempmuteip") + && onlinePlayer.hasPermission("bm.exempt.tempmuteip")) { + Message.get("sender.error.exempt").set("player", onlinePlayer.getName()).sendTo(sender); + return true; + } + } + + long expiresCheck; + + try { + expiresCheck = DateUtils.parseDateDiff(parser.args[1], true); + } catch (Exception e1) { + sender.sendMessage(Message.get("time.error.invalid").toString()); + return true; + } + + if (getPlugin().getConfig().getTimeLimits().isPastLimit(sender, TimeLimitType.IP_MUTE, expiresCheck)) { + Message.get("time.error.limit").sendTo(sender); + return true; + } + + final long expires = expiresCheck; + final String reason = parser.getReason().getMessage(); + + getPlugin().getScheduler().runAsync(() -> { + final IPAddress ip = getIp(ipStr); + + if (ip == null) { + sender.sendMessage(Message.get("sender.error.notFound").set("player", ipStr).toString()); + return; + } + + final boolean isMuted = getPlugin().getIpMuteStorage().isMuted(ip); + + if (isMuted && !sender.hasPermission("bm.command.tempmuteip.override")) { + Message message = Message.get("muteip.error.exists"); + message.set("ip", ipStr); + + sender.sendMessage(message.toString()); + return; + } + + final PlayerData actor = sender.getData(); + + if (actor == null) return; + if (isMuted) { + IpMuteData mute = getPlugin().getIpMuteStorage().getMute(ip); + + if (mute != null) { + try { + getPlugin().getIpMuteStorage().unmute(mute, actor); + } catch (SQLException e) { + sender.sendMessage(Message.get("sender.error.exception").toString()); + e.printStackTrace(); + return; + } + } + } + + final IpMuteData mute = new IpMuteData(ip, actor, reason, isSilent, isSoft, expires); + boolean created; + + try { + created = getPlugin().getIpMuteStorage().mute(mute); + } catch (SQLException e) { + handlePunishmentCreateException(e, sender, Message.get("muteip.error.exists").set("ip", + ipStr)); + return; + } + + if (!created) return; + if (isSoft) return; + + // Find online players + getPlugin().getScheduler().runSync(() -> { + Message message = Message.get("tempmuteip.ip.disallowed") + .set("reason", mute.getReason()) + .set("actor", actor.getName()) + .set("id", mute.getId()) + .set("expires", DateUtils.getDifferenceFormat(mute.getExpires())); + + for (CommonPlayer onlinePlayer : getPlugin().getServer().getOnlinePlayers()) { + if (IPUtils.toIPAddress(onlinePlayer.getAddress()).equals(ip)) { + onlinePlayer.sendMessage(message); + } + } + }); + + }); + + return true; + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/commands/TempIpRangeBanCommand.java b/common/src/main/java/me/confuser/banmanager/common/commands/TempIpRangeBanCommand.java new file mode 100644 index 000000000..3c069e320 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/commands/TempIpRangeBanCommand.java @@ -0,0 +1,114 @@ +package me.confuser.banmanager.common.commands; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.CommonPlayer; +import me.confuser.banmanager.common.configs.TimeLimitType; +import me.confuser.banmanager.common.data.IpRangeBanData; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.ipaddr.IPAddress; +import me.confuser.banmanager.common.ipaddr.IPAddressSeqRange; +import me.confuser.banmanager.common.ipaddr.IPAddressString; +import me.confuser.banmanager.common.util.DateUtils; +import me.confuser.banmanager.common.util.IPUtils; +import me.confuser.banmanager.common.util.Message; + +import java.sql.SQLException; + +public class TempIpRangeBanCommand extends CommonCommand { + + public TempIpRangeBanCommand(BanManagerPlugin plugin) { + super(plugin, "tempbaniprange", false, 2); + } + + @Override + public boolean onCommand(final CommonSender sender, CommandParser parser) { + final boolean isSilent = parser.isSilent(); + + if (isSilent && !sender.hasPermission(getPermission() + ".silent")) { + sender.sendMessage(Message.getString("sender.error.noPermission")); + return true; + } + + if (parser.args.length < 3) { + return false; + } + + if (parser.isInvalidReason()) { + Message.get("sender.error.invalidReason") + .set("reason", parser.getReason().getMessage()) + .sendTo(sender); + return true; + } + + IPAddressString ip = new IPAddressString(parser.args[0]); + + if (!ip.isSequential()) { + Message.get("baniprange.error.invalid").sendTo(sender); + return true; + } + + IPAddressSeqRange range = ip.getSequentialRange(); + + final IPAddress fromIp = range.getLower(); + final IPAddress toIp = range.getUpper(); + + if (getPlugin().getIpRangeBanStorage().isBanned(fromIp) || getPlugin().getIpRangeBanStorage().isBanned(toIp)) { + Message.get("baniprange.error.exists").sendTo(sender); + return true; + } + + long expiresCheck; + + try { + expiresCheck = DateUtils.parseDateDiff(parser.args[1], true); + } catch (Exception e1) { + sender.sendMessage(Message.get("time.error.invalid").toString()); + return true; + } + + if (getPlugin().getConfig().getTimeLimits().isPastLimit(sender, TimeLimitType.IP_BAN, expiresCheck)) { + Message.get("time.error.limit").sendTo(sender); + return true; + } + + final long expires = expiresCheck; + + final String reason = parser.getReason().getMessage(); + + getPlugin().getScheduler().runAsync(() -> { + final PlayerData actor = sender.getData(); + final IpRangeBanData ban = new IpRangeBanData(fromIp, toIp, actor, reason, isSilent, expires); + boolean created; + + try { + created = getPlugin().getIpRangeBanStorage().ban(ban); + } catch (SQLException e) { + handlePunishmentCreateException(e, sender, Message.get("baniprange.error.exists")); + return; + } + + if (!created) { + return; + } + + // Find online players + getPlugin().getScheduler().runSync(() -> { + Message kickMessage = Message.get("tempbaniprange.ip.kick") + .set("reason", ban.getReason()) + .set("actor", actor.getName()) + .set("id", ban.getId()) + .set("expires", DateUtils.getDifferenceFormat(ban.getExpires())); + + for (CommonPlayer onlinePlayer : getPlugin().getServer().getOnlinePlayers()) { + if (ban.inRange(IPUtils.toIPAddress((onlinePlayer.getAddress())))) { + onlinePlayer.kick(kickMessage.toString()); + } + } + }); + }); + + return true; + + } + +} diff --git a/common/src/main/java/me/confuser/banmanager/common/commands/TempMuteCommand.java b/common/src/main/java/me/confuser/banmanager/common/commands/TempMuteCommand.java new file mode 100644 index 000000000..5209c7462 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/commands/TempMuteCommand.java @@ -0,0 +1,198 @@ +package me.confuser.banmanager.common.commands; + + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.CommonPlayer; +import me.confuser.banmanager.common.configs.TimeLimitType; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.data.PlayerMuteData; +import me.confuser.banmanager.common.util.DateUtils; +import me.confuser.banmanager.common.util.Message; + +import java.sql.SQLException; +import java.util.UUID; + +public class TempMuteCommand extends CommonCommand { + + public TempMuteCommand(BanManagerPlugin plugin) { + super(plugin, "tempmute", true, 2); + } + + @Override + public boolean onCommand(final CommonSender sender, CommandParser parser) { + final boolean isSilent = parser.isSilent(); + + if (isSilent && !sender.hasPermission(getPermission() + ".silent")) { + sender.sendMessage(Message.getString("sender.error.noPermission")); + return true; + } + + final boolean isSoft = parser.isSoft(); + + if (isSoft && !sender.hasPermission(getPermission() + ".soft")) { + sender.sendMessage(Message.getString("sender.error.noPermission")); + return true; + } + + if (parser.args.length < 3) { + return false; + } + + if (parser.isInvalidReason()) { + Message.get("sender.error.invalidReason") + .set("reason", parser.getReason().getMessage()) + .sendTo(sender); + return true; + } + + if (parser.args[0].equalsIgnoreCase(sender.getName())) { + sender.sendMessage(Message.getString("sender.error.noSelf")); + return true; + } + + // Check if UUID vs name + final String playerName = parser.args[0]; + final boolean isUUID = playerName.length() > 16; + final boolean isMuted; + + if (isUUID) { + try { + isMuted = getPlugin().getPlayerMuteStorage().isMuted(UUID.fromString(playerName)); + } catch (IllegalArgumentException e) { + sender.sendMessage(Message.get("sender.error.notFound").set("player", playerName).toString()); + return true; + } + } else { + isMuted = getPlugin().getPlayerMuteStorage().isMuted(playerName); + } + + if (isMuted && !sender.hasPermission("bm.command.tempmute.override")) { + Message message = Message.get("mute.error.exists"); + message.set("player", playerName); + + sender.sendMessage(message.toString()); + return true; + } + + CommonPlayer onlinePlayer; + + if (isUUID) { + onlinePlayer = getPlugin().getServer().getPlayer(UUID.fromString(playerName)); + } else { + onlinePlayer = getPlugin().getServer().getPlayer(playerName); + } + + if (onlinePlayer == null) { + if (!sender.hasPermission("bm.command.tempmute.offline")) { + sender.sendMessage(Message.getString("sender.error.offlinePermission")); + return true; + } + } else if (!sender.hasPermission("bm.exempt.override.tempmute") + && onlinePlayer.hasPermission("bm.exempt.tempmute")) { + Message.get("sender.error.exempt").set("player", onlinePlayer.getName()).sendTo(sender); + return true; + } + + long expiresCheck; + + try { + expiresCheck = DateUtils.parseDateDiff(parser.args[1], true); + } catch (Exception e1) { + sender.sendMessage(Message.get("time.error.invalid").toString()); + return true; + } + + if (getPlugin().getConfig().getTimeLimits().isPastLimit(sender, TimeLimitType.PLAYER_MUTE, expiresCheck)) { + Message.get("time.error.limit").sendTo(sender); + return true; + } + + final long expires = expiresCheck; + final Reason reason = parser.getReason(); + + getPlugin().getScheduler().runAsync(() -> { + final PlayerData player = getPlayer(sender, playerName, true); + + if (player == null) { + sender.sendMessage(Message.get("sender.error.notFound").set("player", playerName).toString()); + return; + } + + if (getPlugin().getExemptionsConfig().isExempt(player, "tempmute")) { + sender.sendMessage(Message.get("sender.error.exempt").set("player", playerName).toString()); + return; + } + + try { + if (getPlugin().getPlayerMuteStorage().isRecentlyMuted(player, getCooldown())) { + Message.get("mute.error.cooldown").sendTo(sender); + return; + } + } catch (SQLException e) { + sender.sendMessage(Message.get("sender.error.exception").toString()); + e.printStackTrace(); + return; + } + + final PlayerData actor = sender.getData(); + + if (actor == null) return; + + if (isMuted) { + PlayerMuteData mute; + + if (isUUID) { + mute = getPlugin().getPlayerMuteStorage().getMute(UUID.fromString(playerName)); + } else { + mute = getPlugin().getPlayerMuteStorage().getMute(playerName); + } + + if (mute != null) { + try { + getPlugin().getPlayerMuteStorage().unmute(mute, actor); + } catch (SQLException e) { + sender.sendMessage(Message.get("sender.error.exception").toString()); + e.printStackTrace(); + return; + } + } + } + + PlayerMuteData mute = new PlayerMuteData(player, actor, reason.getMessage(), isSilent, isSoft, expires); + boolean created; + + try { + created = getPlugin().getPlayerMuteStorage().mute(mute); + } catch (SQLException e) { + handlePunishmentCreateException(e, sender, Message.get("mute.error.exists").set("player", + playerName)); + return; + } + + if (!created) { + return; + } + + handlePrivateNotes(player, actor, reason); + + CommonPlayer onlinePlayer1 = getPlugin().getServer().getPlayer(player.getUUID()); + + if (isSoft || onlinePlayer1 == null) return; + + Message muteMessage = Message.get("tempmute.player.disallowed") + .set("displayName", onlinePlayer1.getDisplayName()) + .set("player", player.getName()) + .set("playerId", player.getUUID().toString()) + .set("reason", mute.getReason()) + .set("actor", actor.getName()) + .set("id", mute.getId()) + .set("expires", DateUtils.getDifferenceFormat(mute.getExpires())); + + onlinePlayer1.sendMessage(muteMessage.toString()); + + }); + + return true; + } + +} diff --git a/common/src/main/java/me/confuser/banmanager/common/commands/TempNameBanCommand.java b/common/src/main/java/me/confuser/banmanager/common/commands/TempNameBanCommand.java new file mode 100644 index 000000000..7a3181c20 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/commands/TempNameBanCommand.java @@ -0,0 +1,126 @@ +package me.confuser.banmanager.common.commands; + + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.CommonPlayer; +import me.confuser.banmanager.common.configs.TimeLimitType; +import me.confuser.banmanager.common.data.NameBanData; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.util.DateUtils; +import me.confuser.banmanager.common.util.Message; + +import java.sql.SQLException; + +public class TempNameBanCommand extends CommonCommand { + + public TempNameBanCommand(BanManagerPlugin plugin) { + super(plugin, "tempbanname", true, 2); + } + + @Override + public boolean onCommand(final CommonSender sender, CommandParser parser) { + final boolean isSilent = parser.isSilent(); + + if (isSilent && !sender.hasPermission(getPermission() + ".silent")) { + sender.sendMessage(Message.getString("sender.error.noPermission")); + return true; + } + + if (parser.args.length < 3) { + return false; + } + + if (parser.isInvalidReason()) { + Message.get("sender.error.invalidReason") + .set("reason", parser.getReason().getMessage()) + .sendTo(sender); + return true; + } + + long expiresCheck; + + try { + expiresCheck = DateUtils.parseDateDiff(parser.args[1], true); + } catch (Exception e1) { + sender.sendMessage(Message.get("time.error.invalid").toString()); + return true; + } + + if (getPlugin().getConfig().getTimeLimits().isPastLimit(sender, TimeLimitType.NAME_BAN, expiresCheck)) { + Message.get("time.error.limit").sendTo(sender); + return true; + } + + final String name = parser.args[0]; + final long expires = expiresCheck; + final String reason = parser.getReason().getMessage(); + + getPlugin().getScheduler().runAsync(new Runnable() { + + @Override + public void run() { + final boolean isBanned = getPlugin().getNameBanStorage().isBanned(name); + + if (isBanned && !sender.hasPermission("bm.command.tempbanname.override")) { + Message message = Message.get("banname.error.exists"); + message.set("name", name); + + sender.sendMessage(message.toString()); + return; + } + + final PlayerData actor = sender.getData(); + + if (actor == null) return; + + if (isBanned) { + NameBanData ban = getPlugin().getNameBanStorage().getBan(name); + + if (ban != null) { + try { + getPlugin().getNameBanStorage().unban(ban, actor); + } catch (SQLException e) { + sender.sendMessage(Message.get("sender.error.exception").toString()); + e.printStackTrace(); + return; + } + } + } + + final NameBanData ban = new NameBanData(name, actor, reason, isSilent, expires); + boolean created; + + try { + created = getPlugin().getNameBanStorage().ban(ban); + } catch (SQLException e) { + handlePunishmentCreateException(e, sender, Message.get("banname.error.exists").set("player", + name)); + return; + } + + if (!created) { + return; + } + + // Find online players + getPlugin().getScheduler().runSync(() -> { + Message kickMessage = Message.get("tempbanname.name.kick") + .set("reason", ban.getReason()) + .set("name", name) + .set("id", ban.getId()) + .set("actor", actor.getName()); + + for (CommonPlayer onlinePlayer : getPlugin().getServer().getOnlinePlayers()) { + if (onlinePlayer.getName().equalsIgnoreCase(name)) { + onlinePlayer.kick(kickMessage.toString()); + } + } + }); + + } + + }); + + return true; + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/commands/TempWarnCommand.java b/common/src/main/java/me/confuser/banmanager/common/commands/TempWarnCommand.java new file mode 100644 index 000000000..53b573cee --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/commands/TempWarnCommand.java @@ -0,0 +1,208 @@ +package me.confuser.banmanager.common.commands; + + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.CommonPlayer; +import me.confuser.banmanager.common.configs.ActionCommand; +import me.confuser.banmanager.common.configs.TimeLimitType; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.data.PlayerWarnData; +import me.confuser.banmanager.common.util.DateUtils; +import me.confuser.banmanager.common.util.Message; +import me.confuser.banmanager.common.util.parsers.WarnCommandParser; + +import java.sql.SQLException; +import java.util.List; +import java.util.UUID; + +public class TempWarnCommand extends CommonCommand { + + public TempWarnCommand(BanManagerPlugin plugin) { + super(plugin, "tempwarn", true, WarnCommandParser.class, 2); + } + + @Override + public boolean onCommand(final CommonSender sender, CommandParser originalParser) { + final WarnCommandParser parser = (WarnCommandParser) originalParser; + final String[] parsedArgs = parser.getArgs(); + final boolean isSilent = parser.isSilent(); + + if (isSilent && !sender.hasPermission(getPermission() + ".silent")) { + sender.sendMessage(Message.getString("sender.error.noPermission")); + return true; + } + + if (parser.getPoints() != 1 && !sender.hasPermission(getPermission() + ".points")) { + sender.sendMessage(Message.getString("sender.error.noPermission")); + return true; + } + + if (parsedArgs.length < 3) { + return false; + } + + if (parser.isInvalidReason()) { + Message.get("sender.error.invalidReason") + .set("reason", parser.getReason().getMessage()) + .sendTo(sender); + return true; + } + + if (parsedArgs[0].equalsIgnoreCase(sender.getName())) { + sender.sendMessage(Message.getString("sender.error.noSelf")); + return true; + } + + // Check if UUID vs name + final String playerName = parsedArgs[0]; + final boolean isUUID = playerName.length() > 16; + CommonPlayer onlinePlayer; + + if (isUUID) { + try { + onlinePlayer = getPlugin().getServer().getPlayer(UUID.fromString(playerName)); + } catch (IllegalArgumentException e) { + sender.sendMessage(Message.get("sender.error.notFound").set("player", playerName).toString()); + return true; + } + } else { + onlinePlayer = getPlugin().getServer().getPlayer(playerName); + } + + if (onlinePlayer == null) { + if (!sender.hasPermission("bm.command.tempwarn.offline")) { + sender.sendMessage(Message.getString("sender.error.offlinePermission")); + return true; + } + } else if (!sender.hasPermission("bm.exempt.override.tempwarn") && onlinePlayer + .hasPermission("bm.exempt.tempwarn")) { + Message.get("sender.error.exempt").set("player", onlinePlayer.getName()).sendTo(sender); + return true; + } + + long expiresCheck; + + try { + expiresCheck = DateUtils.parseDateDiff(parsedArgs[1], true); + } catch (Exception e1) { + sender.sendMessage(Message.get("time.error.invalid").toString()); + return true; + } + + if (getPlugin().getConfig().getTimeLimits().isPastLimit(sender, TimeLimitType.PLAYER_WARN, expiresCheck)) { + Message.get("time.error.limit").sendTo(sender); + return true; + } + + final long expires = expiresCheck; + final Reason reason = parser.getReason(); + + getPlugin().getScheduler().runAsync(() -> { + final PlayerData player = getPlayer(sender, playerName, true); + + if (player == null) { + sender.sendMessage(Message.get("sender.error.notFound").set("player", playerName).toString()); + return; + } + + if (getPlugin().getExemptionsConfig().isExempt(player, "tempwarn")) { + sender.sendMessage(Message.get("sender.error.exempt").set("player", playerName).toString()); + return; + } + + try { + if (getPlugin().getPlayerWarnStorage().isRecentlyWarned(player, getCooldown())) { + Message.get("warn.error.cooldown").sendTo(sender); + return; + } + } catch (SQLException e) { + sender.sendMessage(Message.get("sender.error.exception").toString()); + e.printStackTrace(); + return; + } + + final PlayerData actor = sender.getData(); + + if (actor == null) return; + + final PlayerWarnData warning = new PlayerWarnData(player, actor, reason.getMessage(), parser + .getPoints(), onlinePlayer != null, expires); + + boolean created; + + try { + created = getPlugin().getPlayerWarnStorage().addWarning(warning, isSilent); + } catch (SQLException e) { + sender.sendMessage(Message.get("sender.error.exception").toString()); + e.printStackTrace(); + return; + } + + if (!created) { + return; + } + + handlePrivateNotes(player, actor, reason); + + if (onlinePlayer != null) { + Message warningMessage = Message.get("tempwarn.player.warned") + .set("displayName", onlinePlayer.getDisplayName()) + .set("player", player.getName()) + .set("playerId", player.getUUID().toString()) + .set("reason", warning.getReason()) + .set("actor", actor.getName()) + .set("expires", DateUtils.getDifferenceFormat(warning.getExpires())) + .set("id", warning.getId()) + .set("points", parser.getPoints()); + + onlinePlayer.sendMessage(warningMessage.toString()); + } + + Message message = Message.get("tempwarn.notify") + .set("player", player.getName()) + .set("playerId", player.getUUID().toString()) + .set("actor", actor.getName()) + .set("reason", warning.getReason()) + .set("expires", DateUtils.getDifferenceFormat(warning.getExpires())) + .set("id", warning.getId()) + .set("points", parser.getPoints()); + + if (!sender.hasPermission("bm.notify.tempwarn")) { + message.sendTo(sender); + } + + if (!isSilent) getPlugin().getServer().broadcast(message.toString(), "bm.notify.tempwarn"); + + final List actionCommands; + + try { + actionCommands = getPlugin().getConfig().getWarningActions().getCommands(player, getPlugin().getPlayerWarnStorage().getPointsCount(player)); + } catch (SQLException e) { + e.printStackTrace(); + return; + } + + if (actionCommands == null || actionCommands.isEmpty()) { + return; + } + + for (final ActionCommand action : actionCommands) { + + getPlugin().getScheduler().runSyncLater(() -> { + String actionCommand = action.getCommand() + .replace("[player]", player.getName()) + .replace("[playerId]", player.getUUID().toString()) + .replace("[actor]", actor.getName()) + .replace("[reason]", warning.getReason()) + .replace("[expires]", parsedArgs[1]) + .replace("[id]", String.valueOf(warning.getId())) + .replace("[points]", Double.toString(parser.getPoints())); + + getPlugin().getServer().dispatchCommand(getPlugin().getServer().getConsoleSender(), actionCommand); + }, action.getDelay()); + } + }); + + return true; + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/commands/UnbanCommand.java b/common/src/main/java/me/confuser/banmanager/common/commands/UnbanCommand.java new file mode 100644 index 000000000..731bd3826 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/commands/UnbanCommand.java @@ -0,0 +1,115 @@ +package me.confuser.banmanager.common.commands; + + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.data.PlayerBanData; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.util.Message; +import me.confuser.banmanager.common.util.parsers.UnbanCommandParser; + +import java.sql.SQLException; +import java.util.UUID; + +public class UnbanCommand extends CommonCommand { + + public UnbanCommand(BanManagerPlugin plugin) { + super(plugin, "unban", true, UnbanCommandParser.class, 0); + } + + @Override + public boolean onCommand(final CommonSender sender, CommandParser originalParser) { + final UnbanCommandParser parser = (UnbanCommandParser) originalParser; + final boolean isDelete = parser.isDelete(); + + if (isDelete && !sender.hasPermission(getPermission() + ".delete")) { + sender.sendMessage(Message.getString("sender.error.noPermission")); + return true; + } + + if (parser.args.length < 1) { + return false; + } + + // Check if UUID vs name + final String playerName = parser.args[0]; + final boolean isUUID = playerName.length() > 16; + boolean isBanned; + + if (isUUID) { + try { + isBanned = getPlugin().getPlayerBanStorage().isBanned(UUID.fromString(playerName)); + } catch (IllegalArgumentException e) { + sender.sendMessage(Message.get("sender.error.notFound").set("player", playerName).toString()); + return true; + } + } else { + isBanned = getPlugin().getPlayerBanStorage().isBanned(playerName); + } + + if (!isBanned) { + Message message = Message.get("unban.error.noExists"); + message.set("player", playerName); + + sender.sendMessage(message.toString()); + return true; + } + + final String reason = parser.getReason().getMessage(); + + getPlugin().getScheduler().runAsync(() -> { + PlayerBanData ban; + + if (isUUID) { + ban = getPlugin().getPlayerBanStorage().getBan(UUID.fromString(playerName)); + } else { + ban = getPlugin().getPlayerBanStorage().getBan(playerName); + } + + if (ban == null) { + sender.sendMessage(Message.get("sender.error.notFound").set("player", playerName).toString()); + return; + } + + final PlayerData actor = sender.getData(); + + //TODO refactor if async perm check is problem + if (!actor.getUUID().equals(ban.getActor().getUUID()) && !sender.hasPermission("bm.exempt.override.ban") + && sender.hasPermission("bm.command.unban.own")) { + Message.get("unban.error.notOwn").set("player", ban.getPlayer().getName()).sendTo(sender); + return; + } + + boolean unbanned; + + try { + unbanned = getPlugin().getPlayerBanStorage().unban(ban, actor, reason, isDelete); + } catch (SQLException e) { + sender.sendMessage(Message.get("sender.error.exception").toString()); + e.printStackTrace(); + return; + } + + if (!unbanned) { + return; + } + + Message message = Message.get("unban.notify"); + message + .set("player", ban.getPlayer().getName()) + .set("playerId", ban.getPlayer().getUUID().toString()) + .set("actor", actor.getName()) + .set("id", ban.getId()) + .set("reason", reason); + + if (!sender.hasPermission("bm.notify.unban") || parser.isSilent()) { + message.sendTo(sender); + } + + if (!parser.isSilent()) { + getPlugin().getServer().broadcast(message.toString(), "bm.notify.unban"); + } + }); + + return true; + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/commands/UnbanIpCommand.java b/common/src/main/java/me/confuser/banmanager/common/commands/UnbanIpCommand.java new file mode 100644 index 000000000..1018071f1 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/commands/UnbanIpCommand.java @@ -0,0 +1,119 @@ +package me.confuser.banmanager.common.commands; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.data.IpBanData; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.ipaddr.AddressStringException; +import me.confuser.banmanager.common.ipaddr.IPAddress; +import me.confuser.banmanager.common.ipaddr.IPAddressString; +import me.confuser.banmanager.common.util.IPUtils; +import me.confuser.banmanager.common.util.Message; +import me.confuser.banmanager.common.util.parsers.UnbanCommandParser; + +import java.sql.SQLException; + +public class UnbanIpCommand extends CommonCommand { + + public UnbanIpCommand(BanManagerPlugin plugin) { + super(plugin, "unbanip", false, UnbanCommandParser.class, 0); + } + + @Override + public boolean onCommand(final CommonSender sender, CommandParser originalParser) { + final UnbanCommandParser parser = (UnbanCommandParser) originalParser; + final boolean isDelete = parser.isDelete(); + + if (isDelete && !sender.hasPermission(getPermission() + ".delete")) { + sender.sendMessage(Message.getString("sender.error.noPermission")); + return true; + } + + if (parser.args.length < 1) { + return false; + } + + final String ipStr = parser.args[0]; + final boolean isName = !IPUtils.isValid(ipStr); + + if (isName && ipStr.length() > 16) { + Message message = Message.get("sender.error.invalidIp"); + message.set("ip", ipStr); + + sender.sendMessage(message.toString()); + return true; + } + + final String reason = parser.args.length > 1 ? parser.getReason().getMessage() : ""; + + getPlugin().getScheduler().runAsync(() -> { + final IPAddress ip; + + if (isName) { + PlayerData player = getPlugin().getPlayerStorage().retrieve(ipStr, false); + if (player == null) { + sender.sendMessage(Message.get("sender.error.notFound").set("player", ipStr) + .toString()); + return; + } + + ip = player.getIp(); + } else { + try { + ip = new IPAddressString(ipStr).toAddress(); + } catch (AddressStringException e) { + sender.sendMessage(Message.get("sender.error.exception").toString()); + e.printStackTrace(); + return; + } + } + + if (!getPlugin().getIpBanStorage().isBanned(ip)) { + Message message = Message.get("unbanip.error.noExists"); + message.set("ip", ipStr); + + sender.sendMessage(message.toString()); + return; + } + + IpBanData ban = getPlugin().getIpBanStorage().getBan(ip); + PlayerData actor = sender.getData(); + + if (!actor.getUUID().equals(ban.getActor().getUUID()) && !sender.hasPermission("bm.exempt.override.banip") + && sender.hasPermission("bm.command.unbanip.own")) { + Message.get("unbanip.error.notOwn").set("ip", ipStr).sendTo(sender); + return; + } + + boolean unbanned; + + try { + unbanned = getPlugin().getIpBanStorage().unban(ban, actor, reason, isDelete); + } catch (SQLException e) { + sender.sendMessage(Message.get("sender.error.exception").toString()); + e.printStackTrace(); + return; + } + + if (!unbanned) { + return; + } + + Message message = Message.get("unbanip.notify"); + message + .set("ip", ipStr) + .set("actor", actor.getName()) + .set("id", ban.getId()) + .set("reason", reason); + + if (!sender.hasPermission("bm.notify.unbanip") || parser.isSilent()) { + message.sendTo(sender); + } + + if (!parser.isSilent()) { + getPlugin().getServer().broadcast(message.toString(), "bm.notify.unbanip"); + } + }); + + return true; + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/commands/UnbanIpRangeCommand.java b/common/src/main/java/me/confuser/banmanager/common/commands/UnbanIpRangeCommand.java new file mode 100644 index 000000000..2747ac024 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/commands/UnbanIpRangeCommand.java @@ -0,0 +1,107 @@ +package me.confuser.banmanager.common.commands; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.data.IpRangeBanData; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.ipaddr.IPAddress; +import me.confuser.banmanager.common.ipaddr.IPAddressSeqRange; +import me.confuser.banmanager.common.ipaddr.IPAddressString; +import me.confuser.banmanager.common.util.Message; + +import java.sql.SQLException; + +public class UnbanIpRangeCommand extends CommonCommand { + + public UnbanIpRangeCommand(BanManagerPlugin plugin) { + super(plugin, "unbaniprange", false); + } + + @Override + public boolean onCommand(final CommonSender sender, CommandParser parser) { + if (parser.args.length < 1) { + return false; + } + + IPAddressString ip = new IPAddressString(parser.args[0]); + final boolean isName; + + if (!ip.isSequential()) { + isName = true; + } else { + isName = false; + } + + IPAddressSeqRange range = ip.getSequentialRange(); + + if (!isName && range == null) { + Message.get("baniprange.error.invalid").sendTo(sender); + return true; + } + + final String reason = parser.args.length > 1 ? parser.getReason().getMessage() : ""; + + getPlugin().getScheduler().runAsync(() -> { + IPAddress fromIp = range.getLower(); + IPAddress toIp = range.getUpper(); + + if (isName) { + PlayerData player = getPlugin().getPlayerStorage().retrieve(parser.args[0], false); + if (player == null) { + sender.sendMessage(Message.get("sender.error.notFound").set("player", parser.args[0]) + .toString()); + return; + } + + fromIp = player.getIp(); + toIp = player.getIp(); + } + + if (!getPlugin().getIpRangeBanStorage().isBanned(fromIp) && !getPlugin().getIpRangeBanStorage() + .isBanned(toIp)) { + Message message = Message.get("unbanip.error.noExists"); + message.set("ip", parser.args[0]); + + sender.sendMessage(message.toString()); + return; + } + + IpRangeBanData ban = getPlugin().getIpRangeBanStorage().getBan(fromIp); + + if (ban == null) ban = getPlugin().getIpRangeBanStorage().getBan(toIp); + + PlayerData actor = sender.getData(); + + boolean unbanned; + + try { + unbanned = getPlugin().getIpRangeBanStorage().unban(ban, actor, reason); + } catch (SQLException e) { + sender.sendMessage(Message.get("sender.error.exception").toString()); + e.printStackTrace(); + return; + } + + if (!unbanned) { + return; + } + + Message message = Message.get("unbaniprange.notify"); + message + .set("from", ban.getFromIp().toString()) + .set("to", ban.getToIp().toString()) + .set("actor", actor.getName()) + .set("id", ban.getId()) + .set("reason", reason); + + if (!sender.hasPermission("bm.notify.unbaniprange") || parser.isSilent()) { + message.sendTo(sender); + } + + if (!parser.isSilent()) { + getPlugin().getServer().broadcast(message.toString(), "bm.notify.unbaniprange"); + } + }); + + return true; + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/commands/UnbanNameCommand.java b/common/src/main/java/me/confuser/banmanager/common/commands/UnbanNameCommand.java new file mode 100644 index 000000000..eb267ff11 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/commands/UnbanNameCommand.java @@ -0,0 +1,83 @@ +package me.confuser.banmanager.common.commands; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.data.NameBanData; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.util.Message; + +import java.sql.SQLException; + +public class UnbanNameCommand extends CommonCommand { + + public UnbanNameCommand(BanManagerPlugin plugin) { + super(plugin, "unbanname", true); + } + + @Override + public boolean onCommand(final CommonSender sender, CommandParser parser) { + if (parser.args.length < 1) { + return false; + } + + final String name = parser.args[0]; + final String reason; + + if(parser.args.length > 1) { + if(parser.isInvalidReason()) { + Message.get("sender.error.invalidReason") + .set("reason", parser.getReason().getMessage()) + .sendTo(sender); + return true; + } + reason = parser.getReason(1).getMessage(); + } else { + reason = ""; + } + + getPlugin().getScheduler().runAsync(() -> { + if (!getPlugin().getNameBanStorage().isBanned(name)) { + Message message = Message.get("unbanname.error.noExists"); + message.set("name", name); + + sender.sendMessage(message.toString()); + return; + } + + NameBanData ban = getPlugin().getNameBanStorage().getBan(name); + final PlayerData actor = sender.getData(); + + if (actor == null) return; + + boolean unbanned; + + try { + unbanned = getPlugin().getNameBanStorage().unban(ban, actor, reason); + } catch (SQLException e) { + sender.sendMessage(Message.get("sender.error.exception").toString()); + e.printStackTrace(); + return; + } + + if (!unbanned) { + return; + } + + Message message = Message.get("unbanname.notify"); + message + .set("name", name) + .set("actor", actor.getName()) + .set("id", ban.getId()) + .set("reason", reason); + + if (!sender.hasPermission("bm.notify.unbanname") || parser.isSilent()) { + message.sendTo(sender); + } + + if (!parser.isSilent()) { + getPlugin().getServer().broadcast(message.toString(), "bm.notify.unbanname"); + } + }); + + return true; + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/commands/UnmuteCommand.java b/common/src/main/java/me/confuser/banmanager/common/commands/UnmuteCommand.java new file mode 100644 index 000000000..6f82db464 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/commands/UnmuteCommand.java @@ -0,0 +1,139 @@ +package me.confuser.banmanager.common.commands; + + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.CommonPlayer; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.data.PlayerMuteData; +import me.confuser.banmanager.common.util.Message; +import me.confuser.banmanager.common.util.parsers.UnbanCommandParser; + +import java.sql.SQLException; +import java.util.UUID; + +public class UnmuteCommand extends CommonCommand { + + public UnmuteCommand(BanManagerPlugin plugin) { + super(plugin, "unmute", true, UnbanCommandParser.class, 0); + } + + @Override + public boolean onCommand(final CommonSender sender, CommandParser originalParser) { + final UnbanCommandParser parser = (UnbanCommandParser) originalParser; + final boolean isDelete = parser.isDelete(); + + if (isDelete && !sender.hasPermission(getPermission() + ".delete")) { + sender.sendMessage(Message.getString("sender.error.noPermission")); + return true; + } + + if (parser.args.length < 1) { + return false; + } + + // Check if UUID vs name + final String playerName = parser.args[0]; + final boolean isUUID = playerName.length() > 16; + boolean isMuted; + + if (isUUID) { + try { + isMuted = getPlugin().getPlayerMuteStorage().isMuted(UUID.fromString(playerName)); + } catch (IllegalArgumentException e) { + sender.sendMessage(Message.get("sender.error.notFound").set("player", playerName).toString()); + return true; + } + } else { + isMuted = getPlugin().getPlayerMuteStorage().isMuted(playerName); + } + + if (!isMuted) { + Message message = Message.get("unmute.error.noExists"); + message.set("player", playerName); + + sender.sendMessage(message.toString()); + return true; + } + + final String reason = parser.getReason().getMessage(); + + getPlugin().getScheduler().runAsync(new Runnable() { + + @Override + public void run() { + final PlayerMuteData mute; + + if (isUUID) { + mute = getPlugin().getPlayerMuteStorage().getMute(UUID.fromString(playerName)); + } else { + mute = getPlugin().getPlayerMuteStorage().getMute(playerName); + } + + if (mute == null) { + sender.sendMessage(Message.get("sender.error.notFound").set("player", playerName).toString + ()); + return; + } + + final PlayerData actor = sender.getData(); + + //TODO refactor if async perm check is problem + if (!actor.getUUID().equals(mute.getActor().getUUID()) && !sender.hasPermission("bm.exempt.override.mute") + && sender.hasPermission("bm.command.unmute.own")) { + Message.get("unmute.error.notOwn").set("player", mute.getPlayer().getName()).sendTo(sender); + return; + } + + boolean unmuted; + + try { + unmuted = getPlugin().getPlayerMuteStorage().unmute(mute, actor, reason, isDelete); + } catch (SQLException e) { + sender.sendMessage(Message.get("sender.error.exception").toString()); + e.printStackTrace(); + return; + } + + if (!unmuted) { + return; + } + + Message message = Message.get("unmute.notify"); + message + .set("player", mute.getPlayer().getName()) + .set("playerId", mute.getPlayer().getUUID().toString()) + .set("actor", actor.getName()) + .set("id", mute.getId()) + .set("reason", reason); + + if (!sender.hasPermission("bm.notify.unmute") || parser.isSilent()) { + message.sendTo(sender); + } + + if (!parser.isSilent()) { + getPlugin().getServer().broadcast(message.toString(), "bm.notify.unmute"); + } + + getPlugin().getScheduler().runSync(() -> { + CommonPlayer onlinePlayer = getPlugin().getServer().getPlayer(mute.getPlayer().getUUID()); + + if (onlinePlayer == null || mute.isSoft()) return; + if (onlinePlayer.hasPermission("bm.notify.unmute")) return; + + Message.get("unmute.player") + .set("displayName", onlinePlayer.getDisplayName()) + .set("player", mute.getPlayer().getName()) + .set("playerId", mute.getPlayer().getUUID().toString()) + .set("reason", mute.getReason()) + .set("actor", actor.getName()) + .set("id", mute.getId()) + .sendTo(onlinePlayer); + + }); + } + + }); + + return true; + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/commands/UnmuteIpCommand.java b/common/src/main/java/me/confuser/banmanager/common/commands/UnmuteIpCommand.java new file mode 100644 index 000000000..5bb9aa590 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/commands/UnmuteIpCommand.java @@ -0,0 +1,107 @@ +package me.confuser.banmanager.common.commands; + + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.data.IpMuteData; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.ipaddr.IPAddress; +import me.confuser.banmanager.common.util.IPUtils; +import me.confuser.banmanager.common.util.Message; + +import java.sql.SQLException; + +public class UnmuteIpCommand extends CommonCommand { + + public UnmuteIpCommand(BanManagerPlugin plugin) { + super(plugin, "unmuteip", false); + } + + @Override + public boolean onCommand(final CommonSender sender, CommandParser parser) { + if (parser.args.length < 1) { + return false; + } + + final String ipStr = parser.args[0]; + final boolean isName = !IPUtils.isValid(ipStr); + + if (isName && ipStr.length() > 16) { + Message message = Message.get("sender.error.invalidIp"); + message.set("ip", ipStr); + + sender.sendMessage(message.toString()); + return true; + } + + final String reason; + if(parser.args.length > 1) { + if(parser.isInvalidReason()) { + Message.get("sender.error.invalidReason") + .set("reason", parser.getReason().getMessage()) + .sendTo(sender); + return true; + } + reason = parser.getReason(1).getMessage(); + } else { + reason = ""; + } + + getPlugin().getScheduler().runAsync(() -> { + final IPAddress ip = getIp(ipStr); + + if (ip == null) { + sender.sendMessage(Message.get("sender.error.notFound").set("player", ipStr).toString()); + return; + } + + if (!getPlugin().getIpMuteStorage().isMuted(ip)) { + Message message = Message.get("unmuteip.error.noExists"); + message.set("ip", ipStr); + + sender.sendMessage(message.toString()); + return; + } + + IpMuteData mute = getPlugin().getIpMuteStorage().getMute(ip); + final PlayerData actor = sender.getData(); + + if (!actor.getUUID().equals(mute.getActor().getUUID()) && !sender.hasPermission("bm.exempt.override.muteip") + && sender.hasPermission("bm.command.unmuteip.own")) { + Message.get("unmuteip.error.notOwn").set("ip", ipStr).sendTo(sender); + return; + } + + + boolean unmuted; + + try { + unmuted = getPlugin().getIpMuteStorage().unmute(mute, actor, reason); + } catch (SQLException e) { + sender.sendMessage(Message.get("sender.error.exception").toString()); + e.printStackTrace(); + return; + } + + if (!unmuted) { + return; + } + + Message message = Message.get("unmuteip.notify"); + message + .set("ip", ipStr) + .set("actor", actor.getName()) + .set("id", mute.getId()) + .set("reason", reason); + + if (!sender.hasPermission("bm.notify.unmuteip") || parser.isSilent()) { + message.sendTo(sender); + } + + if (!parser.isSilent()) { + getPlugin().getServer().broadcast(message.toString(), "bm.notify.unmuteip"); + } + }); + + return true; + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/commands/UtilsCommand.java b/common/src/main/java/me/confuser/banmanager/common/commands/UtilsCommand.java new file mode 100644 index 000000000..160044adf --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/commands/UtilsCommand.java @@ -0,0 +1,20 @@ +package me.confuser.banmanager.common.commands; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.commands.utils.DuplicatesSubCommand; +import me.confuser.banmanager.common.commands.utils.MissingPlayersSubCommand; + +public class UtilsCommand extends MultiCommonCommand { + + public UtilsCommand(BanManagerPlugin plugin) { + super(plugin, "bmutils"); + + registerCommands(); + } + + @Override + public void registerCommands() { + registerCommonSubCommand(new DuplicatesSubCommand(getPlugin())); + registerCommonSubCommand(new MissingPlayersSubCommand(getPlugin())); + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/commands/WarnCommand.java b/common/src/main/java/me/confuser/banmanager/common/commands/WarnCommand.java new file mode 100644 index 000000000..9a2721143 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/commands/WarnCommand.java @@ -0,0 +1,184 @@ +package me.confuser.banmanager.common.commands; + + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.CommonPlayer; +import me.confuser.banmanager.common.configs.ActionCommand; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.data.PlayerWarnData; +import me.confuser.banmanager.common.util.Message; +import me.confuser.banmanager.common.util.parsers.WarnCommandParser; + +import java.sql.SQLException; +import java.util.List; +import java.util.UUID; + +public class WarnCommand extends CommonCommand { + + public WarnCommand(BanManagerPlugin plugin) { + super(plugin, "warn", true, WarnCommandParser.class, 1); + } + + @Override + public boolean onCommand(final CommonSender sender, CommandParser originalParser) { + final WarnCommandParser parser = (WarnCommandParser) originalParser; + final boolean isSilent = parser.isSilent(); + + if (isSilent && !sender.hasPermission(getPermission() + ".silent")) { + sender.sendMessage(Message.getString("sender.error.noPermission")); + return true; + } + + if (parser.getPoints() != 1 && !sender.hasPermission(getPermission() + ".points")) { + sender.sendMessage(Message.getString("sender.error.noPermission")); + return true; + } + + if (parser.args.length < 2) { + return false; + } + + if (parser.isInvalidReason()) { + Message.get("sender.error.invalidReason") + .set("reason", parser.getReason().getMessage()) + .sendTo(sender); + return true; + } + + if (parser.args[0].equalsIgnoreCase(sender.getName())) { + sender.sendMessage(Message.getString("sender.error.noSelf")); + return true; + } + + // Check if UUID vs name + final String playerName = parser.args[0]; + final boolean isUUID = playerName.length() > 16; + final Reason reason = parser.getReason(); + + CommonPlayer onlinePlayer; + + if (isUUID) { + try { + onlinePlayer = getPlugin().getServer().getPlayer(UUID.fromString(playerName)); + } catch (IllegalArgumentException e) { + sender.sendMessage(Message.get("sender.error.notFound").set("player", playerName).toString()); + return true; + } + } else { + onlinePlayer = getPlugin().getServer().getPlayer(playerName); + } + + if (onlinePlayer == null) { + if (!sender.hasPermission("bm.command.warn.offline")) { + sender.sendMessage(Message.getString("sender.error.offlinePermission")); + return true; + } + } else if (!sender.hasPermission("bm.exempt.override.warn") && onlinePlayer.hasPermission("bm.exempt.warn")) { + Message.get("sender.error.exempt").set("player", onlinePlayer.getName()).sendTo(sender); + return true; + } + + getPlugin().getScheduler().runAsync(() -> { + final PlayerData player = getPlayer(sender, playerName, true); + + if (player == null) { + sender.sendMessage(Message.get("sender.error.notFound").set("player", playerName).toString()); + return; + } + + if (getPlugin().getExemptionsConfig().isExempt(player, "warn")) { + sender.sendMessage(Message.get("sender.error.exempt").set("player", playerName).toString()); + return; + } + + try { + if (getPlugin().getPlayerWarnStorage().isRecentlyWarned(player, getCooldown())) { + Message.get("warn.error.cooldown").sendTo(sender); + return; + } + } catch (SQLException e) { + sender.sendMessage(Message.get("sender.error.exception").toString()); + e.printStackTrace(); + return; + } + + final PlayerData actor = sender.getData(); + + if (actor == null) return; + + final PlayerWarnData warning = new PlayerWarnData(player, actor, reason.getMessage(), parser + .getPoints(), onlinePlayer != null); + + boolean created; + + try { + created = getPlugin().getPlayerWarnStorage().addWarning(warning, isSilent); + } catch (SQLException e) { + sender.sendMessage(Message.get("sender.error.exception").toString()); + e.printStackTrace(); + return; + } + + if (!created) { + return; + } + + handlePrivateNotes(player, actor, reason); + + if (onlinePlayer != null) { + Message warningMessage = Message.get("warn.player.warned") + .set("displayName", onlinePlayer.getDisplayName()) + .set("player", player.getName()) + .set("playerId", player.getUUID().toString()) + .set("reason", warning.getReason()) + .set("actor", actor.getName()) + .set("id", warning.getId()) + .set("points", parser.getPoints()); + + onlinePlayer.sendMessage(warningMessage.toString()); + } + + Message message = Message.get("warn.notify") + .set("player", player.getName()) + .set("playerId", player.getUUID().toString()) + .set("actor", actor.getName()) + .set("reason", warning.getReason()) + .set("id", warning.getId()) + .set("points", parser.getPoints()); + + if (!sender.hasPermission("bm.notify.warn")) { + message.sendTo(sender); + } + + if (!isSilent) getPlugin().getServer().broadcast(message.toString(), "bm.notify.warn"); + + final List actionCommands; + + try { + actionCommands = getPlugin().getConfig().getWarningActions().getCommands(player, getPlugin().getPlayerWarnStorage().getPointsCount(player)); + } catch (SQLException e) { + e.printStackTrace(); + return; + } + + if (actionCommands == null || actionCommands.isEmpty()) { + return; + } + + for (final ActionCommand action : actionCommands) + getPlugin().getScheduler().runSyncLater(() -> { + String actionCommand = action.getCommand() + .replace("[player]", player.getName()) + .replace("[playerId]", player.getUUID().toString()) + .replace("[actor]", actor.getName()) + .replace("[reason]", warning.getReason()) + .replace("[id]", String.valueOf(warning.getId())) + .replace("[points]", Double.toString(parser.getPoints())); + + getPlugin().getServer().dispatchCommand(getPlugin().getServer().getConsoleSender(), actionCommand); + }, action.getDelay()); + }); + + return true; + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/commands/global/AddNoteAllCommand.java b/common/src/main/java/me/confuser/banmanager/common/commands/global/AddNoteAllCommand.java new file mode 100644 index 000000000..1de015c5d --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/commands/global/AddNoteAllCommand.java @@ -0,0 +1,79 @@ +package me.confuser.banmanager.common.commands.global; + + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.commands.CommandParser; +import me.confuser.banmanager.common.commands.CommonCommand; +import me.confuser.banmanager.common.commands.CommonSender; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.data.global.GlobalPlayerNoteData; +import me.confuser.banmanager.common.util.Message; + +import java.sql.SQLException; + +public class AddNoteAllCommand extends CommonCommand { + + public AddNoteAllCommand(BanManagerPlugin plugin) { + super(plugin, "addnoteall", true, 1); + } + + @Override + public boolean onCommand(final CommonSender sender, CommandParser parser) { + if (parser.getArgs().length < 2) { + return false; + } + + if (parser.isInvalidReason()) { + Message.get("sender.error.invalidReason") + .set("reason", parser.getReason().getMessage()) + .sendTo(sender); + return true; + } + + if (parser.getArgs()[0].equalsIgnoreCase(sender.getName())) { + sender.sendMessage(Message.getString("sender.error.noSelf")); + return true; + } + + // Check if UUID vs name + final String playerName = parser.getArgs()[0]; + final String message = parser.getReason().getMessage(); + + getPlugin().getScheduler().runAsync(() -> { + final PlayerData player = getPlayer(sender, playerName, true); + + if (player == null) { + sender.sendMessage(Message.get("sender.error.notFound").set("player", playerName).toString()); + return; + } + + final PlayerData actor = sender.getData(); + + if (actor == null) return; + + final GlobalPlayerNoteData note = new GlobalPlayerNoteData(player, actor, message); + int created; + + try { + created = getPlugin().getGlobalPlayerNoteStorage().create(note); + } catch (SQLException e) { + sender.sendMessage(Message.get("sender.error.exception").toString()); + e.printStackTrace(); + return; + } + + if (created != 1) { + return; + } + + Message.get("addnoteall.notify") + .set("actor", note.getActorName()) + .set("message", note.getMessageColours()) + .set("player", player.getName()) + .set("playerId", player.getUUID().toString()) + .sendTo(sender); + }); + + return true; + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/commands/global/BanAllCommand.java b/common/src/main/java/me/confuser/banmanager/common/commands/global/BanAllCommand.java new file mode 100644 index 000000000..fe79c208e --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/commands/global/BanAllCommand.java @@ -0,0 +1,79 @@ +package me.confuser.banmanager.common.commands.global; + + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.commands.CommandParser; +import me.confuser.banmanager.common.commands.CommonCommand; +import me.confuser.banmanager.common.commands.CommonSender; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.data.global.GlobalPlayerBanData; +import me.confuser.banmanager.common.util.Message; + +import java.sql.SQLException; + +public class BanAllCommand extends CommonCommand { + + public BanAllCommand(BanManagerPlugin plugin) { + super(plugin, "banall", true, 1); + } + + @Override + public boolean onCommand(final CommonSender sender, CommandParser parser) { + if (parser.getArgs().length < 2) { + return false; + } + + if (parser.isInvalidReason()) { + Message.get("sender.error.invalidReason") + .set("reason", parser.getReason().getMessage()) + .sendTo(sender); + return true; + } + + if (parser.getArgs()[0].equalsIgnoreCase(sender.getName())) { + sender.sendMessage(Message.getString("sender.error.noSelf")); + return true; + } + + // Check if UUID vs name + final String playerName = parser.getArgs()[0]; + final String reason = parser.getReason().getMessage(); + + getPlugin().getScheduler().runAsync(() -> { + final PlayerData player = getPlayer(sender, playerName, true); + + if (player == null) { + sender.sendMessage(Message.get("sender.error.notFound").set("player", playerName).toString()); + return; + } + + final PlayerData actor = sender.getData(); + + if (actor == null) return; + + final GlobalPlayerBanData ban = new GlobalPlayerBanData(player, actor, reason); + int created; + + try { + created = getPlugin().getGlobalPlayerBanStorage().create(ban); + } catch (SQLException e) { + sender.sendMessage(Message.get("sender.error.exception").toString()); + e.printStackTrace(); + return; + } + + if (created != 1) { + return; + } + + Message.get("banall.notify") + .set("actor", ban.getActorName()) + .set("reason", ban.getReason()) + .set("player", player.getName()) + .set("playerId", player.getUUID().toString()) + .sendTo(sender); + }); + + return true; + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/commands/global/BanIpAllCommand.java b/common/src/main/java/me/confuser/banmanager/common/commands/global/BanIpAllCommand.java new file mode 100644 index 000000000..e30588f9c --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/commands/global/BanIpAllCommand.java @@ -0,0 +1,77 @@ +package me.confuser.banmanager.common.commands.global; + + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.commands.CommandParser; +import me.confuser.banmanager.common.commands.CommonCommand; +import me.confuser.banmanager.common.commands.CommonSender; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.data.global.GlobalIpBanData; +import me.confuser.banmanager.common.ipaddr.IPAddress; +import me.confuser.banmanager.common.util.IPUtils; +import me.confuser.banmanager.common.util.Message; + +import java.sql.SQLException; + +public class BanIpAllCommand extends CommonCommand { + + public BanIpAllCommand(BanManagerPlugin plugin) { + super(plugin, "banipall", true, 1); + } + + @Override + public boolean onCommand(final CommonSender sender, CommandParser parser) { + if (parser.getArgs().length < 2) { + return false; + } + + if (parser.isInvalidReason()) { + Message.get("sender.error.invalidReason") + .set("reason", parser.getReason().getMessage()) + .sendTo(sender); + return true; + } + + final String ipStr = parser.getArgs()[0]; + final boolean isName = !IPUtils.isValid(ipStr); + + if (isName && ipStr.length() > 16) { + Message message = Message.get("sender.error.invalidIp"); + message.set("ip", ipStr); + + sender.sendMessage(message.toString()); + return true; + } + + final String reason = parser.getReason().getMessage(); + + getPlugin().getScheduler().runAsync(() -> { + final IPAddress ip = getIp(ipStr); + + final PlayerData actor = sender.getData(); + final GlobalIpBanData ban = new GlobalIpBanData(ip, actor, reason); + int created; + + try { + created = getPlugin().getGlobalIpBanStorage().create(ban); + } catch (SQLException e) { + sender.sendMessage(Message.get("sender.error.exception").toString()); + e.printStackTrace(); + return; + } + + if (created != 1) { + return; + } + + Message.get("banipall.notify") + .set("actor", ban.getActorName()) + .set("reason", ban.getReason()) + .set("ip", ipStr) + .sendTo(sender); + }); + + return true; + } + +} diff --git a/common/src/main/java/me/confuser/banmanager/common/commands/global/MuteAllCommand.java b/common/src/main/java/me/confuser/banmanager/common/commands/global/MuteAllCommand.java new file mode 100644 index 000000000..37a0cc38a --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/commands/global/MuteAllCommand.java @@ -0,0 +1,87 @@ +package me.confuser.banmanager.common.commands.global; + + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.commands.CommandParser; +import me.confuser.banmanager.common.commands.CommonCommand; +import me.confuser.banmanager.common.commands.CommonSender; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.data.global.GlobalPlayerMuteData; +import me.confuser.banmanager.common.util.Message; + +import java.sql.SQLException; + +public class MuteAllCommand extends CommonCommand { + + public MuteAllCommand(BanManagerPlugin plugin) { + super(plugin, "muteall", true, 1); + } + + @Override + public boolean onCommand(final CommonSender sender, CommandParser parser) { + final boolean isSoft = parser.isSoft(); + + if (isSoft && !sender.hasPermission(getPermission() + ".soft")) { + sender.sendMessage(Message.getString("sender.error.noPermission")); + return true; + } + + if (parser.getArgs().length < 2) { + return false; + } + + if (parser.isInvalidReason()) { + Message.get("sender.error.invalidReason") + .set("reason", parser.getReason().getMessage()) + .sendTo(sender); + return true; + } + + if (parser.getArgs()[0].equalsIgnoreCase(sender.getName())) { + sender.sendMessage(Message.getString("sender.error.noSelf")); + return true; + } + + // Check if UUID vs name + final String playerName = parser.getArgs()[0]; + final String reason = parser.getReason().getMessage(); + + getPlugin().getScheduler().runAsync(() -> { + final PlayerData player = getPlayer(sender, playerName, true); + + if (player == null) { + sender.sendMessage(Message.get("sender.error.notFound").set("player", playerName).toString()); + return; + } + + final PlayerData actor = sender.getData(); + + if (actor == null) return; + + final GlobalPlayerMuteData ban = new GlobalPlayerMuteData(player, actor, reason, isSoft); + int created; + + try { + created = getPlugin().getGlobalPlayerMuteStorage().create(ban); + } catch (SQLException e) { + sender.sendMessage(Message.get("sender.error.exception").toString()); + e.printStackTrace(); + return; + } + + if (created != 1) { + return; + } + + Message.get("muteall.notify") + .set("actor", ban.getActorName()) + .set("reason", ban.getReason()) + .set("player", player.getName()) + .set("playerId", player.getUUID().toString()) + .sendTo(sender); + }); + + return true; + } + +} diff --git a/common/src/main/java/me/confuser/banmanager/common/commands/global/TempBanAllCommand.java b/common/src/main/java/me/confuser/banmanager/common/commands/global/TempBanAllCommand.java new file mode 100644 index 000000000..df972e79f --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/commands/global/TempBanAllCommand.java @@ -0,0 +1,99 @@ +package me.confuser.banmanager.common.commands.global; + + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.commands.CommandParser; +import me.confuser.banmanager.common.commands.CommonCommand; +import me.confuser.banmanager.common.commands.CommonSender; +import me.confuser.banmanager.common.configs.TimeLimitType; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.data.global.GlobalPlayerBanData; +import me.confuser.banmanager.common.util.DateUtils; +import me.confuser.banmanager.common.util.Message; + +import java.sql.SQLException; + +public class TempBanAllCommand extends CommonCommand { + + public TempBanAllCommand(BanManagerPlugin plugin) { + super(plugin, "tempbanall", true, 2); + } + + @Override + public boolean onCommand(final CommonSender sender, CommandParser parser) { + if (parser.getArgs().length < 3) { + return false; + } + + if (parser.isInvalidReason()) { + Message.get("sender.error.invalidReason") + .set("reason", parser.getReason().getMessage()) + .sendTo(sender); + return true; + } + + if (parser.getArgs()[0].equalsIgnoreCase(sender.getName())) { + sender.sendMessage(Message.getString("sender.error.noSelf")); + return true; + } + + // Check if UUID vs name + final String playerName = parser.getArgs()[0]; + long expiresCheck; + + try { + expiresCheck = DateUtils.parseDateDiff(parser.getArgs()[1], true); + } catch (Exception e1) { + sender.sendMessage(Message.get("time.error.invalid").toString()); + return true; + } + + if (getPlugin().getConfig().getTimeLimits().isPastLimit(sender, TimeLimitType.PLAYER_BAN, expiresCheck)) { + Message.get("time.error.limit").sendTo(sender); + return true; + } + + final long expires = expiresCheck; + + final String reason = parser.getReason().getMessage(); + + getPlugin().getScheduler().runAsync(() -> { + final PlayerData player = getPlayer(sender, playerName, true); + + if (player == null) { + sender.sendMessage(Message.get("sender.error.notFound").set("player", playerName).toString()); + return; + } + + final PlayerData actor = sender.getData(); + + if (actor == null) return; + + final GlobalPlayerBanData ban = new GlobalPlayerBanData(player, actor, reason, expires); + int created; + + try { + created = getPlugin().getGlobalPlayerBanStorage().create(ban); + } catch (SQLException e) { + sender.sendMessage(Message.get("sender.error.exception").toString()); + e.printStackTrace(); + return; + } + + if (created != 1) { + return; + } + + Message.get("tempbanall.notify") + .set("actor", ban.getActorName()) + .set("reason", ban.getReason()) + .set("expires", DateUtils.getDifferenceFormat(ban.getExpires())) + .set("player", player.getName()) + .set("playerId", player.getUUID().toString()) + .sendTo(sender); + }); + + return true; + } + +} diff --git a/common/src/main/java/me/confuser/banmanager/common/commands/global/TempBanIpAllCommand.java b/common/src/main/java/me/confuser/banmanager/common/commands/global/TempBanIpAllCommand.java new file mode 100644 index 000000000..410400e16 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/commands/global/TempBanIpAllCommand.java @@ -0,0 +1,96 @@ +package me.confuser.banmanager.common.commands.global; + + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.commands.CommandParser; +import me.confuser.banmanager.common.commands.CommonCommand; +import me.confuser.banmanager.common.commands.CommonSender; +import me.confuser.banmanager.common.configs.TimeLimitType; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.data.global.GlobalIpBanData; +import me.confuser.banmanager.common.ipaddr.IPAddress; +import me.confuser.banmanager.common.util.DateUtils; +import me.confuser.banmanager.common.util.IPUtils; +import me.confuser.banmanager.common.util.Message; + +import java.sql.SQLException; + +public class TempBanIpAllCommand extends CommonCommand { + + public TempBanIpAllCommand(BanManagerPlugin plugin) { + super(plugin, "tempbanipall", true, 2); + } + + @Override + public boolean onCommand(final CommonSender sender, CommandParser parser) { + if (parser.getArgs().length < 3) { + return false; + } + + if (parser.isInvalidReason()) { + Message.get("sender.error.invalidReason") + .set("reason", parser.getReason().getMessage()) + .sendTo(sender); + return true; + } + + final String ipStr = parser.getArgs()[0]; + final boolean isName = !IPUtils.isValid(ipStr); + + if (isName && ipStr.length() > 16) { + Message message = Message.get("sender.error.invalidIp"); + message.set("ip", ipStr); + + sender.sendMessage(message.toString()); + return true; + } + + long expiresCheck; + + try { + expiresCheck = DateUtils.parseDateDiff(parser.getArgs()[1], true); + } catch (Exception e1) { + sender.sendMessage(Message.get("time.error.invalid").toString()); + return true; + } + + if (getPlugin().getConfig().getTimeLimits().isPastLimit(sender, TimeLimitType.IP_BAN, expiresCheck)) { + Message.get("time.error.limit").sendTo(sender); + return true; + } + + final long expires = expiresCheck; + + final String reason = parser.getReason().getMessage(); + + getPlugin().getScheduler().runAsync(() -> { + final IPAddress ip = getIp(ipStr); + + final PlayerData actor = sender.getData(); + final GlobalIpBanData ban = new GlobalIpBanData(ip, actor, reason, expires); + int created; + + try { + created = getPlugin().getGlobalIpBanStorage().create(ban); + } catch (SQLException e) { + sender.sendMessage(Message.get("sender.error.exception").toString()); + e.printStackTrace(); + return; + } + + if (created != 1) { + return; + } + + Message.get("tempbanipall.notify") + .set("ip", ipStr) + .set("actor", ban.getActorName()) + .set("reason", ban.getReason()) + .set("expires", DateUtils.getDifferenceFormat(ban.getExpires())) + .sendTo(sender); + }); + + return true; + } + +} diff --git a/common/src/main/java/me/confuser/banmanager/common/commands/global/TempMuteAllCommand.java b/common/src/main/java/me/confuser/banmanager/common/commands/global/TempMuteAllCommand.java new file mode 100644 index 000000000..4a1ad527a --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/commands/global/TempMuteAllCommand.java @@ -0,0 +1,103 @@ +package me.confuser.banmanager.common.commands.global; + + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.commands.CommandParser; +import me.confuser.banmanager.common.commands.CommonCommand; +import me.confuser.banmanager.common.commands.CommonSender; +import me.confuser.banmanager.common.configs.TimeLimitType; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.data.global.GlobalPlayerMuteData; +import me.confuser.banmanager.common.util.DateUtils; +import me.confuser.banmanager.common.util.Message; + +import java.sql.SQLException; + +public class TempMuteAllCommand extends CommonCommand { + + public TempMuteAllCommand(BanManagerPlugin plugin) { + super(plugin, "tempmuteall", true, 2); + } + + @Override + public boolean onCommand(final CommonSender sender, CommandParser parser) { + final boolean isSoft = parser.isSoft(); + + if (isSoft && !sender.hasPermission(getPermission() + ".soft")) { + sender.sendMessage(Message.getString("sender.error.noPermission")); + return true; + } + + if (parser.getArgs().length < 3) { + return false; + } + + if (parser.isInvalidReason()) { + Message.get("sender.error.invalidReason") + .set("reason", parser.getReason().getMessage()) + .sendTo(sender); + return true; + } + + if (parser.getArgs()[0].equalsIgnoreCase(sender.getName())) { + sender.sendMessage(Message.getString("sender.error.noSelf")); + return true; + } + + // Check if UUID vs name + final String playerName = parser.getArgs()[0]; + long expiresCheck; + + try { + expiresCheck = DateUtils.parseDateDiff(parser.getArgs()[1], true); + } catch (Exception e1) { + sender.sendMessage(Message.get("invalidTime").toString()); + return true; + } + + if (getPlugin().getConfig().getTimeLimits().isPastLimit(sender, TimeLimitType.PLAYER_MUTE, expiresCheck)) { + Message.get("timeLimitError").sendTo(sender); + return true; + } + + final long expires = expiresCheck; + + final String reason = parser.getReason().getMessage(); + + getPlugin().getScheduler().runAsync(() -> { + final PlayerData player = getPlayer(sender, playerName, true); + + if (player == null) { + sender.sendMessage(Message.get("sender.error.notFound").set("player", playerName).toString()); + return; + } + + final PlayerData actor = sender.getData(); + final GlobalPlayerMuteData mute = new GlobalPlayerMuteData(player, actor, reason, isSoft, expires); + int created; + + try { + created = getPlugin().getGlobalPlayerMuteStorage().create(mute); + } catch (SQLException e) { + sender.sendMessage(Message.get("sender.error.exception").toString()); + e.printStackTrace(); + return; + } + + if (created != 1) { + return; + } + + Message.get("tempmuteall.notify") + .set("actor", mute.getActorName()) + .set("reason", mute.getReason()) + .set("expires", DateUtils.getDifferenceFormat(mute.getExpires())) + .set("player", player.getName()) + .set("playerId", player.getUUID().toString()) + .sendTo(sender); + }); + + return true; + } + +} diff --git a/common/src/main/java/me/confuser/banmanager/common/commands/global/UnbanAllCommand.java b/common/src/main/java/me/confuser/banmanager/common/commands/global/UnbanAllCommand.java new file mode 100644 index 000000000..79c0dfd42 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/commands/global/UnbanAllCommand.java @@ -0,0 +1,87 @@ +package me.confuser.banmanager.common.commands.global; + + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.commands.CommandParser; +import me.confuser.banmanager.common.commands.CommonCommand; +import me.confuser.banmanager.common.commands.CommonSender; +import me.confuser.banmanager.common.data.PlayerBanData; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.data.global.GlobalPlayerBanRecordData; +import me.confuser.banmanager.common.util.Message; + +import java.sql.SQLException; +import java.util.UUID; + +public class UnbanAllCommand extends CommonCommand { + + public UnbanAllCommand(BanManagerPlugin plugin) { + super(plugin, "unbanall", true); + } + + @Override + public boolean onCommand(final CommonSender sender, CommandParser parser) { + if (parser.getArgs().length < 1) { + return false; + } + + // Check if UUID vs name + final String playerName = parser.getArgs()[0]; + final boolean isUUID = playerName.length() > 16; + boolean isBanned; + + if (isUUID) { + isBanned = getPlugin().getPlayerBanStorage().isBanned(UUID.fromString(playerName)); + } else { + isBanned = getPlugin().getPlayerBanStorage().isBanned(playerName); + } + + if (!isBanned) { + Message message = Message.get("unban.error.noExists"); + message.set("player", playerName); + + sender.sendMessage(message.toString()); + return true; + } + + getPlugin().getScheduler().runAsync(() -> { + PlayerBanData ban; + + if (isUUID) { + ban = getPlugin().getPlayerBanStorage().getBan(UUID.fromString(playerName)); + } else { + ban = getPlugin().getPlayerBanStorage().getBan(playerName); + } + + if (ban == null) { + sender.sendMessage(Message.get("sender.error.notFound").set("player", playerName).toString()); + return; + } + + PlayerData actor = sender.getData(); + GlobalPlayerBanRecordData record = new GlobalPlayerBanRecordData(ban.getPlayer(), actor); + + int unbanned; + + try { + unbanned = getPlugin().getGlobalPlayerBanRecordStorage().create(record); + } catch (SQLException e) { + sender.sendMessage(Message.get("errorOccurred").toString()); + e.printStackTrace(); + return; + } + + if (unbanned == 0) { + return; + } + + Message.get("unbanall.notify") + .set("actor", actor.getName()) + .set("player", ban.getPlayer().getName()) + .set("playerId", ban.getPlayer().getUUID().toString()) + .sendTo(sender); + }); + + return true; + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/commands/global/UnbanIpAllCommand.java b/common/src/main/java/me/confuser/banmanager/common/commands/global/UnbanIpAllCommand.java new file mode 100644 index 000000000..d76a41172 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/commands/global/UnbanIpAllCommand.java @@ -0,0 +1,79 @@ +package me.confuser.banmanager.common.commands.global; + + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.commands.CommandParser; +import me.confuser.banmanager.common.commands.CommonCommand; +import me.confuser.banmanager.common.commands.CommonSender; +import me.confuser.banmanager.common.data.IpBanData; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.data.global.GlobalIpBanRecordData; +import me.confuser.banmanager.common.ipaddr.IPAddress; +import me.confuser.banmanager.common.util.IPUtils; +import me.confuser.banmanager.common.util.Message; + +import java.sql.SQLException; + +public class UnbanIpAllCommand extends CommonCommand { + + public UnbanIpAllCommand(BanManagerPlugin plugin) { + super(plugin, "unbanipall", true); + } + + @Override + public boolean onCommand(final CommonSender sender, CommandParser parser) { + if (parser.getArgs().length < 1) { + return false; + } + + // Check if UUID vs name + final String ipStr = parser.getArgs()[0]; + final boolean isName = !IPUtils.isValid(ipStr); + + if (isName && ipStr.length() > 16) { + Message message = Message.get("invalidIp"); + message.set("ip", ipStr); + + sender.sendMessage(message.toString()); + return true; + } + + getPlugin().getScheduler().runAsync(() -> { + final IPAddress ip = getIp(ipStr); + + IpBanData ban = getPlugin().getIpBanStorage().getBan(ip); + + if (ban == null) { + Message message = Message.get("unbanip.error.noExists"); + message.set("ip", ipStr); + + sender.sendMessage(message.toString()); + return; + } + + PlayerData actor = sender.getData(); + GlobalIpBanRecordData record = new GlobalIpBanRecordData(ban.getIp(), actor); + + int unbanned; + + try { + unbanned = getPlugin().getGlobalIpBanRecordStorage().create(record); + } catch (SQLException e) { + sender.sendMessage(Message.get("errorOccurred").toString()); + e.printStackTrace(); + return; + } + + if (unbanned == 0) { + return; + } + + Message.get("unbanipall.notify") + .set("actor", actor.getName()) + .set("ip", ban.getIp().toString()) + .sendTo(sender); + }); + + return true; + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/commands/global/UnmuteAllCommand.java b/common/src/main/java/me/confuser/banmanager/common/commands/global/UnmuteAllCommand.java new file mode 100644 index 000000000..2eee050bd --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/commands/global/UnmuteAllCommand.java @@ -0,0 +1,87 @@ +package me.confuser.banmanager.common.commands.global; + + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.commands.CommandParser; +import me.confuser.banmanager.common.commands.CommonCommand; +import me.confuser.banmanager.common.commands.CommonSender; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.data.PlayerMuteData; +import me.confuser.banmanager.common.data.global.GlobalPlayerMuteRecordData; +import me.confuser.banmanager.common.util.Message; + +import java.sql.SQLException; +import java.util.UUID; + +public class UnmuteAllCommand extends CommonCommand { + + public UnmuteAllCommand(BanManagerPlugin plugin) { + super(plugin, "unmuteall", true); + } + + @Override + public boolean onCommand(final CommonSender sender, CommandParser parser) { + if (parser.getArgs().length < 1) { + return false; + } + + // Check if UUID vs name + final String playerName = parser.getArgs()[0]; + final boolean isUUID = playerName.length() > 16; + boolean isMuted; + + if (isUUID) { + isMuted = getPlugin().getPlayerMuteStorage().isMuted(UUID.fromString(playerName)); + } else { + isMuted = getPlugin().getPlayerMuteStorage().isMuted(playerName); + } + + if (!isMuted) { + Message message = Message.get("unmute.error.noExists"); + message.set("player", playerName); + + sender.sendMessage(message.toString()); + return true; + } + + getPlugin().getScheduler().runAsync(() -> { + PlayerMuteData mute; + + if (isUUID) { + mute = getPlugin().getPlayerMuteStorage().getMute(UUID.fromString(playerName)); + } else { + mute = getPlugin().getPlayerMuteStorage().getMute(playerName); + } + + if (mute == null) { + sender.sendMessage(Message.get("sender.error.notFound").set("player", playerName).toString()); + return; + } + + PlayerData actor = sender.getData(); + GlobalPlayerMuteRecordData record = new GlobalPlayerMuteRecordData(mute.getPlayer(), actor); + + int unmuted; + + try { + unmuted = getPlugin().getGlobalPlayerMuteRecordStorage().create(record); + } catch (SQLException e) { + sender.sendMessage(Message.get("errorOccurred").toString()); + e.printStackTrace(); + return; + } + + if (unmuted == 0) { + return; + } + + Message.get("unmuteall.notify") + .set("actor", actor.getName()) + .set("player", mute.getPlayer().getName()) + .set("playerId", mute.getPlayer().getUUID().toString()) + .sendTo(sender); + }); + + return true; + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/commands/report/AssignSubCommand.java b/common/src/main/java/me/confuser/banmanager/common/commands/report/AssignSubCommand.java new file mode 100644 index 000000000..7df56a41f --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/commands/report/AssignSubCommand.java @@ -0,0 +1,123 @@ +package me.confuser.banmanager.common.commands.report; + + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.CommonPlayer; +import me.confuser.banmanager.common.commands.CommandParser; +import me.confuser.banmanager.common.commands.CommonSender; +import me.confuser.banmanager.common.commands.CommonSubCommand; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.data.PlayerReportData; +import me.confuser.banmanager.common.util.Message; +import me.confuser.banmanager.common.util.UUIDUtils; + +import java.sql.SQLException; + +public class AssignSubCommand extends CommonSubCommand { + + public AssignSubCommand(BanManagerPlugin plugin) { + super(plugin, "assign"); + } + + @Override + public boolean onCommand(final CommonSender sender, final CommandParser parser) { + if (parser.getArgs().length == 0) return false; + if (sender.isConsole() && parser.getArgs().length != 2) return false; + + if (parser.getArgs().length != 1 && !sender.hasPermission("bm.command.report.assign.other")) { + Message.get("sender.error.noPermission").sendTo(sender); + return true; + } + + final Integer id; + + try { + id = Integer.parseInt(parser.getArgs()[0]); + } catch (NumberFormatException e) { + Message.get("report.tp.error.invalidId").set("id", parser.getArgs()[0]).sendTo(sender); + return true; + } + + getPlugin().getScheduler().runAsync(() -> { + final PlayerReportData data; + + try { + data = getPlugin().getPlayerReportStorage().queryForId(id); + } catch (SQLException e) { + sender.sendMessage(Message.getString("sender.error.exception")); + e.printStackTrace(); + return; + } + + if (data == null) { + sender.sendMessage(Message.getString("report.error.notFound")); + return; + } + + final PlayerData player; + if (parser.getArgs().length == 2) { + player = getPlugin().getPlayerStorage().retrieve(parser.getArgs()[1], false); + } else { + try { + player = getPlugin().getPlayerStorage().queryForId(UUIDUtils.toBytes(sender.getData().getUUID())); + } catch (SQLException e) { + sender.sendMessage(Message.getString("sender.error.exception")); + e.printStackTrace(); + return; + } + } + + if (player == null) { + sender.sendMessage(Message.get("sender.error.notFound").toString()); + return; + } + + data.setAssignee(player); + + try { + data.setState(getPlugin().getReportStateStorage().queryForId(2)); + getPlugin().getPlayerReportStorage().update(data); + } catch (SQLException e) { + sender.sendMessage(Message.getString("sender.error.exception")); + e.printStackTrace(); + return; + } + + Message.get("report.assign.player") + .set("id", data.getId()) + .set("player", player.getName()) + .sendTo(sender); + + getPlugin().getScheduler().runSync(new Runnable() { + + @Override + public void run() { + CommonPlayer bukkitPlayer = getPlugin().getServer().getPlayer(player.getUUID()); + + if (bukkitPlayer == null || !bukkitPlayer.isOnline()) return; + + Message.get("report.assign.notify") + .set("id", data.getId()) + .set("displayName", bukkitPlayer.getDisplayName()) + .set("player", player.getName()) + .set("playerId", player.getUUID().toString()) + .set("reason", data.getReason()) + .set("actor", sender.getName()).sendTo(bukkitPlayer); + + } + }); + }); + + return true; + } + + @Override + public String getHelp() { + return " [player]"; + } + + @Override + public String getPermission() { + return "command.reports.assign"; + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/commands/report/CloseSubCommand.java b/common/src/main/java/me/confuser/banmanager/common/commands/report/CloseSubCommand.java new file mode 100644 index 000000000..99d28602d --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/commands/report/CloseSubCommand.java @@ -0,0 +1,139 @@ +package me.confuser.banmanager.common.commands.report; + + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.commands.CommandParser; +import me.confuser.banmanager.common.commands.CommonSender; +import me.confuser.banmanager.common.commands.CommonSubCommand; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.data.PlayerReportCommandData; +import me.confuser.banmanager.common.data.PlayerReportCommentData; +import me.confuser.banmanager.common.data.PlayerReportData; +import me.confuser.banmanager.common.util.Message; +import me.confuser.banmanager.common.util.StringUtils; + +import java.sql.SQLException; + +public class CloseSubCommand extends CommonSubCommand { + + public CloseSubCommand(BanManagerPlugin plugin) { + super(plugin, "close"); + } + + @Override + public boolean onCommand(final CommonSender sender, final CommandParser parser) { + if (parser.getArgs().length == 0) return false; + + final int id; + + try { + id = Integer.parseInt(parser.getArgs()[0]); + } catch (NumberFormatException e) { + Message.get("report.tp.error.invalidId").set("id", parser.getArgs()[0]).sendTo(sender); + return true; + } + + getPlugin().getScheduler().runAsync(() -> { + final PlayerReportData data; + + try { + data = getPlugin().getPlayerReportStorage().queryForId(id); + } catch (SQLException e) { + sender.sendMessage(Message.getString("sender.error.exception")); + e.printStackTrace(); + return; + } + + if (data == null) { + sender.sendMessage(Message.getString("report.tp.error.notFound")); + return; + } + + try { + data.setState(getPlugin().getReportStateStorage().queryForId(4)); + getPlugin().getPlayerReportStorage().update(data); + } catch (SQLException e) { + sender.sendMessage(Message.getString("sender.error.exception")); + e.printStackTrace(); + return; + } + + if (parser.getArgs().length == 1) { + String message = Message.get("report.close.notify.closed") + .set("actor", sender.getName()) + .set("id", data.getId()) + .toString(); + + getPlugin().getServer().broadcast(message, "bm.notify.report.closed", sender); + return; + } + + PlayerData actor = sender.getData(); + + if (parser.getArgs()[1].startsWith("/")) { + PlayerReportCommandData commandData = new PlayerReportCommandData(data, actor, parser.getArgs()[1] + .substring(1), StringUtils.join(parser.getArgs(), " ", 2, parser.getArgs().length)); + + final String command = StringUtils.join(parser.getArgs(), " ", 1, parser.getArgs().length); + + // Run command as actor + getPlugin().getScheduler().runSync(() -> { + Message.get("report.close.dispatch").set("command", command).sendTo(sender); + getPlugin().getServer().dispatchCommand(sender, command.substring(1)); + }); + + try { + getPlugin().getPlayerReportCommandStorage().create(commandData); + } catch (SQLException e) { + sender.sendMessage(Message.getString("sender.error.exception")); + e.printStackTrace(); + return; + } + + String message = Message.get("report.close.notify.command") + .set("actor", sender.getName()) + .set("id", data.getId()) + .set("command", command) + .toString(); + + getPlugin().getServer().broadcast(message, "bm.notify.report.closed", sender); + } else { + if(parser.isInvalidReason()) { + sender.sendMessage(Message.getString("ban.error.invalidReason")); + return; + } + String comment = parser.getReason(1).getMessage(); + PlayerReportCommentData commentData = new PlayerReportCommentData(data, actor, comment); + + try { + getPlugin().getPlayerReportCommentStorage().create(commentData); + } catch (SQLException e) { + sender.sendMessage(Message.getString("sender.error.exception")); + e.printStackTrace(); + return; + } + + String message = Message.get("report.close.notify.comment") + .set("actor", sender.getName()) + .set("id", data.getId()) + .set("comment", comment) + .toString(); + + getPlugin().getServer().broadcast(message, "bm.notify.report.closed", sender); + } + + }); + + return true; + } + + @Override + public String getHelp() { + return " [/command || comment]"; + } + + @Override + public String getPermission() { + return "command.reports.close"; + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/commands/report/InfoSubCommand.java b/common/src/main/java/me/confuser/banmanager/common/commands/report/InfoSubCommand.java new file mode 100644 index 000000000..7a18f0026 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/commands/report/InfoSubCommand.java @@ -0,0 +1,93 @@ +package me.confuser.banmanager.common.commands.report; + + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.commands.CommandParser; +import me.confuser.banmanager.common.commands.CommonSender; +import me.confuser.banmanager.common.commands.CommonSubCommand; +import me.confuser.banmanager.common.data.PlayerReportData; +import me.confuser.banmanager.common.data.PlayerReportLocationData; +import me.confuser.banmanager.common.util.DateUtils; +import me.confuser.banmanager.common.util.Message; + +import java.sql.SQLException; + +public class InfoSubCommand extends CommonSubCommand { + + public InfoSubCommand(BanManagerPlugin plugin) { + super(plugin, "info"); + } + + @Override + public boolean onCommand(final CommonSender sender, CommandParser parser) { + if (parser.getArgs().length != 1) return false; + + final int id; + + try { + id = Integer.parseInt(parser.getArgs()[0]); + } catch (NumberFormatException e) { + Message.get("report.info.error.invalidId").set("id", parser.getArgs()[0]).sendTo(sender); + return true; + } + + getPlugin().getScheduler().runAsync(() -> { + final PlayerReportData data; + + try { + data = getPlugin().getPlayerReportStorage().queryForId(id); + } catch (SQLException e) { + sender.sendMessage(Message.getString("sender.error.exception")); + e.printStackTrace(); + return; + } + + if (data == null) { + Message.get("report.info.error.notFound").sendTo(sender); + return; + } + + String dateTimeFormat = Message.getString("report.info.dateTimeFormat"); + + Message.get("report.info.notify.report") + .set("id", data.getId()) + .set("player", data.getPlayer().getName()) + .set("actor", data.getActor().getName()) + .set("reason", data.getReason()) + .set("created", DateUtils.format(dateTimeFormat, data.getCreated())) + .sendTo(sender); + + PlayerReportLocationData location; + + try { + location = getPlugin().getPlayerReportLocationStorage().getByReportId(id); + } catch (SQLException e) { + sender.sendMessage(Message.getString("sender.error.exception")); + e.printStackTrace(); + return; + } + + if (location == null) return; + + Message.get("report.info.notify.location") + .set("world", location.getWorld()) + .set("x", location.getX()) + .set("y", location.getY()) + .set("z", location.getZ()) + .sendTo(sender); + + }); + + return true; + } + + @Override + public String getHelp() { + return ""; + } + + @Override + public String getPermission() { + return "command.reports.info"; + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/commands/report/ListSubCommand.java b/common/src/main/java/me/confuser/banmanager/common/commands/report/ListSubCommand.java new file mode 100644 index 000000000..4669c8878 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/commands/report/ListSubCommand.java @@ -0,0 +1,89 @@ +package me.confuser.banmanager.common.commands.report; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.commands.CommandParser; +import me.confuser.banmanager.common.commands.CommonSender; +import me.confuser.banmanager.common.commands.CommonSubCommand; +import me.confuser.banmanager.common.data.ReportState; +import me.confuser.banmanager.common.ormlite.stmt.SelectArg; +import me.confuser.banmanager.common.util.Message; +import me.confuser.banmanager.common.util.ReportList; + +import java.sql.SQLException; +import java.util.List; + +public class ListSubCommand extends CommonSubCommand { + + public ListSubCommand(BanManagerPlugin plugin) { + super(plugin, "list"); + } + + @Override + public boolean onCommand(final CommonSender sender, final CommandParser parser) { + getPlugin().getScheduler().runAsync(() -> { + int page = 1; + Integer state = null; + + if (parser.getArgs().length >= 1) { + try { + page = Integer.parseInt(parser.getArgs()[0]); + } catch (NumberFormatException e) { + Message.get("report.list.error.invalidPage").set("page", parser.getArgs()[0]).sendTo(sender); + return; + } + } + + if (parser.getArgs().length == 2) { + try { + List states = getPlugin().getReportStateStorage() + .queryForEq("name", new SelectArg(parser.getArgs()[1])); + + if (states.size() == 0) { + Message.get("report.list.error.invalidState").set("state", parser.getArgs()[1]).sendTo(sender); + return; + } + + state = states.get(0).getId(); + } catch (SQLException e) { + sender.sendMessage(Message.get("sender.error.exception").toString()); + e.printStackTrace(); + return; + } + } + + ReportList reports; + + try { + if (sender.isConsole() || sender.hasPermission("bm.command.reports.list.others")) { + reports = getPlugin().getPlayerReportStorage().getReports(page, state, null); + } else { + reports = getPlugin().getPlayerReportStorage() + .getReports(page, state, sender.getData().getUUID()); + } + } catch (SQLException e) { + sender.sendMessage(Message.get("sender.error.exception").toString()); + e.printStackTrace(); + return; + } + + if (reports == null || reports.getList().size() == 0) { + Message.get("report.list.noResults").sendTo(sender); + return; + } + + reports.send(sender, page); + }); + + return true; + } + + @Override + public String getHelp() { + return "[page] [state]"; + } + + @Override + public String getPermission() { + return "command.reports.list"; + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/commands/report/TeleportSubCommand.java b/common/src/main/java/me/confuser/banmanager/common/commands/report/TeleportSubCommand.java new file mode 100644 index 000000000..16d43d50e --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/commands/report/TeleportSubCommand.java @@ -0,0 +1,96 @@ +package me.confuser.banmanager.common.commands.report; + + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.CommonPlayer; +import me.confuser.banmanager.common.CommonWorld; +import me.confuser.banmanager.common.commands.CommandParser; +import me.confuser.banmanager.common.commands.CommonSender; +import me.confuser.banmanager.common.commands.CommonSubCommand; +import me.confuser.banmanager.common.data.PlayerReportLocationData; +import me.confuser.banmanager.common.util.DateUtils; +import me.confuser.banmanager.common.util.Message; + +import java.sql.SQLException; + +public class TeleportSubCommand extends CommonSubCommand { + + public TeleportSubCommand(BanManagerPlugin plugin) { + super(plugin, "tp"); + } + + @Override + public boolean onCommand(final CommonSender sender, CommandParser parser) { + if (sender.isConsole()) return false; + if (parser.getArgs().length != 1) return false; + + final int id; + + try { + id = Integer.parseInt(parser.getArgs()[0]); + } catch (NumberFormatException e) { + Message.get("report.tp.error.invalidId").set("id", parser.getArgs()[0]).sendTo(sender); + return true; + } + + getPlugin().getScheduler().runAsync(() -> { + final PlayerReportLocationData data; + + try { + data = getPlugin().getPlayerReportLocationStorage().getByReportId(id); + } catch (SQLException e) { + sender.sendMessage(Message.getString("sender.error.exception")); + e.printStackTrace(); + return; + } + + if (data == null) { + Message.get("report.tp.error.notFound").sendTo(sender); + return; + } + + final CommonWorld world = getPlugin().getServer().getWorld(data.getWorld()); + + if (world == null) { + Message.get("report.tp.error.worldNotFound").set("world", data.getWorld()).sendTo(sender); + return; + } + + String dateTimeFormat = Message.getString("report.tp.dateTimeFormat"); + + Message.get("report.tp.notify.report") + .set("id", data.getReport().getId()) + .set("player", data.getReport().getPlayer().getName()) + .set("actor", data.getReport().getActor().getName()) + .set("reason", data.getReport().getReason()) + .set("created", DateUtils.format(dateTimeFormat, data.getReport().getCreated())) + .sendTo(sender); + + Message.get("report.tp.notify.location") + .set("world", data.getWorld()) + .set("x", data.getX()) + .set("y", data.getY()) + .set("z", data.getZ()) + .sendTo(sender); + + getPlugin().getScheduler().runSync(() -> { + CommonPlayer player = getPlugin().getServer().getPlayer(sender.getName()); + + player.teleport(world, data.getX(), data.getY(), data.getZ(), data.getYaw(), data + .getPitch()); + }); + }); + + return true; + } + + @Override + public String getHelp() { + return ""; + } + + @Override + public String getPermission() { + return "command.reports.tp"; + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/commands/report/UnassignSubCommand.java b/common/src/main/java/me/confuser/banmanager/common/commands/report/UnassignSubCommand.java new file mode 100644 index 000000000..fd2645ff7 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/commands/report/UnassignSubCommand.java @@ -0,0 +1,76 @@ +package me.confuser.banmanager.common.commands.report; + + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.commands.CommandParser; +import me.confuser.banmanager.common.commands.CommonSender; +import me.confuser.banmanager.common.commands.CommonSubCommand; +import me.confuser.banmanager.common.data.PlayerReportData; +import me.confuser.banmanager.common.util.Message; + +import java.sql.SQLException; + +public class UnassignSubCommand extends CommonSubCommand { + + public UnassignSubCommand(BanManagerPlugin plugin) { + super(plugin, "unassign"); + } + + @Override + public boolean onCommand(final CommonSender sender, final CommandParser parser) { + if (parser.getArgs().length != 1) return false; + + final int id; + + try { + id = Integer.parseInt(parser.getArgs()[0]); + } catch (NumberFormatException e) { + Message.get("report.tp.error.invalidId").set("id", parser.getArgs()[0]).sendTo(sender); + return true; + } + + getPlugin().getScheduler().runAsync(() -> { + final PlayerReportData data; + + try { + data = getPlugin().getPlayerReportStorage().queryForId(id); + } catch (SQLException e) { + sender.sendMessage(Message.getString("sender.error.exception")); + e.printStackTrace(); + return; + } + + if (data == null) { + sender.sendMessage(Message.getString("report.tp.error.notFound")); + return; + } + + data.setAssignee(null); + + try { + data.setState(getPlugin().getReportStateStorage().queryForId(1)); + getPlugin().getPlayerReportStorage().update(data); + } catch (SQLException e) { + sender.sendMessage(Message.getString("sender.error.exception")); + e.printStackTrace(); + return; + } + + Message.get("report.unassign.player") + .set("id", data.getId()) + .sendTo(sender); + }); + + return true; + } + + @Override + public String getHelp() { + return ""; + } + + @Override + public String getPermission() { + return "command.reports.unassign"; + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/commands/utils/DuplicatesSubCommand.java b/common/src/main/java/me/confuser/banmanager/common/commands/utils/DuplicatesSubCommand.java new file mode 100755 index 000000000..01d125f11 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/commands/utils/DuplicatesSubCommand.java @@ -0,0 +1,128 @@ +package me.confuser.banmanager.common.commands.utils; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.CommonPlayer; +import me.confuser.banmanager.common.commands.CommandParser; +import me.confuser.banmanager.common.commands.CommonSender; +import me.confuser.banmanager.common.commands.CommonSubCommand; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.kyori.text.Component; +import me.confuser.banmanager.common.kyori.text.TextComponent; +import me.confuser.banmanager.common.kyori.text.event.ClickEvent; +import me.confuser.banmanager.common.kyori.text.format.NamedTextColor; +import me.confuser.banmanager.common.kyori.text.format.TextColor; +import me.confuser.banmanager.common.util.Message; +import me.confuser.banmanager.common.util.UUIDUtils; + +import java.sql.SQLException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +public class DuplicatesSubCommand extends CommonSubCommand { + public DuplicatesSubCommand(BanManagerPlugin plugin) { + super(plugin, "duplicates"); + } + + @Override + public boolean onCommand(CommonSender sender, CommandParser parser) { + if (sender.isConsole()) { + return false; + } + + if (parser.getArgs().length == 1 || parser.getArgs().length > 2) { + return false; + } + + getPlugin().getScheduler().runAsync(() -> { + if (parser.getArgs().length == 0) { + HashMap>> duplicates = getPlugin() + .getPlayerStorage() + .getDuplicateNames(); + + if (duplicates.size() == 0) { + Message.get("bmutils.duplicates.lookup.notFound").sendTo(sender); + } + + duplicates.forEach((key, value) -> { + TextComponent.Builder message = Component.text(); + int count = value.getKey(); + + message + .color(NamedTextColor.GOLD) + .append(Component.text("[")) + .append(Component.text(key)).append(Component.text("] * " + count + " ")) + .color(NamedTextColor.GREEN); + + int[] idx = {1}; + + value.getValue() + .forEach(player -> { + String newName = "newName"; + + if (getPlugin().getConfig().isOnlineMode()) { + try { + newName = UUIDUtils.getCurrentName(getPlugin(), player.getUUID()); + } catch (Exception ignored) { + } + } + + String cmd = "/bmutils duplicates " + player.getUUID().toString() + " " + newName; + + message + .append( + Component.text("[" + idx[0]++ + "] "). + clickEvent(ClickEvent.suggestCommand(cmd))); + }); + + ((CommonPlayer) sender).sendJSONMessage(message.build()); + }); + } else if (parser.getArgs().length == 2) { + UUID id = UUID.fromString(parser.getArgs()[0]); + String newName = parser.getArgs()[1]; + + if (!newName.toLowerCase().matches("^[a-z0-9_]{2,16}")) { + Message.get("bmutils.duplicates.error.invalidName").sendTo(sender); + return; + } + + try { + PlayerData player = getPlugin().getPlayerStorage().queryForId(UUIDUtils.toBytes(id)); + + if (player == null) { + sender.sendMessage(Message.get("sender.error.notFound").set("player", parser.getArgs()[0])); + return; + } + + if (getPlugin().getPlayerStorage().retrieve(newName).size() != 0) { + sender.sendMessage(Message.get("bmutils.duplicates.error.nameExists")); + return; + } + + player.setName(newName); + + getPlugin().getPlayerStorage().update(player); + + sender.sendMessage(Message.get("bmutils.duplicates.success").set("player", newName)); + } catch (SQLException e) { + sender.sendMessage(Message.get("sender.error.exception")); + e.printStackTrace(); + return; + } + } + }); + + return true; + } + + @Override + public String getHelp() { + return "duplicates [UUID] [newName]"; + } + + @Override + public String getPermission() { + return "command.bmutils.duplicates"; + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/commands/utils/MissingPlayersSubCommand.java b/common/src/main/java/me/confuser/banmanager/common/commands/utils/MissingPlayersSubCommand.java new file mode 100644 index 000000000..2b82c24cd --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/commands/utils/MissingPlayersSubCommand.java @@ -0,0 +1,129 @@ +package me.confuser.banmanager.common.commands.utils; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.commands.CommandParser; +import me.confuser.banmanager.common.commands.CommonSender; +import me.confuser.banmanager.common.commands.CommonSubCommand; +import me.confuser.banmanager.common.ormlite.stmt.StatementBuilder; +import me.confuser.banmanager.common.ormlite.support.CompiledStatement; +import me.confuser.banmanager.common.ormlite.support.DatabaseConnection; +import me.confuser.banmanager.common.ormlite.support.DatabaseResults; +import me.confuser.banmanager.common.util.Message; +import me.confuser.banmanager.common.util.UUIDUtils; + +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +public class MissingPlayersSubCommand extends CommonSubCommand { + + private static List types = new ArrayList() { + + { + add("playerBans"); + add("playerKicks"); + add("playerMutes"); + add("playerNotes"); + add("playerReports"); + add("playerWarnings"); + } + }; + + public MissingPlayersSubCommand(BanManagerPlugin plugin) { + super(plugin, "missingplayers"); + } + + @Override + public boolean onCommand(final CommonSender sender, final CommandParser parser) { + sender.sendMessage("Scanning database"); + + getPlugin().getScheduler().runAsync(() -> { + DatabaseConnection connection; + ArrayList players = new ArrayList(); + + try { + connection = getPlugin().getLocalConn().getReadOnlyConnection(""); + } catch (SQLException e) { + e.printStackTrace(); + + Message.get("sender.error.exception").sendTo(sender); + + return; + } + + String playerTableName = getPlugin().getConfig().getLocalDb().getTable("players").getTableName(); + + for (String type : types) { + String tableName = getPlugin().getConfig().getLocalDb().getTable(type).getTableName(); + String sql = "SELECT b.player_id FROM " + tableName + " b LEFT JOIN `" + playerTableName + "` p ON b.player_id = p.id WHERE p.id IS NULL"; + DatabaseResults result = null; + + try { + CompiledStatement statement = connection + .compileStatement(sql, StatementBuilder.StatementType.SELECT, null, DatabaseConnection + .DEFAULT_RESULT_FLAGS, false); + + result = statement.runQuery(null); + + while (result.next()) { + players.add(UUIDUtils.fromBytes(result.getBytes(0))); + } + } catch (SQLException e) { + e.printStackTrace(); + + Message.get("sender.error.exception").sendTo(sender); + } finally { + if (result != null) result.closeQuietly(); + } + } + + try { + getPlugin().getLocalConn().releaseConnection(connection); + } catch (SQLException e) { + e.printStackTrace(); + } + + if (players.size() == 0) { + Message.get("bmutils.missingplayers.noneFound").sendTo(sender); + return; + } + + Message.get("bmutils.missingplayers.found").set("amount", players.size()).sendTo(sender); + + int count = 0; + + for (UUID uuid : players) { + try { + String name = "Unknown"; + + if (getPlugin().getConfig().isOnlineMode()) { + name = UUIDUtils.getCurrentName(getPlugin(), uuid); + } + + getPlugin().getPlayerStorage().createIfNotExists(uuid, name); + + count++; + } catch (Exception e) { + e.printStackTrace(); + + Message.get("bmutils.missingplayers.failedLookup").set("uuid", uuid.toString()).sendTo(sender); + } + } + + Message.get("bmutils.missingplayers.complete").set("amount", count).sendTo(sender); + }); + + return true; + } + + @Override + public String getHelp() { + return "/bmutils missingplayers"; + } + + @Override + public String getPermission() { + return "command.bmutils.missingplayers"; + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/configs/ActionCommand.java b/common/src/main/java/me/confuser/banmanager/common/configs/ActionCommand.java new file mode 100644 index 000000000..490d21530 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/configs/ActionCommand.java @@ -0,0 +1,19 @@ +package me.confuser.banmanager.common.configs; + +import lombok.Getter; + +public class ActionCommand { + + @Getter + private final String command; + @Getter + private final long delay; + @Getter + private final String pointsTimeframe; + + public ActionCommand(String command, long delay, String pointsTimeframe) { + this.command = command; + this.delay = delay; + this.pointsTimeframe = pointsTimeframe; + } +} diff --git a/src/main/java/me/confuser/banmanager/configs/CleanUp.java b/common/src/main/java/me/confuser/banmanager/common/configs/CleanUp.java similarity index 81% rename from src/main/java/me/confuser/banmanager/configs/CleanUp.java rename to common/src/main/java/me/confuser/banmanager/common/configs/CleanUp.java index 8eadfcefd..9ff666146 100644 --- a/src/main/java/me/confuser/banmanager/configs/CleanUp.java +++ b/common/src/main/java/me/confuser/banmanager/common/configs/CleanUp.java @@ -1,4 +1,4 @@ -package me.confuser.banmanager.configs; +package me.confuser.banmanager.common.configs; import lombok.Getter; diff --git a/common/src/main/java/me/confuser/banmanager/common/configs/Config.java b/common/src/main/java/me/confuser/banmanager/common/configs/Config.java new file mode 100644 index 000000000..144e7b729 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/configs/Config.java @@ -0,0 +1,92 @@ +package me.confuser.banmanager.common.configs; + +import lombok.Getter; +import me.confuser.banmanager.common.CommonLogger; +import me.confuser.banmanager.common.configuration.InvalidConfigurationException; +import me.confuser.banmanager.common.configuration.file.YamlConfiguration; + +import java.io.File; +import java.io.IOException; + +public abstract class Config { + + public YamlConfiguration conf = new YamlConfiguration(); + protected File file = null; + protected File dataFolder; + @Getter + protected CommonLogger logger; + + public Config(File dataFolder, File file, CommonLogger logger) { + this.dataFolder = dataFolder; + this.logger = logger; + + setFile(file); + } + + public Config(File dataFolder, String fileName, CommonLogger logger) { + this(dataFolder, new File(dataFolder, fileName), logger); + } + + /** + * Must be called before using config.load() or config.save(); + * + * @param input + * @return (Config) instance + */ + public Config setFile(File input) { + // handle the File + if (input == null) { + new InvalidConfigurationException("File cannot be null!").printStackTrace(); + } + + file = input; + + return this; + } + + /** + * Lazy load + */ + public void load() { + if (file != null) { + try { + onLoad(file); + + afterLoad(); + } catch (Exception e) { + e.printStackTrace(); + } + } else { + new InvalidConfigurationException("File cannot be null!").printStackTrace(); + } + } + + public abstract void afterLoad(); + + public abstract void onSave(); + + public void onLoad(File file) throws Exception { + if (!file.exists()) { + throw new Exception("File " + file.getName() + " does not exist"); + } + + try { + conf.load(file); + } catch (InvalidConfigurationException e) { + logger.severe("Invalid yaml file " + file.getName()); + + return; + } + } + + public void save() { + onSave(); + + try { + conf.save(file); + } catch (IOException e) { + e.printStackTrace(); + } + + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/configs/ConsoleConfig.java b/common/src/main/java/me/confuser/banmanager/common/configs/ConsoleConfig.java new file mode 100644 index 000000000..2100db7a9 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/configs/ConsoleConfig.java @@ -0,0 +1,45 @@ +package me.confuser.banmanager.common.configs; + +import lombok.Getter; +import me.confuser.banmanager.common.CommonLogger; + +import java.io.File; +import java.util.UUID; + +public class ConsoleConfig extends Config { + + @Getter + private String name; + @Getter + private UUID uuid; + + public ConsoleConfig(File dataFolder, CommonLogger logger) { + super(dataFolder, "console.yml", logger); + } + + @Override + public void afterLoad() { + boolean update = false; + if (conf.getString("uuid", "0").equals("0")) { + uuid = UUID.randomUUID(); + update = true; + } else { + uuid = UUID.fromString(conf.getString("uuid")); + } + + + name = conf.getString("name"); + + if (update) save(); + } + + @Override + public void onSave() { + if (uuid == null) { + return; + } + + conf.set("uuid", uuid.toString()); + conf.set("name", name); + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/configs/CooldownsConfig.java b/common/src/main/java/me/confuser/banmanager/common/configs/CooldownsConfig.java new file mode 100755 index 000000000..b858fac84 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/configs/CooldownsConfig.java @@ -0,0 +1,48 @@ +package me.confuser.banmanager.common.configs; + +import me.confuser.banmanager.common.CommonLogger; +import me.confuser.banmanager.common.configuration.ConfigurationSection; + +import java.util.HashMap; +import java.util.HashSet; + +public class CooldownsConfig { + private static HashSet validCommands = new HashSet() { + + { + add("ban"); + add("tempban"); + add("mute"); + add("tempmute"); + add("banip"); + add("tempbanip"); + add("warn"); + add("tempwarn"); + add("report"); + } + }; + + private HashMap cooldowns; + + public CooldownsConfig(ConfigurationSection config, CommonLogger logger) { + cooldowns = new HashMap<>(); + + if (config == null) { + return; + } + + for (String command : config.getKeys(false)) { + if (!validCommands.contains(command)) { + logger.warning("Invalid cooldown command " + command); + continue; + } + + cooldowns.put(command, config.getLong(command, 0)); + } + } + + public long getCommand(String name) { + return cooldowns.getOrDefault(name, (long) 0); + } + +} diff --git a/common/src/main/java/me/confuser/banmanager/common/configs/DatabaseConfig.java b/common/src/main/java/me/confuser/banmanager/common/configs/DatabaseConfig.java new file mode 100644 index 000000000..b1ea36e4b --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/configs/DatabaseConfig.java @@ -0,0 +1,103 @@ +package me.confuser.banmanager.common.configs; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import me.confuser.banmanager.common.configuration.ConfigurationSection; +import me.confuser.banmanager.common.ormlite.table.DatabaseTableConfig; + +import java.io.File; +import java.util.HashMap; +import java.util.Map; + +@AllArgsConstructor +public abstract class DatabaseConfig { + + @Getter + private final String storageType; + @Getter + private final String host; + @Getter + private final int port; + @Getter + private final String name; + @Getter + private final String user; + @Getter + private final String password; + @Getter + private final boolean useSSL; + @Getter + private final boolean verifyServerCertificate; + @Getter + private final boolean allowPublicKeyRetrieval; + @Getter + private final boolean isEnabled; + @Getter + private int maxConnections; + @Getter + private int leakDetection; + @Getter + private int maxLifetime; + @Getter + private int connectionTimeout; + @Getter + private HashMap> tables = new HashMap<>(); + + private File dataFolder; + + private DatabaseConfig(File dataFolder, ConfigurationSection conf) { + this.dataFolder = dataFolder; + + storageType = conf.getString("storageType", "mysql").toLowerCase(); + host = conf.getString("host"); + port = conf.getInt("port", 3306); + name = conf.getString("name"); + user = conf.getString("user"); + password = conf.getString("password"); + isEnabled = conf.getBoolean("enabled", false); + maxConnections = conf.getInt("maxConnections", 10); + leakDetection = conf.getInt("leakDetection", 0); + useSSL = conf.getBoolean("useSSL", false); + allowPublicKeyRetrieval = conf.getBoolean("allowPublicKeyRetrieval", false); + verifyServerCertificate = conf.getBoolean("verifyServerCertificate", false); + maxLifetime = conf.getInt("maxLifetime", 1800000); + connectionTimeout = conf.getInt("connectionTimeout", 30000); + + if (maxConnections > 30) maxConnections = 30; + } + + DatabaseConfig(File dataFolder, ConfigurationSection conf, HashMap types) { + this(dataFolder, conf); + + for (Map.Entry entry : types.entrySet()) { + addTable(entry.getKey(), new DatabaseTableConfig<>(entry.getValue(), conf + .getString("tables." + entry.getKey()), null)); + } + } + + public String getJDBCUrl() { + if (storageType.equals("h2")) return "jdbc:h2:file:" + new File(dataFolder, name).getAbsolutePath() + ";mode=MySQL;DB_CLOSE_ON_EXIT=TRUE;FILE_LOCK=NO;IGNORECASE=TRUE"; + + String url = "jdbc:" + storageType + "://" + host + ":" + port + "/" + name + + "?autoReconnect=true&failOverReadOnly=false&maxReconnects=10&useUnicode=true&characterEncoding=utf-8" + + "&serverTimezone=UTC" + + "&useSSL=" + useSSL + + "&allowPublicKeyRetrieval=" + allowPublicKeyRetrieval + + "&verifyServerCertificate=" + verifyServerCertificate; + + if (!storageType.equals("mariadb")) { + url += "&disableMariaDbDriver"; + } + + return url; + } + + public DatabaseTableConfig getTable(String table) { + return tables.get(table); + } + + // Used by ReportsLogger + public void addTable(String key, DatabaseTableConfig config) { + tables.put(key, config); + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/configs/DefaultConfig.java b/common/src/main/java/me/confuser/banmanager/common/configs/DefaultConfig.java new file mode 100644 index 000000000..ab5021310 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/configs/DefaultConfig.java @@ -0,0 +1,221 @@ +package me.confuser.banmanager.common.configs; + +import lombok.Getter; +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.CommonExternalCommand; +import me.confuser.banmanager.common.CommonLogger; +import me.confuser.banmanager.common.util.StringUtils; + +import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; + +public class DefaultConfig extends Config { + + @Getter + private DatabaseConfig localDb; + @Getter + private DatabaseConfig globalDb; + @Getter + private TimeLimitsConfig timeLimits; + @Getter + private HashSet mutedBlacklistCommands; + @Getter + private HashSet softMutedBlacklistCommands; + @Getter + private boolean duplicateIpCheckEnabled = true; + @Getter + private HashSet bypassPlayerIps; + @Getter + private boolean kickLoggingEnabled = false; + @Getter + private boolean debugEnabled = false; + @Getter + private WarningActionsConfig warningActions; + @Getter + private boolean displayNotificationsEnabled = true; + @Getter + private boolean onlineMode = true; + @Getter + private boolean checkForUpdates = false; + @Getter + private boolean offlineAutoComplete = true; + @Getter + private boolean punishAlts = false; + @Getter + private boolean denyAlts = false; + @Getter + private long timeAssociatedAlts; + @Getter + private HashMap cleanUps; + @Getter + private int maxOnlinePerIp = 0; + @Getter + private int maxMultiaccountsRecently = 0; + @Getter + private long multiaccountsTime = 300L; + @Getter + private HooksConfig hooksConfig; + @Getter + private boolean broadcastOnSync = false; + @Getter + private boolean checkOnJoin = false; + @Getter + private boolean createNoteReasons = false; + @Getter + private boolean warningMutesEnabled = false; + @Getter + private boolean logIpsEnabled = true; + @Getter + private String chatPriority; + @Getter + private boolean blockInvalidReasons = false; + @Getter + private CooldownsConfig cooldownsConfig; + @Getter + private UUIDFetcher uuidFetcher; + @Getter + private String geyserPrefix; + + public DefaultConfig(File dataFolder, CommonLogger logger) { + super(dataFolder, "config.yml", logger); + } + + @Override + public void afterLoad() { + localDb = new LocalDatabaseConfig(dataFolder, conf.getConfigurationSection("databases.local")); + globalDb = new GlobalDatabaseConfig(dataFolder, conf.getConfigurationSection("databases.global")); + timeLimits = new TimeLimitsConfig(conf.getConfigurationSection("timeLimits"), logger); + duplicateIpCheckEnabled = conf.getBoolean("duplicateIpCheck", true); + onlineMode = conf.getBoolean("onlineMode", true); + checkForUpdates = conf.getBoolean("checkForUpdates", false); + offlineAutoComplete = conf.getBoolean("offlineAutoComplete", true); + + bypassPlayerIps = new HashSet<>(); + bypassPlayerIps.addAll(conf.getStringList("bypassDuplicateChecks")); + + warningActions = new WarningActionsConfig(conf.getConfigurationSection("warningActions"), logger); + kickLoggingEnabled = conf.getBoolean("logKicks", false); + debugEnabled = conf.getBoolean("debug", false); + displayNotificationsEnabled = conf.getBoolean("displayNotifications", true); + punishAlts = conf.getBoolean("punishAlts", false); + denyAlts = conf.getBoolean("denyAlts", false); + timeAssociatedAlts = conf.getLong("timeAssociatedAlts", 0); + + cleanUps = new HashMap<>(6); + for (String type : conf.getConfigurationSection("cleanUp").getKeys(false)) { + cleanUps.put(type, new CleanUp(conf.getInt("cleanUp." + type))); + } + + maxOnlinePerIp = conf.getInt("maxOnlinePerIp", 0); + maxMultiaccountsRecently = conf.getInt("maxMultiaccountsRecently", 0); + multiaccountsTime = conf.getLong("multiaccountsTime", 300L); + + hooksConfig = new HooksConfig(conf.getConfigurationSection("hooks"), logger); + + broadcastOnSync = conf.getBoolean("broadcastOnSync", false); + checkOnJoin = conf.getBoolean("checkOnJoin", false); + createNoteReasons = conf.getBoolean("createNoteReasons", false); + warningMutesEnabled = conf.getBoolean("warningMute", true); + logIpsEnabled = conf.getBoolean("logIps", true); + + chatPriority = conf.getString("chatPriority", "NORMAL").toUpperCase(); + + blockInvalidReasons = conf.getBoolean("blockInvalidReasons", false); + + mutedBlacklistCommands = new HashSet<>(conf.getStringList("mutedCommandBlacklist")); + softMutedBlacklistCommands = new HashSet<>(conf.getStringList("softMutedCommandBlacklist")); + + cooldownsConfig = new CooldownsConfig(conf.getConfigurationSection("cooldowns"), logger); + + Fetcher idToName = new Fetcher( + conf.getString("uuidFetcher.idToName.url", "https://sessionserver.mojang.com/session/minecraft/profile/[uuid]"), + conf.getString("uuidFetcher.idToName.key", "name") + ); + Fetcher nameToId = new Fetcher( + conf.getString("uuidFetcher.nameToId.url", "https://api.mojang.com/users/profiles/minecraft/[name]"), + conf.getString("uuidFetcher.nameToId.key", "id") + ); + uuidFetcher = new UUIDFetcher(idToName, nameToId); + + geyserPrefix = conf.getString("geyserPrefix", ""); + } + + public void handleBlockedCommands(BanManagerPlugin plugin, HashSet set) { + for (String cmd : new ArrayList<>(set)) { + CommonExternalCommand command; + String[] cmdArgs = null; + + if (cmd.contains(" ")) { + cmdArgs = cmd.split(" "); + command = plugin.getServer().getPluginCommand(cmdArgs[0]); + } else { + command = plugin.getServer().getPluginCommand(cmd); + } + if (command == null) { + plugin.getLogger().info(cmd); + continue; + } + + if (command.getPluginName() != null) { + set.add(command.getPluginName() + ":" + cmd); + } + + StringBuilder infoBuilder = new StringBuilder(cmd).append(" - "); + + if (cmdArgs != null) { + String args = StringUtils.join(cmdArgs, " ", 1, cmdArgs.length); + String fullCmd = command.getName() + " " + args; + + if (!set.contains(fullCmd)) { + set.add(fullCmd); + infoBuilder.append(fullCmd).append(' '); + } + + for (String aliasCmd : command.getAliases()) { + String fullAliasCmd = aliasCmd + " " + args; + + set.add(fullAliasCmd); + infoBuilder.append(fullAliasCmd).append(' '); + + // Block the annoying /plugin:cmd too + if (command.getPluginName() != null) { + set.add(command.getPluginName() + ":" + fullAliasCmd); + } + } + } else { + if (!set.contains(command.getName())) { + set.add(command.getName()); + infoBuilder.append(command.getName()).append(' '); + } + + for (String aliasCmd : command.getAliases()) { + set.add(aliasCmd); + infoBuilder.append(aliasCmd).append(' '); + + // Block the annoying /plugin:cmd too + if (command.getPluginName() != null) { + set.add(command.getPluginName() + ":" + aliasCmd); + } + } + } + + plugin.getLogger().info(infoBuilder.toString()); + } + } + + @Override + public void onSave() { + + } + + public boolean isBlockedCommand(String cmd) { + return mutedBlacklistCommands.contains(cmd); + } + + public boolean isSoftBlockedCommand(String cmd) { + return softMutedBlacklistCommands.contains(cmd); + } + +} diff --git a/common/src/main/java/me/confuser/banmanager/common/configs/DiscordConfig.java b/common/src/main/java/me/confuser/banmanager/common/configs/DiscordConfig.java new file mode 100644 index 000000000..337536ee2 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/configs/DiscordConfig.java @@ -0,0 +1,69 @@ +package me.confuser.banmanager.common.configs; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import me.confuser.banmanager.common.CommonLogger; +import me.confuser.banmanager.common.configuration.ConfigurationSection; +import me.confuser.banmanager.common.gson.Gson; +import me.confuser.banmanager.common.gson.GsonBuilder; + +import java.io.File; +import java.io.StringWriter; +import java.util.HashMap; +import java.util.Map; + +public class DiscordConfig extends Config { + @Getter + private boolean hooksEnabled = false; + private Map hookTypes; + + public DiscordConfig(File dataFolder, CommonLogger logger) { + super(dataFolder, "discord.yml", logger); + } + + @Override + public void afterLoad() { + if (conf.getBoolean("enabled", false)) { + this.logger.warning("DiscordSRV/MagiBridge integration removed, please switch to hooks in discord.yml"); + return; + } + + hooksEnabled = conf.getBoolean("hooks.enabled", false); + + ConfigurationSection hooks = conf.getConfigurationSection("hooks.punishments"); + hookTypes = new HashMap<>(); + + for (String type : hooks.getKeys(false)) { + ConfigurationSection payloadSection = hooks.getConfigurationSection(type + ".payload"); + Gson gson = new GsonBuilder().setPrettyPrinting().serializeNulls().create(); + StringWriter writer = new StringWriter(); + gson.toJson(payloadSection.getValues(true), writer); + String payload = writer.toString(); + + hookTypes.put(type, new DiscordHookConfig( + hooks.getString(type + ".url"), + payload, + hooks.getBoolean(type + ".ignoreSilent", true) + )); + } + } + + @Override + public void onSave() { + + } + + public DiscordHookConfig getType(String type) { + return hookTypes.get(type); + } + + @AllArgsConstructor + public class DiscordHookConfig { + @Getter + private String url; + @Getter + private String payload; + @Getter + private boolean ignoreSilent; + } +} diff --git a/src/main/java/me/confuser/banmanager/configs/ExemptionsConfig.java b/common/src/main/java/me/confuser/banmanager/common/configs/ExemptionsConfig.java similarity index 61% rename from src/main/java/me/confuser/banmanager/configs/ExemptionsConfig.java rename to common/src/main/java/me/confuser/banmanager/common/configs/ExemptionsConfig.java index d71e20bdf..042555194 100644 --- a/src/main/java/me/confuser/banmanager/configs/ExemptionsConfig.java +++ b/common/src/main/java/me/confuser/banmanager/common/configs/ExemptionsConfig.java @@ -1,14 +1,14 @@ -package me.confuser.banmanager.configs; +package me.confuser.banmanager.common.configs; -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.data.PlayerExemptionsData; -import me.confuser.bukkitutil.configs.Config; -import org.bukkit.configuration.ConfigurationSection; +import me.confuser.banmanager.common.CommonLogger; +import me.confuser.banmanager.common.configuration.ConfigurationSection; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.data.PlayerExemptionsData; +import java.io.File; import java.util.*; -public class ExemptionsConfig extends Config { +public class ExemptionsConfig extends Config { private static ArrayList types = new ArrayList() { @@ -16,6 +16,8 @@ public class ExemptionsConfig extends Config { add("alts"); add("ban"); add("tempban"); + add("baniprange"); + add("tempbaniprange"); add("mute"); add("tempmute"); add("warn"); @@ -24,13 +26,13 @@ public class ExemptionsConfig extends Config { }; private HashMap players; - public ExemptionsConfig() { - super("exemptions.yml"); + public ExemptionsConfig(File dataFolder, CommonLogger logger) { + super(dataFolder, "exemptions.yml", logger); } @Override public void afterLoad() { - players = new HashMap<>(); + players = new HashMap<>(); Set keys = conf.getKeys(false); if (keys == null || keys.size() == 0) return; @@ -59,9 +61,12 @@ public void onSave() { } public boolean isExempt(PlayerData player, String type) { - PlayerExemptionsData exemptionsData = players.get(player.getUUID()); + return isExempt(player.getUUID(), type); + } - return exemptionsData != null && exemptionsData.isExempt(type); + public boolean isExempt(UUID uuid, String type) { + PlayerExemptionsData exemptionsData = players.get(uuid); + return exemptionsData != null && exemptionsData.isExempt(type); } } diff --git a/common/src/main/java/me/confuser/banmanager/common/configs/Fetcher.java b/common/src/main/java/me/confuser/banmanager/common/configs/Fetcher.java new file mode 100644 index 000000000..7cf6f9483 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/configs/Fetcher.java @@ -0,0 +1,13 @@ +package me.confuser.banmanager.common.configs; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@AllArgsConstructor +public +class Fetcher { + @Getter + private final String url; + @Getter + private final String key; +} diff --git a/common/src/main/java/me/confuser/banmanager/common/configs/GeoIpConfig.java b/common/src/main/java/me/confuser/banmanager/common/configs/GeoIpConfig.java new file mode 100644 index 000000000..e67cbc86e --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/configs/GeoIpConfig.java @@ -0,0 +1,173 @@ +package me.confuser.banmanager.common.configs; + +import lombok.Getter; +import me.confuser.banmanager.common.CommonLogger; +import me.confuser.banmanager.common.apachecommons.compress.archivers.ArchiveEntry; +import me.confuser.banmanager.common.apachecommons.compress.archivers.tar.TarArchiveInputStream; +import me.confuser.banmanager.common.apachecommons.compress.utils.IOUtils; +import me.confuser.banmanager.common.maxmind.db.GeoIp2Provider; +import me.confuser.banmanager.common.maxmind.db.Reader; +import me.confuser.banmanager.common.maxmind.db.cache.CHMCache; +import me.confuser.banmanager.common.maxmind.db.model.CountryResponse; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.net.URLConnection; +import java.util.HashSet; +import java.util.zip.GZIPInputStream; + +public class GeoIpConfig extends Config { + + @Getter + private boolean enabled = false; + @Getter + private GeoIp2Provider cityDatabase; + @Getter + private GeoIp2Provider countryDatabase; + private HashSet countries; + @Getter + private String type; + + public GeoIpConfig(File dataFolder, CommonLogger logger) { + super(dataFolder, "geoip.yml", logger); + } + + @Override + public void afterLoad() { + enabled = conf.getBoolean("enabled", false); + + if (!enabled) return; + + if (!conf.getString("download.country").contains("licenseKey") || !conf.getString("download.city").contains("licenseKey")) { + // Migrate to GeoIP2 + conf.set("download.city", "https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-City&license_key=[licenseKey]&suffix=tar.gz"); + conf.set("download.country", "https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-Country&license_key=[licenseKey]&suffix=tar.gz"); + + save(); + } + + String licenseKey = conf.getString("download.licenseKey"); + + if (licenseKey == null || licenseKey.isEmpty()) { + logger.severe("Unable to enable geoip features due to missing licenseKey"); + return; + } + + String cityDownloadUrl = conf.getString("download.city").replace("[licenseKey]", licenseKey); + String countryDownloadUrl = conf.getString("download.country").replace("[licenseKey]", licenseKey); + File cityFile = new File(dataFolder, "city.mmdb"); + File countryFile = new File(dataFolder, "country.mmdb"); + + long lastUpdated = conf.getLong("download.lastUpdated"); + boolean outdated = (System.currentTimeMillis() - lastUpdated) > 2592000000L; // older than 30 days? + + if (!cityFile.exists() || outdated) { + logger.info("Downloading city database"); + try { + downloadDatabase(cityDownloadUrl, cityFile); + } catch (IOException e) { + enabled = false; + logger.severe("Unable to download city database"); + e.printStackTrace(); + return; + } + } + + if (!countryFile.exists() || outdated) { + logger.info("Downloading country database"); + try { + downloadDatabase(countryDownloadUrl, countryFile); + } catch (IOException e) { + enabled = false; + logger.severe("Unable to download country database"); + e.printStackTrace(); + return; + } + } + + if (cityFile.exists()) { + logger.info("Loading city database"); + try { + cityDatabase = new Reader(cityFile, Reader.FileMode.MEMORY, new CHMCache()); + } catch (IOException e) { + logger.severe("Failed loading city database"); + enabled = false; + e.printStackTrace(); + return; + } + } + + if (countryFile.exists()) { + logger.info("Loading country database"); + try { + countryDatabase = new Reader(cityFile, Reader.FileMode.MEMORY, new CHMCache()); + } catch (IOException e) { + logger.severe("Failed loading country database"); + enabled = false; + e.printStackTrace(); + return; + } + } + + if (!enabled) return; + + if (outdated) { + conf.set("download.lastUpdated", System.currentTimeMillis()); + save(); + } + + logger.info("Successfully loaded GeoIP databases"); + + countries = new HashSet<>(conf.getStringList("countries.list")); + type = conf.getString("countries.type"); + + logger.info("Loaded " + countries.size() + " countries on the " + type); + } + + public boolean isCountryAllowed(CountryResponse countryResponse) { + // blacklist option deprecated + if (type.equals("blacklist") || type.equals("deny")) { + return !countries.contains(countryResponse.getCountry().getIsoCode()); + } else { + return countries.contains(countryResponse.getCountry().getIsoCode()); + } + } + + @Override + public void onSave() { + } + + private void downloadDatabase(String downloadUrl, File location) throws IOException { + if (location.exists()) { + location.delete(); + } + + URL url = new URL(downloadUrl); + URLConnection con = url.openConnection(); + + con.setConnectTimeout(6000); + con.connect(); + + InputStream input = new GZIPInputStream(con.getInputStream()); + TarArchiveInputStream inputStream = new TarArchiveInputStream(input); + + FileOutputStream outputStream = new FileOutputStream(location); + + ArchiveEntry entry = null; + while ((entry = inputStream.getNextEntry()) != null) { + if (entry.isDirectory()) continue; + if (!entry.getName().endsWith(".mmdb")) continue; + + IOUtils.copy(inputStream, outputStream); + + break; + } + + outputStream.close(); + inputStream.close(); + input.close(); + } +} diff --git a/src/main/java/me/confuser/banmanager/configs/GlobalDatabaseConfig.java b/common/src/main/java/me/confuser/banmanager/common/configs/GlobalDatabaseConfig.java similarity index 64% rename from src/main/java/me/confuser/banmanager/configs/GlobalDatabaseConfig.java rename to common/src/main/java/me/confuser/banmanager/common/configs/GlobalDatabaseConfig.java index fe0e0cdbe..651a851e5 100644 --- a/src/main/java/me/confuser/banmanager/configs/GlobalDatabaseConfig.java +++ b/common/src/main/java/me/confuser/banmanager/common/configs/GlobalDatabaseConfig.java @@ -1,8 +1,9 @@ -package me.confuser.banmanager.configs; +package me.confuser.banmanager.common.configs; -import me.confuser.banmanager.data.global.*; -import org.bukkit.configuration.ConfigurationSection; +import me.confuser.banmanager.common.data.global.*; +import me.confuser.banmanager.common.configuration.ConfigurationSection; +import java.io.File; import java.util.HashMap; public class GlobalDatabaseConfig extends DatabaseConfig { @@ -20,8 +21,8 @@ public class GlobalDatabaseConfig extends DatabaseConfig { put("ipUnbans", GlobalIpBanRecordData.class); }}; - public GlobalDatabaseConfig(ConfigurationSection conf) { - super(conf, types); + public GlobalDatabaseConfig(File dataFolder, ConfigurationSection conf) { + super(dataFolder, conf, types); } } diff --git a/src/main/java/me/confuser/banmanager/configs/Hook.java b/common/src/main/java/me/confuser/banmanager/common/configs/Hook.java similarity index 85% rename from src/main/java/me/confuser/banmanager/configs/Hook.java rename to common/src/main/java/me/confuser/banmanager/common/configs/Hook.java index 8c3b3a350..ac7994794 100644 --- a/src/main/java/me/confuser/banmanager/configs/Hook.java +++ b/common/src/main/java/me/confuser/banmanager/common/configs/Hook.java @@ -1,4 +1,4 @@ -package me.confuser.banmanager.configs; +package me.confuser.banmanager.common.configs; import lombok.Getter; diff --git a/src/main/java/me/confuser/banmanager/configs/HooksConfig.java b/common/src/main/java/me/confuser/banmanager/common/configs/HooksConfig.java similarity index 62% rename from src/main/java/me/confuser/banmanager/configs/HooksConfig.java rename to common/src/main/java/me/confuser/banmanager/common/configs/HooksConfig.java index c7c9db3f4..5f8ccd5ca 100644 --- a/src/main/java/me/confuser/banmanager/configs/HooksConfig.java +++ b/common/src/main/java/me/confuser/banmanager/common/configs/HooksConfig.java @@ -1,8 +1,8 @@ -package me.confuser.banmanager.configs; +package me.confuser.banmanager.common.configs; import lombok.Getter; -import me.confuser.banmanager.BanManager; -import org.bukkit.configuration.ConfigurationSection; +import me.confuser.banmanager.common.CommonLogger; +import me.confuser.banmanager.common.configuration.ConfigurationSection; import java.util.*; @@ -26,15 +26,18 @@ public class HooksConfig { add("note"); add("warn"); add("tempwarn"); + add("report"); } }; - private BanManager plugin = BanManager.getPlugin(); + private CommonLogger logger; @Getter private boolean isEnabled = false; private HashMap hooks; - public HooksConfig(ConfigurationSection config) { + public HooksConfig(ConfigurationSection config, CommonLogger logger) { + this.logger = logger; + if (config == null) { isEnabled = false; return; @@ -51,7 +54,7 @@ public HooksConfig(ConfigurationSection config) { for (String event : eventsConf.getKeys(false)) { if (!validEvents.contains(event)) { - plugin.getLogger().warning("Invalid event " + event); + logger.warning("Invalid event " + event); continue; } @@ -68,29 +71,28 @@ public HooksConfig(ConfigurationSection config) { private List getActionCommands(String event, List> mapList) { List actionCommands = new ArrayList<>(); - if (mapList != null && mapList.size() != 0) { - - for (Map map : mapList) { - if (map.get("cmd") == null) { - plugin.getLogger().severe("Missing cmd from " + event + " hook"); - continue; - } + if (mapList == null || mapList.size() == 0) return actionCommands; - long delay = 0; + for (Map map : mapList) { + if (map.get("cmd") == null) { + logger.severe("Missing cmd from " + event + " hook"); + continue; + } - if (map.get("delay") != null) { - try { - delay = Long.valueOf((Integer) map.get("delay")); - } catch (NumberFormatException e) { - plugin.getLogger().severe("Invalid delay for " + map.get("cmd")); - continue; - } + long delay = 0; - delay = delay * 20L; // Convert from seconds to ticks + if (map.get("delay") != null) { + try { + delay = Long.valueOf((Integer) map.get("delay")); + } catch (NumberFormatException e) { + logger.severe("Invalid delay for " + map.get("cmd")); + continue; } - actionCommands.add(new ActionCommand((String) map.get("cmd"), delay)); + delay = delay * 20L; // Convert from seconds to ticks } + + actionCommands.add(new ActionCommand((String) map.get("cmd"), delay, "")); } return actionCommands; diff --git a/src/main/java/me/confuser/banmanager/configs/LocalDatabaseConfig.java b/common/src/main/java/me/confuser/banmanager/common/configs/LocalDatabaseConfig.java similarity index 76% rename from src/main/java/me/confuser/banmanager/configs/LocalDatabaseConfig.java rename to common/src/main/java/me/confuser/banmanager/common/configs/LocalDatabaseConfig.java index 8f937ccf7..5d1e17dd5 100644 --- a/src/main/java/me/confuser/banmanager/configs/LocalDatabaseConfig.java +++ b/common/src/main/java/me/confuser/banmanager/common/configs/LocalDatabaseConfig.java @@ -1,13 +1,14 @@ -package me.confuser.banmanager.configs; +package me.confuser.banmanager.common.configs; -import me.confuser.banmanager.data.*; -import org.bukkit.configuration.ConfigurationSection; +import me.confuser.banmanager.common.data.*; +import me.confuser.banmanager.common.configuration.ConfigurationSection; +import java.io.File; import java.util.HashMap; public class LocalDatabaseConfig extends DatabaseConfig { - private static HashMap types = new HashMap() {{ + public static HashMap types = new HashMap() {{ put("players", PlayerData.class); put("playerBans", PlayerBanData.class); @@ -45,8 +46,8 @@ public class LocalDatabaseConfig extends DatabaseConfig { put("nameBanRecords", NameBanRecord.class); }}; - public LocalDatabaseConfig(ConfigurationSection conf) { - super(conf, types); + public LocalDatabaseConfig(File dataFolder, ConfigurationSection conf) { + super(dataFolder, conf, types); } } diff --git a/common/src/main/java/me/confuser/banmanager/common/configs/MessagesConfig.java b/common/src/main/java/me/confuser/banmanager/common/configs/MessagesConfig.java new file mode 100644 index 000000000..804f6b5f2 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/configs/MessagesConfig.java @@ -0,0 +1,23 @@ +package me.confuser.banmanager.common.configs; + + +import me.confuser.banmanager.common.CommonLogger; +import me.confuser.banmanager.common.util.Message; + +import java.io.File; + +public class MessagesConfig extends Config { + + public MessagesConfig(File dataFolder, CommonLogger logger) { + super(dataFolder, "messages.yml", logger); + } + + public void afterLoad() { + Message.load(this); + } + + public void onSave() { + + } + +} diff --git a/common/src/main/java/me/confuser/banmanager/common/configs/PluginInfo.java b/common/src/main/java/me/confuser/banmanager/common/configs/PluginInfo.java new file mode 100644 index 000000000..4ccd573cb --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/configs/PluginInfo.java @@ -0,0 +1,36 @@ +package me.confuser.banmanager.common.configs; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class PluginInfo { + private Map commands; + + public PluginInfo() { + commands = new HashMap<>(); + } + + public CommandInfo getCommand(String commandName) { + return commands.get(commandName); + } + + public CommandInfo setCommand(CommandInfo command) { + return commands.put(command.getName(), command); + } + + @AllArgsConstructor + public static class CommandInfo { + @Getter + private String name; + @Getter + private String permission; + @Getter + private String usage; + @Getter + private List aliases; + } +} diff --git a/src/main/java/me/confuser/banmanager/configs/ReasonsConfig.java b/common/src/main/java/me/confuser/banmanager/common/configs/ReasonsConfig.java similarity index 61% rename from src/main/java/me/confuser/banmanager/configs/ReasonsConfig.java rename to common/src/main/java/me/confuser/banmanager/common/configs/ReasonsConfig.java index 5be7f48ac..887a7a1dc 100644 --- a/src/main/java/me/confuser/banmanager/configs/ReasonsConfig.java +++ b/common/src/main/java/me/confuser/banmanager/common/configs/ReasonsConfig.java @@ -1,19 +1,19 @@ -package me.confuser.banmanager.configs; +package me.confuser.banmanager.common.configs; -import com.google.common.base.CharMatcher; import lombok.Getter; -import me.confuser.banmanager.BanManager; -import me.confuser.bukkitutil.configs.Config; +import me.confuser.banmanager.common.CommonLogger; +import java.io.File; import java.util.HashMap; import java.util.Set; -public class ReasonsConfig extends Config { +public class ReasonsConfig extends Config { + @Getter private HashMap reasons; - public ReasonsConfig() { - super("reasons.yml"); + public ReasonsConfig(File dataFolder, CommonLogger logger) { + super(dataFolder, "reasons.yml", logger); } @Override @@ -27,7 +27,7 @@ public void afterLoad() { for (String reasonKey : keys) { String reason = conf.getString(reasonKey); - if (CharMatcher.WHITESPACE.matchesAnyOf(reasonKey)) continue; + if (reasonKey.chars().allMatch(Character::isWhitespace)) continue; reasons.put(reasonKey, reason); } diff --git a/common/src/main/java/me/confuser/banmanager/common/configs/SchedulesConfig.java b/common/src/main/java/me/confuser/banmanager/common/configs/SchedulesConfig.java new file mode 100644 index 000000000..7d61315e6 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/configs/SchedulesConfig.java @@ -0,0 +1,63 @@ +package me.confuser.banmanager.common.configs; + +import me.confuser.banmanager.common.CommonLogger; + +import java.io.File; +import java.util.concurrent.ConcurrentHashMap; + +public class SchedulesConfig extends Config { + + private ConcurrentHashMap schedules = new ConcurrentHashMap<>(13); + private ConcurrentHashMap lastChecked = new ConcurrentHashMap<>(12); + + public SchedulesConfig(File dataFolder, CommonLogger logger) { + super(dataFolder, "schedules.yml", logger); + } + + public int getSchedule(String scheduleName) { + Integer schedule = schedules.get(scheduleName); + + if (schedule == null) { + logger.severe("Unknown schedule " + scheduleName + ", defaulting to 30 seconds"); + + return 30; + } + + return schedule; + } + + public long getLastChecked(String lastChecked) { + Long checked = this.lastChecked.get(lastChecked); + + if (checked == null) { + logger.severe("Unknown last checked " + lastChecked + ", defaulting to 0"); + return 0; + } + + return checked; + } + + public void setLastChecked(String key, long value) { + lastChecked.put(key, value); + } + + @Override + public void afterLoad() { + for (String key : conf.getConfigurationSection("scheduler").getKeys(false)) { + schedules.put(key, conf.getInt(("scheduler." + key), 0)); + } + + for (String key : conf.getConfigurationSection("lastChecked").getKeys(false)) { + lastChecked.put(key, conf.getLong(("lastChecked." + key), 0)); + } + + } + + @Override + public void onSave() { + if (lastChecked.size() > 0) { + conf.set("lastChecked", lastChecked); + } + } + +} diff --git a/src/main/java/me/confuser/banmanager/configs/TimeLimitType.java b/common/src/main/java/me/confuser/banmanager/common/configs/TimeLimitType.java similarity index 87% rename from src/main/java/me/confuser/banmanager/configs/TimeLimitType.java rename to common/src/main/java/me/confuser/banmanager/common/configs/TimeLimitType.java index ca0c31a26..a2fe082fd 100644 --- a/src/main/java/me/confuser/banmanager/configs/TimeLimitType.java +++ b/common/src/main/java/me/confuser/banmanager/common/configs/TimeLimitType.java @@ -1,4 +1,4 @@ -package me.confuser.banmanager.configs; +package me.confuser.banmanager.common.configs; import lombok.Getter; diff --git a/src/main/java/me/confuser/banmanager/configs/TimeLimitsConfig.java b/common/src/main/java/me/confuser/banmanager/common/configs/TimeLimitsConfig.java similarity index 71% rename from src/main/java/me/confuser/banmanager/configs/TimeLimitsConfig.java rename to common/src/main/java/me/confuser/banmanager/common/configs/TimeLimitsConfig.java index 2dbec2cb9..c5cb260c3 100644 --- a/src/main/java/me/confuser/banmanager/configs/TimeLimitsConfig.java +++ b/common/src/main/java/me/confuser/banmanager/common/configs/TimeLimitsConfig.java @@ -1,9 +1,9 @@ -package me.confuser.banmanager.configs; +package me.confuser.banmanager.common.configs; -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.util.DateUtils; -import org.bukkit.command.CommandSender; -import org.bukkit.configuration.ConfigurationSection; +import me.confuser.banmanager.common.CommonLogger; +import me.confuser.banmanager.common.commands.CommonSender; +import me.confuser.banmanager.common.configuration.ConfigurationSection; +import me.confuser.banmanager.common.util.DateUtils; import java.util.HashMap; @@ -11,7 +11,7 @@ public class TimeLimitsConfig { private HashMap> limits; - public TimeLimitsConfig(ConfigurationSection config) { + public TimeLimitsConfig(ConfigurationSection config, CommonLogger logger) { limits = new HashMap<>(); for (TimeLimitType type : TimeLimitType.values()) { @@ -27,7 +27,7 @@ public TimeLimitsConfig(ConfigurationSection config) { try { DateUtils.parseDateDiff(time, true); } catch (Exception e) { - BanManager.getPlugin().getLogger().warning("Ignored " + type.getName() + " " + name + " due to invalid time"); + logger.warning("Ignored " + type.getName() + " " + name + " due to invalid time"); continue; } @@ -38,7 +38,7 @@ public TimeLimitsConfig(ConfigurationSection config) { } } - public boolean isPastLimit(CommandSender sender, TimeLimitType type, long expires) { + public boolean isPastLimit(CommonSender sender, TimeLimitType type, long expires) { if (sender.hasPermission("bm.timelimit." + type.getName() + ".bypass") || sender.hasPermission("bm.*")) { return false; } diff --git a/common/src/main/java/me/confuser/banmanager/common/configs/UUIDFetcher.java b/common/src/main/java/me/confuser/banmanager/common/configs/UUIDFetcher.java new file mode 100644 index 000000000..02b4d2919 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/configs/UUIDFetcher.java @@ -0,0 +1,13 @@ +package me.confuser.banmanager.common.configs; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@AllArgsConstructor +public class UUIDFetcher { + @Getter + private final Fetcher idToName; + @Getter + private final Fetcher nameToId; +} + diff --git a/common/src/main/java/me/confuser/banmanager/common/configs/WarningActionsConfig.java b/common/src/main/java/me/confuser/banmanager/common/configs/WarningActionsConfig.java new file mode 100644 index 000000000..41f230d88 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/configs/WarningActionsConfig.java @@ -0,0 +1,123 @@ +package me.confuser.banmanager.common.configs; + +import lombok.Getter; +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.CommonLogger; +import me.confuser.banmanager.common.configuration.ConfigurationSection; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.util.DateUtils; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class WarningActionsConfig { + + @Getter + private boolean isEnabled = false; + private HashMap> actions; + + public WarningActionsConfig(ConfigurationSection config, CommonLogger logger) { + isEnabled = config.getBoolean("enabled", false); + actions = new HashMap<>(); + + if (!isEnabled) return; + + ConfigurationSection actionsConf = config.getConfigurationSection("actions"); + + if (actionsConf == null) return; + + for (String amount : actionsConf.getKeys(false)) { + double amountDbl; + + try { + amountDbl = Double.parseDouble(amount); + } catch (NumberFormatException e) { + logger.warning("Invalid warning action, " + amount + " is not numeric"); + continue; + } + + // New check + List> mapList = actionsConf.getMapList(amount); + if (mapList != null && mapList.size() != 0) { + List actionCommands = new ArrayList<>(mapList.size()); + + for (Map map : mapList) { + if (map.get("cmd") == null) { + logger.severe("Missing cmd from warningActions " + amount); + continue; + } + + long delay = 0; + + if (map.get("delay") != null) { + try { + delay = Long.valueOf((Integer) map.get("delay")); + } catch (NumberFormatException e) { + logger.severe("Invalid delay for " + map.get("cmd")); + continue; + } + + delay = delay * 20L; // Convert from seconds to ticks + } + + String timeframe = ""; + + if (map.get("pointsTimeframe") != null) { + try { + DateUtils.parseDateDiff(timeframe, false); + + timeframe = (String) map.get("pointsTimeframe"); + } catch (Exception e) { + logger.severe("Invalid pointsTimeframe for " + map.get("cmd")); + continue; + } + } + + actionCommands.add(new ActionCommand((String) map.get("cmd"), delay, timeframe)); + } + + this.actions.put(amountDbl, actionCommands); + } else { + List actions = actionsConf.getStringList(amount); + if (actions.size() == 0) continue; + + logger + .warning("warningActions amount " + amount + " is using a deprecated list, please use new cmd and delay syntax"); + List actionCommands = new ArrayList<>(actions.size()); + + for (String action : actions) { + actionCommands.add(new ActionCommand(action, 0, "")); + } + + this.actions.put(amountDbl, actionCommands); + } + } + } + + public List getCommands(PlayerData player, double overallPoints) { + List commands = new ArrayList<>(); + + for (Map.Entry> entry : actions.entrySet()) { + for (ActionCommand actionCommand : entry.getValue()) { + double totalPoints = overallPoints; + + if (!actionCommand.getPointsTimeframe().isEmpty()) { + try { + totalPoints = BanManagerPlugin.getInstance().getPlayerWarnStorage().getPointsCount(player, DateUtils.parseDateDiff(actionCommand.getPointsTimeframe(), false)); + } catch (Exception e) { + e.printStackTrace(); + } + } + + if (totalPoints == entry.getKey()) { + commands.add(actionCommand); + } + } + } + + return commands; + } + +} diff --git a/common/src/main/java/me/confuser/banmanager/common/configuration/Configuration.java b/common/src/main/java/me/confuser/banmanager/common/configuration/Configuration.java new file mode 100644 index 000000000..f2a00bda3 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/configuration/Configuration.java @@ -0,0 +1,77 @@ +package me.confuser.banmanager.common.configuration; + +import java.util.Map; + +/** + * Represents a source of configurable options and settings. + */ +public interface Configuration extends ConfigurationSection { + /** + * Sets the default value of the given path as provided. + *

If no source {@link Configuration} was provided as a default + * collection, then a new {@link MemoryConfiguration} will be created to + * hold the new default value.

+ *

If value is null, the value will be removed from the default + * Configuration source.

+ * + * @param path Path of the value to set. + * @param value Value to set the default to. + * @throws IllegalArgumentException Thrown if path is null. + */ + @Override void addDefault(String path, Object value); + + /** + * Sets the default values of the given paths as provided. + *

If no source {@link Configuration} was provided as a default + * collection, then a new {@link MemoryConfiguration} will be created to + * hold the new default values.

+ * + * @param defaults A map of Path->Values to add to defaults. + * @throws IllegalArgumentException Thrown if defaults is null. + */ + void addDefaults(Map defaults); + + /** + * Sets the default values of the given paths as provided. + *

If no source {@link Configuration} was provided as a default + * collection, then a new {@link MemoryConfiguration} will be created to + * hold the new default value.

+ *

This method will not hold a reference to the specified Configuration, + * nor will it automatically update if that Configuration ever changes. If + * you check this, you should set the default source with {@link + * #setDefaults(Configuration)}.

+ * + * @param defaults A configuration holding a list of defaults to copy. + * @throws IllegalArgumentException Thrown if defaults is null or this. + */ + void addDefaults(Configuration defaults); + + /** + * Gets the source {@link Configuration} for this configuration. + * If no configuration source was set, but default values were added, then + * a {@link MemoryConfiguration} will be returned. If no source was set + * and no defaults were set, then this method will return null. + * + * @return Configuration source for default values, or null if none exist. + */ + Configuration getDefaults(); + + /** + * Sets the source of all default values for this {@link Configuration}. + *

+ * If a previous source was set, or previous default values were defined, + * then they will not be copied to the new source.

+ * + * @param defaults New source of default values for this configuration. + * @throws IllegalArgumentException Thrown if defaults is null or this. + */ + void setDefaults(Configuration defaults); + + /** + * Gets the {@link ConfigurationOptions} for this {@link Configuration}. + *

All setters through this method are chainable.

+ * + * @return Options for this configuration + */ + ConfigurationOptions options(); +} diff --git a/common/src/main/java/me/confuser/banmanager/common/configuration/ConfigurationOptions.java b/common/src/main/java/me/confuser/banmanager/common/configuration/ConfigurationOptions.java new file mode 100644 index 000000000..a444bd1d1 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/configuration/ConfigurationOptions.java @@ -0,0 +1,90 @@ +package me.confuser.banmanager.common.configuration; + +/** + * Various settings for controlling the input and output of a {@link + * Configuration}. + */ +class ConfigurationOptions { + private final Configuration configuration; + private char pathSeparator = '.'; + private boolean copyDefaults = false; + + protected ConfigurationOptions(Configuration configuration) { + this.configuration = configuration; + } + + /** + * Returns the {@link Configuration} that this object is responsible for. + * + * @return Parent configuration + */ + public Configuration configuration() { + return configuration; + } + + /** + * Gets the char that will be used to separate {@link + * ConfigurationSection}s. + * + *

This value does not affect how the {@link Configuration} is stored, + * only in how you access the data. The default value is '.'. + * + * @return Path separator + */ + public char pathSeparator() { + return pathSeparator; + } + + /** + * Sets the char that will be used to separate {@link + * ConfigurationSection}s. + * + *

This value does not affect how the {@link Configuration} is stored, + * only in how you access the data. The default value is '.'. + * + * @param value Path separator + * @return This object, for chaining + */ + public ConfigurationOptions pathSeparator(char value) { + pathSeparator = value; + return this; + } + + /** + * Checks if the {@link Configuration} should copy values from its default + * {@link Configuration} directly. + * + *

If this is true, all values in the default Configuration will be + * directly copied, making it impossible to distinguish between values + * that were set and values that are provided by default. As a result, + * {@link ConfigurationSection#contains(String)} will always + * return the same value as {@link + * ConfigurationSection#isSet(String)}. The default value is + * false. + * + * @return Whether or not defaults are directly copied + */ + public boolean copyDefaults() { + return copyDefaults; + } + + /** + * Sets if the {@link Configuration} should copy values from its default + * {@link Configuration} directly. + * + *

If this is true, all values in the default Configuration will be + * directly copied, making it impossible to distinguish between values + * that were set and values that are provided by default. As a result, + * {@link ConfigurationSection#contains(String)} will always + * return the same value as {@link + * ConfigurationSection#isSet(String)}. The default value is + * false. + * + * @param value Whether or not defaults are directly copied + * @return This object, for chaining + */ + public ConfigurationOptions copyDefaults(boolean value) { + copyDefaults = value; + return this; + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/configuration/ConfigurationSection.java b/common/src/main/java/me/confuser/banmanager/common/configuration/ConfigurationSection.java new file mode 100644 index 000000000..bcb63cc33 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/configuration/ConfigurationSection.java @@ -0,0 +1,648 @@ +package me.confuser.banmanager.common.configuration; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * Represents a section of a {@link Configuration}. + */ +public interface ConfigurationSection { + + /** + * Gets a set containing all keys in this section. + * + *

If deep is set to true, then this will contain all the keys within any + * child {@link ConfigurationSection}s (and their children, etc). These + * will be in a valid path notation for you to use. + * + *

If deep is set to false, then this will contain only the keys of any + * direct children, and not their own children. + * + * @param deep Whether or not to get a deep list, as opposed to a shallow + * list. + * @return Set of keys contained within this ConfigurationSection. + */ + Set getKeys(boolean deep); + + /** + * Gets a Map containing all keys and their values for this section. + * + *

If deep is set to true, then this will contain all the keys and values + * within any child {@link ConfigurationSection}s (and their children, + * etc). These keys will be in a valid path notation for you to use. + * + *

If deep is set to false, then this will contain only the keys and + * values of any direct children, and not their own children. + * + * @param deep Whether or not to get a deep list, as opposed to a shallow + * list. + * @return Map of keys and values of this section. + */ + Map getValues(boolean deep); + + /** + * Checks if this {@link ConfigurationSection} contains the given path. + * + *

If the value for the requested path does not exist but a default value + * has been specified, this will return true. + * + * @param path Path to check for existence. + * @return True if this section contains the requested path, either via + * default or being set. + * @throws IllegalArgumentException Thrown when path is {@code null}. + */ + boolean contains(String path); + + /** + * Checks if this {@link ConfigurationSection} has a value set for the + * given path. + * + *

If the value for the requested path does not exist but a default value + * has been specified, this will still return false. + * + * @param path Path to check for existence. + * @return True if this section contains the requested path, regardless of + * having a default. + * @throws IllegalArgumentException Thrown when path is {@code null}. + */ + boolean isSet(String path); + + /** + * Gets the path of this {@link ConfigurationSection} from its root {@link + * Configuration}. + * + *

For any {@link Configuration} themselves, this will return an empty + * string. + * + *

If the section is no longer contained within its root for any reason, + * such as being replaced with a different value, + * this may return {@code null}. + * + *

To retrieve the single name of this section, that is, the final part + * of the path returned by this method, you may use {@link #getName()}. + * + * @return Path of this section relative to its root + */ + String getCurrentPath(); + + /** + * Gets the name of this individual {@link ConfigurationSection}, in the + * path. + * + *

This will always be the final part of {@link #getCurrentPath()}, unless + * the section is orphaned. + * + * @return Name of this section + */ + String getName(); + + /** + * Gets the root {@link Configuration} that contains this {@link + * ConfigurationSection} + * + *

For any {@link Configuration} themselves, this will return its own + * object. + * + *

If the section is no longer contained within its root for any reason, + * such as being replaced with a different value, + * this may return {@code null}. + * + * @return Root configuration containing this section. + */ + Configuration getRoot(); + + /** + * Gets the parent {@link ConfigurationSection} that directly contains + * this {@link ConfigurationSection}. + * + *

For any {@link Configuration} themselves, this will return + * {@code null}. + * + *

If the section is no longer contained within its parent for any + * reason, such as being replaced with a different value, this may + * return {@code null}. + * + * @return Parent section containing this section. + */ + ConfigurationSection getParent(); + + /** + * Gets the requested Object by path. + * + *

If the Object does not exist but a default value has been specified, + * this will return the default value. If the Object does not exist and no + * default value was specified, this will return {@code null}. + * + * @param path Path of the Object to get. + * @return Requested Object. + */ + Object get(String path); + + /** + * Gets the requested Object by path, returning a default value if not + * found. + * + *

If the Object does not exist then the specified default value will + * returned regardless of if a default has been identified in the root + * {@link Configuration}. + * + * @param path Path of the Object to get. + * @param defaultValue The default value to return if the path is not found. + * @return Requested Object. + */ + Object get(String path, Object defaultValue); + + /** + * Sets the specified path to the given value. + * + *

If value is {@code null}, the entry will be removed. Any + * existing entry will be replaced, regardless of what the new value is. + * + *

Some implementations may have limitations on what you may store. See + * their individual javadoc for details. No implementations should allow + * you to store {@link Configuration}s or {@link ConfigurationSection}s, + * please use {@link #createSection(String)} for that. + * + * @param path Path of the object to set. + * @param value New value to set the path to. + */ + void set(String path, Object value); + + /** + * Creates an empty {@link ConfigurationSection} at the specified path. + * + *

Any value that was previously set at this path will be overwritten. If + * the previous value was itself a {@link ConfigurationSection}, it will + * be orphaned. + * + * @param path Path to create the section at. + * @return Newly created section + */ + ConfigurationSection createSection(String path); + + /** + * Creates a {@link ConfigurationSection} at the specified path, with + * specified values. + * + *

Any value that was previously set at this path will be overwritten. If + * the previous value was itself a {@link ConfigurationSection}, it will + * be orphaned. + * + * @param path Path to create the section at. + * @param map The values to used. + * @return Newly created section + */ + ConfigurationSection createSection(String path, Map map); + + // Primitives + + /** + * Gets the requested String by path. + * + *

If the String does not exist but a default value has been specified, + * this will return the default value. If the String does not exist and no + * default value was specified, this will return {@code null}. + * + * @param path Path of the String to get. + * @return Requested String. + */ + String getString(String path); + + /** + * Gets the requested String by path, returning a default value if not + * found. + * + *

If the String does not exist then the specified default value will + * returned regardless of if a default has been identified in the root + * {@link Configuration}. + * + * @param path Path of the String to get. + * @param def The default value to return if the path is not found or is + * not a String. + * @return Requested String. + */ + String getString(String path, String def); + + /** + * Checks if the specified path is a String. + * + *

If the path exists but is not a String, this will return false. If + * the path does not exist, this will return false. If the path does not + * exist but a default value has been specified, this will check if that + * defaultvalue is a String and return appropriately. + * + * @param path Path of the String to check. + * @return Whether or not the specified path is a String. + */ + boolean isString(String path); + + /** + * Gets the requested int by path. + * + *

If the int does not exist but a default value has been specified, this + * will return the default value. If the int does not exist and no default + * value was specified, this will return 0. + * + * @param path Path of the int to get. + * @return Requested int. + */ + int getInt(String path); + + /** + * Gets the requested int by path, returning a default value if not found. + * + *

If the int does not exist then the specified default value will + * returned regardless of if a default has been identified in the root + * {@link Configuration}. + * + * @param path Path of the int to get. + * @param def The default value to return if the path is not found or is + * not an int. + * @return Requested int. + */ + int getInt(String path, int def); + + /** + * Checks if the specified path is an int. + * + *

If the path exists but is not a int, this will return false. If the + * path does not exist, this will return false. If the path does not exist + * but a default value has been specified, this will check if that default + * value is a int and return appropriately. + * + * @param path Path of the int to check. + * @return Whether or not the specified path is an int. + */ + boolean isInt(String path); + + /** + * Gets the requested boolean by path. + * + *

If the boolean does not exist but a default value has been specified, + * this will return the default value. If the boolean does not exist and + * no default value was specified, this will return false. + * + * @param path Path of the boolean to get. + * @return Requested boolean. + */ + boolean getBoolean(String path); + + /** + * Gets the requested boolean by path, returning a default value if not + * found. + * + *

If the boolean does not exist then the specified default value will + * returned regardless of if a default has been identified in the root + * {@link Configuration}. + * + * @param path Path of the boolean to get. + * @param defaultValue The default value to return if the path is not found or is + * not a boolean. + * @return Requested boolean. + */ + boolean getBoolean(String path, boolean defaultValue); + + /** + * Checks if the specified path is a boolean. + * + *

If the path exists but is not a boolean, this will return false. If the + * path does not exist, this will return false. If the path does not exist + * but a default value has been specified, this will check if that default + * value is a boolean and return appropriately. + * + * @param path Path of the boolean to check. + * @return Whether or not the specified path is a boolean. + */ + boolean isBoolean(String path); + + /** + * Gets the requested double by path. + * + *

If the double does not exist but a default value has been specified, + * this will return the default value. If the double does not exist and no + * default value was specified, this will return 0. + * + * @param path Path of the double to get. + * @return Requested double. + */ + double getDouble(String path); + + /** + * Gets the requested double by path, returning a default value if not + * found. + * + *

If the double does not exist then the specified default value will + * returned regardless of if a default has been identified in the root + * {@link Configuration}. + * + * @param path Path of the double to get. + * @param defaultValue The default value to return if the path is not found or is + * not a double. + * @return Requested double. + */ + double getDouble(String path, double defaultValue); + + /** + * Checks if the specified path is a double. + * + *

If the path exists but is not a double, this will return false. If the + * path does not exist, this will return false. If the path does not exist + * but a default value has been specified, this will check if that default + * value is a double and return appropriately. + * + * @param path Path of the double to check. + * @return Whether or not the specified path is a double. + */ + boolean isDouble(String path); + + /** + * Gets the requested long by path. + * + *

If the long does not exist but a default value has been specified, this + * will return the default value. If the long does not exist and no + * default value was specified, this will return 0. + * + * @param path Path of the long to get. + * @return Requested long. + */ + long getLong(String path); + + /** + * Gets the requested long by path, returning a default value if not + * found. + * + *

If the long does not exist then the specified default value will + * returned regardless of if a default has been identified in the root + * {@link Configuration}. + * + * @param path Path of the long to get. + * @param def The default value to return if the path is not found or is + * not a long. + * @return Requested long. + */ + long getLong(String path, long def); + + /** + * Checks if the specified path is a long. + * + *

If the path exists but is not a long, this will return false. If the + * path does not exist, this will return false. If the path does not exist + * but a default value has been specified, this will check if that default + * value is a long and return appropriately. + * + * @param path Path of the long to check. + * @return Whether or not the specified path is a long. + */ + boolean isLong(String path); + + // Java + + /** + * Gets the requested List by path. + * + *

If the List does not exist but a default value has been specified, this + * will return the default value. If the List does not exist and no + * default value was specified, this will return null. + * + * @param path Path of the List to get. + * @return Requested List. + */ + List getList(String path); + + /** + * Gets the requested List by path, returning a default value if not + * found. + * + *

If the List does not exist then the specified default value will + * returned regardless of if a default has been identified in the root + * {@link Configuration}. + * + * @param path Path of the List to get. + * @param def The default value to return if the path is not found or is + * not a List. + * @return Requested List. + */ + List getList(String path, List def); + + /** + * Checks if the specified path is a List. + * + *

If the path exists but is not a List, this will return false. If the + * path does not exist, this will return false. If the path does not exist + * but a default value has been specified, this will check if that default + * value is a List and return appropriately. + * + * @param path Path of the List to check. + * @return Whether or not the specified path is a List. + */ + boolean isList(String path); + + /** + * Gets the requested List of String by path. + * + *

If the List does not exist but a default value has been specified, + * this will return the default value. If the List does not exist and no + * default value was specified, this will return an empty List. + * + *

This method will attempt to cast any values into a String if possible, + * but may miss any values out if they are not compatible. + * + * @param path Path of the List to get. + * @return Requested List of String. + */ + List getStringList(String path); + + /** + * Gets the requested List of Integer by path. + * + *

If the List does not exist but a default value has been specified, + * this will return the default value. If the List does not exist and no + * default value was specified, this will return an empty List. + * + *

This method will attempt to cast any values into a Integer if + * possible, but may miss any values out if they are not compatible. + * + * @param path Path of the List to get. + * @return Requested List of Integer. + */ + List getIntegerList(String path); + + /** + * Gets the requested List of Boolean by path. + * + *

If the List does not exist but a default value has been specified, + * this will return the default value. If the List does not exist and no + * default value was specified, this will return an empty List. + * + *

This method will attempt to cast any values into a Boolean if + * possible, but may miss any values out if they are not compatible. + * + * @param path Path of the List to get. + * @return Requested List of Boolean. + */ + List getBooleanList(String path); + + /** + * Gets the requested List of Double by path. + * + *

If the List does not exist but a default value has been specified, + * this will return the default value. If the List does not exist and no + * default value was specified, this will return an empty List. + * + *

This method will attempt to cast any values into a Double if possible, + * but may miss any values out if they are not compatible. + * + * @param path Path of the List to get. + * @return Requested List of Double. + */ + List getDoubleList(String path); + + /** + * Gets the requested List of Float by path. + * + *

If the List does not exist but a default value has been specified, + * this will return the default value. If the List does not exist and no + * default value was specified, this will return an empty List. + * + *

This method will attempt to cast any values into a Float if possible, + * but may miss any values out if they are not compatible. + * + * @param path Path of the List to get. + * @return Requested List of Float. + */ + List getFloatList(String path); + + /** + * Gets the requested List of Long by path. + * + *

If the List does not exist but a default value has been specified, + * this will return the default value. If the List does not exist and no + * default value was specified, this will return an empty List. + * + *

This method will attempt to cast any values into a Long if possible, + * but may miss any values out if they are not compatible. + * + * @param path Path of the List to get. + * @return Requested List of Long. + */ + List getLongList(String path); + + /** + * Gets the requested List of Byte by path. + * + *

If the List does not exist but a default value has been specified, + * this will return the default value. If the List does not exist and no + * default value was specified, this will return an empty List. + * + *

This method will attempt to cast any values into a Byte if possible, + * but may miss any values out if they are not compatible. + * + * @param path Path of the List to get. + * @return Requested List of Byte. + */ + List getByteList(String path); + + /** + * Gets the requested List of Character by path. + * + *

If the List does not exist but a default value has been specified, + * this will return the default value. If the List does not exist and no + * default value was specified, this will return an empty List. + * + *

This method will attempt to cast any values into a Character if + * possible, but may miss any values out if they are not compatible. + * + * @param path Path of the List to get. + * @return Requested List of Character. + */ + List getCharacterList(String path); + + /** + * Gets the requested List of Short by path. + * + *

If the List does not exist but a default value has been specified, + * this will return the default value. If the List does not exist and no + * default value was specified, this will return an empty List. + * + *

This method will attempt to cast any values into a Short if + * possible, but may miss any values out if they are not compatible. + * + * @param path Path of the List to get. + * @return Requested List of Short. + */ + List getShortList(String path); + + /** + * Gets the requested List of Maps by path. + * + *

If the List does not exist but a default value has been specified, + * this will return the default value. If the List does not exist and no + * default value was specified, this will return an empty List. + *

This method will attempt to cast any values into a Map if possible, + * but may miss any values out if they are not compatible. + * + * @param path Path of the List to get. + * @return Requested List of Maps. + */ + List> getMapList(String path); + + /** + * Gets the requested ConfigurationSection by path. + * + *

If the ConfigurationSection does not exist but a default value has + * been specified, this will return the default value. If the + * ConfigurationSection does not exist and no default value was specified, + * this will return {@code null}. + * + * @param path Path of the ConfigurationSection to get. + * @return Requested ConfigurationSection. + */ + ConfigurationSection getConfigurationSection(String path); + + /** + * Checks if the specified path is a ConfigurationSection. + * + *

If the path exists but is not a ConfigurationSection, this will return + * false. If the path does not exist, this will return false. If the path + * does not exist but a default value has been specified, this will check + * if that default value is a ConfigurationSection and return + * appropriately. + * + * @param path Path of the ConfigurationSection to check. + * @return Whether or not the specified path is a ConfigurationSection. + */ + boolean isConfigurationSection(String path); + + /** + * Gets the equivalent {@link ConfigurationSection} from the default + * {@link Configuration} defined in {@link #getRoot()}. + * + *

If the root contains no defaults, or the defaults doesn't contain a + * value for this path, or the value at this path is not a {@link + * ConfigurationSection} then this will return {@code null}. + * + * @return Equivalent section in root configuration + */ + ConfigurationSection getDefaultSection(); + + /** + * Sets the default value in the root at the given path as provided. + * + *

If no source {@link Configuration} was provided as a default + * collection, then a new {@link MemoryConfiguration} will be created to + * hold the new default value. + * + *

If value is {@code null}, the value will be removed from the + * default Configuration source. + * + *

If the value as returned by {@link #getDefaultSection()} is + * {@code null}, then this will create a new section at the path, + * replacing anything that may have existed there previously. + * + * @param path Path of the value to set + * @param value Value to set the default to + * @throws IllegalArgumentException Thrown if path is {@code null} + */ + void addDefault(String path, Object value); +} diff --git a/common/src/main/java/me/confuser/banmanager/common/configuration/InvalidConfigurationException.java b/common/src/main/java/me/confuser/banmanager/common/configuration/InvalidConfigurationException.java new file mode 100644 index 000000000..018e9238b --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/configuration/InvalidConfigurationException.java @@ -0,0 +1,45 @@ +package me.confuser.banmanager.common.configuration; + +/** + * Exception thrown when attempting to load an invalid {@link Configuration}. + */ +@SuppressWarnings("serial") public class InvalidConfigurationException extends Exception { + + /** + * Creates a new instance of InvalidConfigurationException without a + * message or cause. + */ + public InvalidConfigurationException() { + } + + /** + * Constructs an instance of InvalidConfigurationException with the + * specified message. + * + * @param msg The details of the exception. + */ + public InvalidConfigurationException(String msg) { + super(msg); + } + + /** + * Constructs an instance of InvalidConfigurationException with the + * specified cause. + * + * @param cause The cause of the exception. + */ + public InvalidConfigurationException(Throwable cause) { + super(cause); + } + + /** + * Constructs an instance of InvalidConfigurationException with the + * specified message and cause. + * + * @param cause The cause of the exception. + * @param msg The details of the exception. + */ + public InvalidConfigurationException(String msg, Throwable cause) { + super(msg, cause); + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/configuration/MemoryConfiguration.java b/common/src/main/java/me/confuser/banmanager/common/configuration/MemoryConfiguration.java new file mode 100644 index 000000000..8a3eb759d --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/configuration/MemoryConfiguration.java @@ -0,0 +1,72 @@ +package me.confuser.banmanager.common.configuration; + +import java.util.Map; + +/** + * This is a {@link Configuration} implementation that does not save or load + * from any source, and stores all values in memory only. + * This is useful for temporary Configurations for providing defaults. + */ +public class MemoryConfiguration extends MemorySection implements Configuration { + protected Configuration defaults; + protected MemoryConfigurationOptions options; + + /** + * Creates an empty {@link MemoryConfiguration} with no default values. + */ + public MemoryConfiguration() { + } + + /** + * Creates an empty {@link MemoryConfiguration} using the specified {@link + * Configuration} as a source for all default values. + * + * @param defaults Default value provider + * @throws IllegalArgumentException Thrown if defaults is null + */ + public MemoryConfiguration(Configuration defaults) { + this.defaults = defaults; + } + + @Override public void addDefault(String path, Object value) { + if (this.defaults == null) { + this.defaults = new MemoryConfiguration(); + } + + this.defaults.set(path, value); + } + + @Override public void addDefaults(Map defaults) { + for (Map.Entry entry : defaults.entrySet()) { + addDefault(entry.getKey(), entry.getValue()); + } + } + + @Override public void addDefaults(Configuration defaults) { + addDefaults(defaults.getValues(true)); + } + + @Override public Configuration getDefaults() { + return this.defaults; + } + + @Override public void setDefaults(Configuration defaults) { + if (defaults == null) { + throw new NullPointerException("Defaults may not be null"); + } + + this.defaults = defaults; + } + + @Override public ConfigurationSection getParent() { + return null; + } + + @Override public MemoryConfigurationOptions options() { + if (this.options == null) { + this.options = new MemoryConfigurationOptions(this); + } + + return this.options; + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/configuration/MemoryConfigurationOptions.java b/common/src/main/java/me/confuser/banmanager/common/configuration/MemoryConfigurationOptions.java new file mode 100644 index 000000000..b11466115 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/configuration/MemoryConfigurationOptions.java @@ -0,0 +1,25 @@ +package me.confuser.banmanager.common.configuration; + +/** + * Various settings for controlling the input and output of a {@link + * MemoryConfiguration}. + */ +public class MemoryConfigurationOptions extends ConfigurationOptions { + protected MemoryConfigurationOptions(MemoryConfiguration configuration) { + super(configuration); + } + + @Override public MemoryConfiguration configuration() { + return (MemoryConfiguration) super.configuration(); + } + + @Override public MemoryConfigurationOptions copyDefaults(boolean value) { + super.copyDefaults(value); + return this; + } + + @Override public MemoryConfigurationOptions pathSeparator(char value) { + super.pathSeparator(value); + return this; + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/configuration/MemorySection.java b/common/src/main/java/me/confuser/banmanager/common/configuration/MemorySection.java new file mode 100644 index 000000000..a961b3f61 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/configuration/MemorySection.java @@ -0,0 +1,777 @@ +package me.confuser.banmanager.common.configuration; + +import java.util.*; + +/** + * A type of {@link ConfigurationSection} that is stored in memory. + */ +public class MemorySection implements ConfigurationSection { + + protected final Map map = new LinkedHashMap<>(); + private final Configuration root; + private final ConfigurationSection parent; + private final String path; + private final String fullPath; + + /** + * Creates an empty MemorySection for use as a root {@link Configuration} + * section. + * + *

Note that calling this without being yourself a {@link Configuration} + * will throw an exception! + * + * @throws IllegalStateException Thrown if this is not a {@link + * Configuration} root. + */ + protected MemorySection() { + if (!(this instanceof Configuration)) { + throw new IllegalStateException( + "Cannot construct a root MemorySection when not a Configuration"); + } + + this.path = ""; + this.fullPath = ""; + this.parent = null; + this.root = (Configuration) this; + } + + /** + * Creates an empty MemorySection with the specified parent and path. + * + * @param parent Parent section that contains this own section. + * @param path Path that you may access this section from via the root + * {@link Configuration}. + * @throws IllegalArgumentException Thrown is parent or path is null, or + * if parent contains no root Configuration. + */ + protected MemorySection(ConfigurationSection parent, String path) { + this.path = path; + this.parent = parent; + this.root = parent.getRoot(); + + if (this.root == null) { + throw new NullPointerException("Path may not be orphaned"); + } + + this.fullPath = createPath(parent, path); + } + + public static double toDouble(Object obj, double def) { + if (obj instanceof Number) { + return ((Number) obj).doubleValue(); + } + if (obj instanceof String) { + try { + return Double.parseDouble((String) obj); + } catch (NumberFormatException ignored) { + } + } else if (obj instanceof List) { + List val = (List) obj; + if (!val.isEmpty()) { + return toDouble(val.get(0), def); + } + } + return def; + } + + public static int toInt(Object obj, int def) { + if (obj instanceof Number) { + return ((Number) obj).intValue(); + } + if (obj instanceof String) { + try { + return Integer.parseInt((String) obj); + } catch (NumberFormatException ignored) { + } + } else if (obj instanceof List) { + List val = (List) obj; + if (!val.isEmpty()) { + return toInt(val.get(0), def); + } + } + return def; + } + + public static long toLong(Object obj, long def) { + if (obj instanceof Number) { + return ((Number) obj).longValue(); + } + if (obj instanceof String) { + try { + return Long.parseLong((String) obj); + } catch (NumberFormatException ignored) { + } + } else if (obj instanceof List) { + List val = (List) obj; + if (!val.isEmpty()) { + return toLong(val.get(0), def); + } + } + return def; + } + + /** + * Creates a full path to the given {@link ConfigurationSection} from its + * root {@link Configuration}. + * + *

You may use this method for any given {@link ConfigurationSection}, not + * only {@link MemorySection}. + * + * @param section Section to create a path for. + * @param key Name of the specified section. + * @return Full path of the section from its root. + */ + public static String createPath(ConfigurationSection section, String key) { + return createPath(section, key, section.getRoot()); + } + + /** + * Creates a relative path to the given {@link ConfigurationSection} from + * the given relative section. + * + *

You may use this method for any given {@link ConfigurationSection}, not + * only {@link MemorySection}. + * + * @param section Section to create a path for. + * @param key Name of the specified section. + * @param relativeTo Section to create the path relative to. + * @return Full path of the section from its root. + */ + public static String createPath(ConfigurationSection section, String key, + ConfigurationSection relativeTo) { + Configuration root = section.getRoot(); + if (root == null) { + throw new IllegalStateException("Cannot create path without a root"); + } + char separator = root.options().pathSeparator(); + + StringBuilder builder = new StringBuilder(); + for (ConfigurationSection parent = section; + (parent != null) && (parent != relativeTo); parent = parent.getParent()) { + if (builder.length() > 0) { + builder.insert(0, separator); + } + + builder.insert(0, parent.getName()); + } + + if ((key != null) && !key.isEmpty()) { + if (builder.length() > 0) { + builder.append(separator); + } + + builder.append(key); + } + + return builder.toString(); + } + + @Override public Set getKeys(boolean deep) { + Set result = new LinkedHashSet<>(); + + Configuration root = getRoot(); + if ((root != null) && root.options().copyDefaults()) { + ConfigurationSection defaults = getDefaultSection(); + + if (defaults != null) { + result.addAll(defaults.getKeys(deep)); + } + } + + mapChildrenKeys(result, this, deep); + + return result; + } + + @Override public Map getValues(boolean deep) { + Map result = new LinkedHashMap<>(); + + Configuration root = getRoot(); + if ((root != null) && root.options().copyDefaults()) { + ConfigurationSection defaults = getDefaultSection(); + + if (defaults != null) { + result.putAll(defaults.getValues(deep)); + } + } + + mapChildrenValues(result, this, deep); + + return result; + } + + @Override public boolean contains(String path) { + return get(path) != null; + } + + @Override public boolean isSet(String path) { + Configuration root = getRoot(); + if (root == null) { + return false; + } + if (root.options().copyDefaults()) { + return contains(path); + } + return get(path, null) != null; + } + + @Override public String getCurrentPath() { + return this.fullPath; + } + + @Override public String getName() { + return this.path; + } + + @Override public Configuration getRoot() { + return this.root; + } + + @Override public ConfigurationSection getParent() { + return this.parent; + } + + @Override public void addDefault(String path, Object value) { + Configuration root = getRoot(); + if (root == null) { + throw new IllegalStateException("Cannot add default without root"); + } + if (root == this) { + throw new UnsupportedOperationException( + "Unsupported addDefault(String, Object) implementation"); + } + root.addDefault(createPath(this, path), value); + } + + @Override public ConfigurationSection getDefaultSection() { + Configuration root = getRoot(); + Configuration defaults = root == null ? null : root.getDefaults(); + + if (defaults != null) { + if (defaults.isConfigurationSection(getCurrentPath())) { + return defaults.getConfigurationSection(getCurrentPath()); + } + } + + return null; + } + + @Override public void set(String path, Object value) { + Configuration root = getRoot(); + if (root == null) { + throw new IllegalStateException("Cannot use section without a root"); + } + + char separator = root.options().pathSeparator(); + // i1 is the leading (higher) index + // i2 is the trailing (lower) index + int i1 = -1; + int i2; + ConfigurationSection section = this; + while ((i1 = path.indexOf(separator, i2 = i1 + 1)) != -1) { + String node = path.substring(i2, i1); + ConfigurationSection subSection = section.getConfigurationSection(node); + if (subSection == null) { + section = section.createSection(node); + } else { + section = subSection; + } + } + + String key = path.substring(i2); + if (section == this) { + if (value == null) { + this.map.remove(key); + } else { + this.map.put(key, value); + } + } else { + section.set(key, value); + } + } + + @Override public Object get(String path) { + return get(path, getDefault(path)); + } + + @Override public Object get(String path, Object defaultValue) { + if (path == null) { + throw new NullPointerException("Path cannot be null"); + } + + if (path.isEmpty()) { + return this; + } + + Configuration root = getRoot(); + if (root == null) { + throw new IllegalStateException("Cannot access section without a root"); + } + + char separator = root.options().pathSeparator(); + // i1 is the leading (higher) index + // i2 is the trailing (lower) index + int i1 = -1; + int i2; + ConfigurationSection section = this; + while ((i1 = path.indexOf(separator, i2 = i1 + 1)) != -1) { + section = section.getConfigurationSection(path.substring(i2, i1)); + if (section == null) { + return defaultValue; + } + } + + String key = path.substring(i2); + if (section == this) { + Object result = this.map.get(key); + if (result == null) { + return defaultValue; + } else { + return result; + } + } + return section.get(key, defaultValue); + } + + @Override public ConfigurationSection createSection(String path) { + Configuration root = getRoot(); + if (root == null) { + throw new IllegalStateException("Cannot create section without a root"); + } + + char separator = root.options().pathSeparator(); + // i1 is the leading (higher) index + // i2 is the trailing (lower) index + int i1 = -1; + int i2; + ConfigurationSection section = this; + while ((i1 = path.indexOf(separator, i2 = i1 + 1)) != -1) { + String node = path.substring(i2, i1); + ConfigurationSection subSection = section.getConfigurationSection(node); + if (subSection == null) { + section = section.createSection(node); + } else { + section = subSection; + } + } + + String key = path.substring(i2); + if (section == this) { + ConfigurationSection result = new MemorySection(this, key); + this.map.put(key, result); + return result; + } + return section.createSection(key); + } + + @Override public ConfigurationSection createSection(String path, Map map) { + ConfigurationSection section = createSection(path); + + for (Map.Entry entry : map.entrySet()) { + if (entry.getValue() instanceof Map) { + section.createSection(entry.getKey().toString(), (Map) entry.getValue()); + } else { + section.set(entry.getKey().toString(), entry.getValue()); + } + } + + return section; + } + + // Primitives + @Override public String getString(String path) { + Object def = getDefault(path); + return getString(path, def != null ? def.toString() : null); + } + + @Override public String getString(String path, String def) { + Object val = get(path, def); + if (val != null) { + return val.toString(); + } else { + return def; + } + } + + @Override public boolean isString(String path) { + Object val = get(path); + return val instanceof String; + } + + @Override public int getInt(String path) { + Object def = getDefault(path); + return getInt(path, toInt(def, 0)); + } + + @Override public int getInt(String path, int def) { + Object val = get(path, def); + return toInt(val, def); + } + + @Override public boolean isInt(String path) { + Object val = get(path); + return val instanceof Integer; + } + + @Override public boolean getBoolean(String path) { + Object def = getDefault(path); + if (def instanceof Boolean) { + return getBoolean(path, (Boolean) def); + } else { + return getBoolean(path, false); + } + } + + @Override public boolean getBoolean(String path, boolean defaultValue) { + Object val = get(path, defaultValue); + if (val instanceof Boolean) { + return (Boolean) val; + } else { + return defaultValue; + } + } + + @Override public boolean isBoolean(String path) { + Object val = get(path); + return val instanceof Boolean; + } + + @Override public double getDouble(String path) { + Object def = getDefault(path); + return getDouble(path, toDouble(def, 0)); + } + + @Override public double getDouble(String path, double defaultValue) { + Object val = get(path, defaultValue); + return toDouble(val, defaultValue); + } + + @Override public boolean isDouble(String path) { + Object val = get(path); + return val instanceof Double; + } + + @Override public long getLong(String path) { + Object def = getDefault(path); + return getLong(path, toLong(def, 0)); + } + + @Override public long getLong(String path, long def) { + Object val = get(path, def); + return toLong(val, def); + } + + @Override public boolean isLong(String path) { + Object val = get(path); + return val instanceof Long; + } + + // Java + @Override public List getList(String path) { + Object def = getDefault(path); + return getList(path, def instanceof List ? (List) def : new ArrayList<>()); + } + + @Override public List getList(String path, List def) { + Object val = get(path, def); + return (List) ((val instanceof List) ? val : def); + } + + @Override public boolean isList(String path) { + Object val = get(path); + return val instanceof List; + } + + @Override public List getStringList(String path) { + List list = getList(path); + + if (list == null) { + return new ArrayList<>(0); + } + + List result = new ArrayList<>(); + + for (Object object : list) { + if ((object instanceof String) || isPrimitiveWrapper(object)) { + result.add(String.valueOf(object)); + } + } + + return result; + } + + @Override public List getIntegerList(String path) { + List list = getList(path); + + List result = new ArrayList<>(); + + for (Object object : list) { + if (object instanceof Integer) { + result.add((Integer) object); + } else if (object instanceof String) { + try { + result.add(Integer.valueOf((String) object)); + } catch (NumberFormatException ignored) { + } + } else if (object instanceof Character) { + result.add((int) (Character) object); + } else if (object instanceof Number) { + result.add(((Number) object).intValue()); + } + } + + return result; + } + + @Override public List getBooleanList(String path) { + List list = getList(path); + + List result = new ArrayList<>(); + + for (Object object : list) { + if (object instanceof Boolean) { + result.add((Boolean) object); + } else if (object instanceof String) { + if (Boolean.TRUE.toString().equals(object)) { + result.add(true); + } else if (Boolean.FALSE.toString().equals(object)) { + result.add(false); + } + } + } + + return result; + } + + @Override public List getDoubleList(String path) { + List list = getList(path); + + List result = new ArrayList<>(); + + for (Object object : list) { + if (object instanceof Double) { + result.add((Double) object); + } else if (object instanceof String) { + try { + result.add(Double.valueOf((String) object)); + } catch (NumberFormatException ignored) { + } + } else if (object instanceof Character) { + result.add((double) (Character) object); + } else if (object instanceof Number) { + result.add(((Number) object).doubleValue()); + } + } + + return result; + } + + @Override public List getFloatList(String path) { + List list = getList(path); + + List result = new ArrayList<>(); + + for (Object object : list) { + if (object instanceof Float) { + result.add((Float) object); + } else if (object instanceof String) { + try { + result.add(Float.valueOf((String) object)); + } catch (NumberFormatException ignored) { + } + } else if (object instanceof Character) { + result.add((float) (Character) object); + } else if (object instanceof Number) { + result.add(((Number) object).floatValue()); + } + } + + return result; + } + + @Override public List getLongList(String path) { + List list = getList(path); + + List result = new ArrayList<>(); + + for (Object object : list) { + if (object instanceof Long) { + result.add((Long) object); + } else if (object instanceof String) { + try { + result.add(Long.valueOf((String) object)); + } catch (NumberFormatException ignored) { + } + } else if (object instanceof Character) { + result.add((long) (Character) object); + } else if (object instanceof Number) { + result.add(((Number) object).longValue()); + } + } + + return result; + } + + @Override public List getByteList(String path) { + List list = getList(path); + + List result = new ArrayList<>(); + + for (Object object : list) { + if (object instanceof Byte) { + result.add((Byte) object); + } else if (object instanceof String) { + try { + result.add(Byte.valueOf((String) object)); + } catch (NumberFormatException ignored) { + } + } else if (object instanceof Character) { + result.add((byte) ((Character) object).charValue()); + } else if (object instanceof Number) { + result.add(((Number) object).byteValue()); + } + } + + return result; + } + + @Override public List getCharacterList(String path) { + List list = getList(path); + + List result = new ArrayList<>(); + + for (Object object : list) { + if (object instanceof Character) { + result.add((Character) object); + } else if (object instanceof String) { + String str = (String) object; + + if (str.length() == 1) { + result.add(str.charAt(0)); + } + } else if (object instanceof Number) { + result.add((char) ((Number) object).intValue()); + } + } + + return result; + } + + @Override public List getShortList(String path) { + List list = getList(path); + + List result = new ArrayList<>(); + + for (Object object : list) { + if (object instanceof Short) { + result.add((Short) object); + } else if (object instanceof String) { + try { + result.add(Short.valueOf((String) object)); + } catch (NumberFormatException ignored) { + } + } else if (object instanceof Character) { + result.add((short) ((Character) object).charValue()); + } else if (object instanceof Number) { + result.add(((Number) object).shortValue()); + } + } + + return result; + } + + @Override public List> getMapList(String path) { + List list = getList(path); + List> result = new ArrayList<>(); + + for (Object object : list) { + if (object instanceof Map) { + result.add((Map) object); + } + } + + return result; + } + + @Override public ConfigurationSection getConfigurationSection(String path) { + Object val = get(path, null); + if (val != null) { + return (val instanceof ConfigurationSection) ? (ConfigurationSection) val : null; + } + + val = get(path, getDefault(path)); + return (val instanceof ConfigurationSection) ? createSection(path) : null; + } + + @Override public boolean isConfigurationSection(String path) { + Object val = get(path); + return val instanceof ConfigurationSection; + } + + protected boolean isPrimitiveWrapper(Object input) { + return (input instanceof Integer) || (input instanceof Boolean) + || (input instanceof Character) || (input instanceof Byte) || (input instanceof Short) + || (input instanceof Double) || (input instanceof Long) || (input instanceof Float); + } + + protected Object getDefault(String path) { + Configuration root = getRoot(); + Configuration defaults = root == null ? null : root.getDefaults(); + return (defaults == null) ? null : defaults.get(createPath(this, path)); + } + + protected void mapChildrenKeys(Set output, ConfigurationSection section, boolean deep) { + if (section instanceof MemorySection) { + MemorySection sec = (MemorySection) section; + + for (Map.Entry entry : sec.map.entrySet()) { + output.add(createPath(section, entry.getKey(), this)); + + if (deep && (entry.getValue() instanceof ConfigurationSection)) { + ConfigurationSection subsection = (ConfigurationSection) entry.getValue(); + mapChildrenKeys(output, subsection, deep); + } + } + } else { + Set keys = section.getKeys(deep); + + for (String key : keys) { + output.add(createPath(section, key, this)); + } + } + } + + protected void mapChildrenValues(Map output, ConfigurationSection section, + boolean deep) { + if (section instanceof MemorySection) { + MemorySection sec = (MemorySection) section; + + for (Map.Entry entry : sec.map.entrySet()) { + output.put(createPath(section, entry.getKey(), this), entry.getValue()); + + if (entry.getValue() instanceof ConfigurationSection) { + if (deep) { + mapChildrenValues(output, (ConfigurationSection) entry.getValue(), deep); + } + } + } + } else { + Map values = section.getValues(deep); + + for (Map.Entry entry : values.entrySet()) { + output.put(createPath(section, entry.getKey(), this), entry.getValue()); + } + } + } + + @Override public String toString() { + Configuration root = getRoot(); + if (root == null) { + return getClass().getSimpleName() + "[path='" + getCurrentPath() + "', root='" + null + + "']"; + } else { + return getClass().getSimpleName() + "[path='" + getCurrentPath() + "', root='" + root + .getClass().getSimpleName() + "']"; + } + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/configuration/file/FileConfiguration.java b/common/src/main/java/me/confuser/banmanager/common/configuration/file/FileConfiguration.java new file mode 100644 index 000000000..014720bda --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/configuration/file/FileConfiguration.java @@ -0,0 +1,151 @@ +package me.confuser.banmanager.common.configuration.file; + +import me.confuser.banmanager.common.configuration.Configuration; +import me.confuser.banmanager.common.configuration.InvalidConfigurationException; +import me.confuser.banmanager.common.configuration.MemoryConfiguration; + +import java.io.*; +import java.nio.charset.StandardCharsets; +import java.util.stream.Collectors; + +/** + * This is a base class for all File based implementations of {@link + * Configuration}. + */ +public abstract class FileConfiguration extends MemoryConfiguration { + + /** + * Creates an empty FileConfiguration with no default values. + */ + FileConfiguration() { + } + + /** + * Creates an empty FileConfiguration using the specified {@link + * Configuration} as a source for all default values. + * + * @param defaults Default value provider + */ + public FileConfiguration(Configuration defaults) { + super(defaults); + } + + /** + * Saves this FileConfiguration to the specified location. + *

If the file does not exist, it will be created. If already exists, it + * will be overwritten. If it cannot be overwritten or created, an + * exception will be thrown. + *

This method will save using the system default encoding, or possibly + * using UTF8. + * + * @param file File to save to. + * + * @throws IOException Thrown when the given file cannot be written to for + * any reason. + */ + public void save(File file) throws IOException { + File parent = file.getParentFile(); + if (parent != null) { + parent.mkdirs(); + } + + String data = saveToString(); + + try (Writer writer = new OutputStreamWriter(new FileOutputStream(file), + StandardCharsets.UTF_8)) { + writer.write(data); + } + } + + /** + * Saves this FileConfiguration to a string, and returns it. + * + * @return String containing this configuration. + */ + public abstract String saveToString(); + + /** + * Loads this FileConfiguration from the specified location. + *

All the values contained within this configuration will be removed, + * leaving only settings and defaults, and the new values will be loaded + * from the given file. + *

If the file cannot be loaded for any reason, an exception will be + * thrown. + * + * @param file File to load from. + * + * @throws FileNotFoundException Thrown when the given file cannot be + * opened. + * @throws IOException Thrown when the given file cannot be read. + * @throws InvalidConfigurationException Thrown when the given file is not + * a valid Configuration. + * @throws IllegalArgumentException Thrown when file is null. + */ + public void load(File file) throws IOException, InvalidConfigurationException { + + try (FileInputStream stream = new FileInputStream(file)) { + load(new InputStreamReader(stream, StandardCharsets.UTF_8)); + } + } + + /** + * Loads this FileConfiguration from the specified reader. + *

All the values contained within this configuration will be removed, + * leaving only settings and defaults, and the new values will be loaded + * from the given stream.

+ * + * @param reader the reader to load from + * + * @throws IOException thrown when underlying reader throws an IOException + * @throws InvalidConfigurationException thrown when the reader does not + * represent a valid Configuration + */ + public void load(Reader reader) throws IOException, InvalidConfigurationException { + + String builder; + + try (BufferedReader input = reader instanceof BufferedReader ? + (BufferedReader) reader : + new BufferedReader(reader)) { + + builder = input.lines().map(line -> line + '\n').collect(Collectors.joining()); + } + + loadFromString(builder); + } + + /** + * Loads this FileConfiguration from the specified string, as + * opposed to from file. + *

All the values contained within this configuration will be removed, + * leaving only settings and defaults, and the new values will be loaded + * from the given string. + *

If the string is invalid in any way, an exception will be thrown.

+ * + * @param contents Contents of a Configuration to load. + * + * @throws InvalidConfigurationException Thrown if the specified string is + * invalid. + */ + public abstract void loadFromString(String contents) throws InvalidConfigurationException; + + /** + * Compiles the header for this FileConfiguration and returns the + * result. + *

This will use the header from {@link #options()} -> {@link + * FileConfigurationOptions#header()}, respecting the rules of {@link + * FileConfigurationOptions#copyHeader()} if set.

+ * + * @return Compiled header + */ + protected abstract String buildHeader(); + + @Override + public FileConfigurationOptions options() { + if (this.options == null) { + this.options = new FileConfigurationOptions(this); + } + + return (FileConfigurationOptions) this.options; + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/configuration/file/FileConfigurationOptions.java b/common/src/main/java/me/confuser/banmanager/common/configuration/file/FileConfigurationOptions.java new file mode 100644 index 000000000..7a512ad6b --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/configuration/file/FileConfigurationOptions.java @@ -0,0 +1,115 @@ +package me.confuser.banmanager.common.configuration.file; + +import me.confuser.banmanager.common.configuration.Configuration; +import me.confuser.banmanager.common.configuration.MemoryConfiguration; +import me.confuser.banmanager.common.configuration.MemoryConfigurationOptions; + +/** + * Various settings for controlling the input and output of a {@link + * FileConfiguration}. + */ +public class FileConfigurationOptions extends MemoryConfigurationOptions { + private String header = null; + private boolean copyHeader = true; + + protected FileConfigurationOptions(MemoryConfiguration configuration) { + super(configuration); + } + + @Override public FileConfiguration configuration() { + return (FileConfiguration) super.configuration(); + } + + @Override public FileConfigurationOptions copyDefaults(boolean value) { + super.copyDefaults(value); + return this; + } + + @Override public FileConfigurationOptions pathSeparator(char value) { + super.pathSeparator(value); + return this; + } + + /** + * Gets the header that will be applied to the top of the saved output. + * + *

This header will be commented out and applied directly at the top of + * the generated output of the {@link FileConfiguration}. It is not + * required to include a newline at the end of the header as it will + * automatically be applied, but you may include one if you wish for extra + * spacing. + * + *

{@code null} is a valid value which will indicate that no header] + * is to be applied. The default value is {@code null}. + * + * @return Header + */ + public String header() { + return header; + } + + /** + * Sets the header that will be applied to the top of the saved output. + * + *

This header will be commented out and applied directly at the top of + * the generated output of the {@link FileConfiguration}. It is not + * required to include a newline at the end of the header as it will + * automatically be applied, but you may include one if you wish for extra + * spacing. + * + *

{@code null} is a valid value which will indicate that no header + * is to be applied. + * + * @param value New header + * @return This object, for chaining + */ + public FileConfigurationOptions header(String value) { + header = value; + return this; + } + + /** + * Gets whether or not the header should be copied from a default source. + * + *

If this is true, if a default {@link FileConfiguration} is passed to + * {@link FileConfiguration#setDefaults(Configuration)} + * then upon saving it will use the header from that config, instead of + * the one provided here. + * + *

If no default is set on the configuration, or the default is not of + * type FileConfiguration, or that config has no header ({@link #header()} + * returns null) then the header specified in this configuration will be + * used. + * + *

Defaults to true. + * + * @return Whether or not to copy the header + */ + public boolean copyHeader() { + return copyHeader; + } + + /** + * Sets whether or not the header should be copied from a default source. + * + *

If this is true, if a default {@link FileConfiguration} is passed to + * {@link FileConfiguration#setDefaults(Configuration)} + * then upon saving it will use the header from that config, instead of + * the one provided here. + * + *

If no default is set on the configuration, or the default is not of + * type FileConfiguration, or that config has no header ({@link #header()} + * returns null) then the header specified in this configuration will be + * used. + * + *

Defaults to true. + * + * @param value Whether or not to copy the header + * @return This object, for chaining + */ + public FileConfigurationOptions copyHeader(boolean value) { + copyHeader = value; + + return this; + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/configuration/file/YamlConfiguration.java b/common/src/main/java/me/confuser/banmanager/common/configuration/file/YamlConfiguration.java new file mode 100644 index 000000000..69a533b76 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/configuration/file/YamlConfiguration.java @@ -0,0 +1,200 @@ +package me.confuser.banmanager.common.configuration.file; + +import me.confuser.banmanager.common.configuration.Configuration; +import me.confuser.banmanager.common.configuration.ConfigurationSection; +import me.confuser.banmanager.common.configuration.InvalidConfigurationException; +import me.confuser.banmanager.common.snakeyaml.DumperOptions; +import me.confuser.banmanager.common.snakeyaml.Yaml; +import me.confuser.banmanager.common.snakeyaml.error.YAMLException; +import me.confuser.banmanager.common.snakeyaml.representer.Representer; + +import java.io.File; +import java.io.IOException; +import java.io.Reader; +import java.util.Map; + +/** + * An implementation of {@link Configuration} which saves all files in Yaml. + * Note that this implementation is not synchronized. + */ +public class YamlConfiguration extends FileConfiguration { + + private static final String COMMENT_PREFIX = "# "; + private static final String BLANK_CONFIG = "{}\n"; + private final DumperOptions yamlOptions = new DumperOptions(); + private final Representer yamlRepresenter = new YamlRepresenter(); + private final Yaml yaml = new Yaml(new YamlConstructor(), yamlRepresenter, yamlOptions); + + /** + * Creates a new {@link YamlConfiguration}, loading from the given file. + *

Any errors loading the Configuration will be logged and then ignored. + * If the specified input is not a valid config, a blank config will be + * returned.

+ *

The encoding used may follow the system dependent default.

+ * + * @param file Input file + * + * @return Resulting configuration + */ + public static YamlConfiguration loadConfiguration(File file) { + YamlConfiguration config = new YamlConfiguration(); + + try { + config.load(file); + } catch ( IOException |InvalidConfigurationException e){ + e.printStackTrace(); + } + + return config; + } + + /** + * Creates a new {@link YamlConfiguration}, loading from the given reader. + *

+ * Any errors loading the Configuration will be logged and then ignored. + * If the specified input is not a valid config, a blank config will be + * returned.

+ * + * @param reader input + * @return resulting configuration + * @throws IllegalArgumentException Thrown if stream is null + */ + public static YamlConfiguration loadConfiguration(Reader reader) { + YamlConfiguration config = new YamlConfiguration(); + + try { + config.load(reader); + } catch (InvalidConfigurationException | IOException e) { + e.printStackTrace(); + } + + return config; + } + + @Override + public String saveToString() { + yamlOptions.setIndent(options().indent()); + yamlOptions.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK); + yamlRepresenter.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK); + + String header = buildHeader(); + String dump = yaml.dump(getValues(false)); + + if (dump.equals(BLANK_CONFIG)) { + dump = ""; + } + + return header + dump; + } + + @Override + public void loadFromString(String contents) throws InvalidConfigurationException { + + Map input; + try { + input = (Map) yaml.load(contents); + } catch (YAMLException e) { + throw new InvalidConfigurationException(e); + } catch (ClassCastException ignored) { + throw new InvalidConfigurationException("Top level is not a Map."); + } + + String header = parseHeader(contents); + if (!header.isEmpty()) { + options().header(header); + } + + if (input != null) { + convertMapsToSections(input, this); + } + } + + protected void convertMapsToSections(Map input, ConfigurationSection section) { + for (Map.Entry entry : input.entrySet()) { + String key = entry.getKey().toString(); + Object value = entry.getValue(); + + if (value instanceof Map) { + convertMapsToSections((Map) value, section.createSection(key)); + } else { + section.set(key, value); + } + } + } + + protected String parseHeader(String input) { + String[] lines = input.split("\r?\n", -1); + StringBuilder result = new StringBuilder(); + boolean readingHeader = true; + boolean foundHeader = false; + + for (int i = 0; (i < lines.length) && readingHeader; i++) { + String line = lines[i]; + + if (line.startsWith(COMMENT_PREFIX)) { + if (i > 0) { + result.append('\n'); + } + + if (line.length() > COMMENT_PREFIX.length()) { + result.append(line.substring(COMMENT_PREFIX.length())); + } + + foundHeader = true; + } else if (foundHeader && line.isEmpty()) { + result.append('\n'); + } else if (foundHeader) { + readingHeader = false; + } + } + + return result.toString(); + } + + @Override + protected String buildHeader() { + String header = options().header(); + + if (options().copyHeader()) { + Configuration def = getDefaults(); + + if (def instanceof FileConfiguration) { + FileConfiguration fileDefaults = (FileConfiguration) def; + String defaultsHeader = fileDefaults.buildHeader(); + + if ((defaultsHeader != null) && !defaultsHeader.isEmpty()) { + return defaultsHeader; + } + } + } + + if (header == null) { + return ""; + } + + StringBuilder builder = new StringBuilder(); + String[] lines = header.split("\r?\n", -1); + boolean startedHeader = false; + + for (int i = lines.length - 1; i >= 0; i--) { + builder.insert(0, '\n'); + + if (startedHeader || !lines[i].isEmpty()) { + builder.insert(0, lines[i]); + builder.insert(0, COMMENT_PREFIX); + startedHeader = true; + } + } + + return builder.toString(); + } + + @Override + public YamlConfigurationOptions options() { + if (options == null) { + options = new YamlConfigurationOptions(this); + } + + return (YamlConfigurationOptions) options; + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/configuration/file/YamlConfigurationOptions.java b/common/src/main/java/me/confuser/banmanager/common/configuration/file/YamlConfigurationOptions.java new file mode 100644 index 000000000..d0fd2c77e --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/configuration/file/YamlConfigurationOptions.java @@ -0,0 +1,68 @@ +package me.confuser.banmanager.common.configuration.file; + +/** + * Various settings for controlling the input and output of a {@link + * YamlConfiguration}. + */ +public class YamlConfigurationOptions extends FileConfigurationOptions { + private int indent = 2; + + YamlConfigurationOptions(YamlConfiguration configuration) { + super(configuration); + } + + @Override public YamlConfiguration configuration() { + return (YamlConfiguration) super.configuration(); + } + + @Override public YamlConfigurationOptions copyDefaults(boolean value) { + super.copyDefaults(value); + return this; + } + + @Override public YamlConfigurationOptions pathSeparator(char value) { + super.pathSeparator(value); + return this; + } + + @Override public YamlConfigurationOptions header(String value) { + super.header(value); + return this; + } + + @Override public YamlConfigurationOptions copyHeader(boolean value) { + super.copyHeader(value); + return this; + } + + /** + * Gets how much spaces should be used to indent each line. + * + *

The minimum value this may be is 2, and the maximum is 9. + * + * @return How much to indent by + */ + public int indent() { + return indent; + } + + /** + * Sets how much spaces should be used to indent each line. + * + *

The minimum value this may be is 2, and the maximum is 9. + * + * @param value New indent + * @return This object, for chaining + */ + public YamlConfigurationOptions indent(int value) { + if (value < 2) { + throw new IllegalArgumentException("Indent must be at least 2 characters"); + } + if (value > 9) { + throw new IllegalArgumentException("Indent cannot be greater than 9 characters"); + } + + indent = value; + return this; + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/configuration/file/YamlConstructor.java b/common/src/main/java/me/confuser/banmanager/common/configuration/file/YamlConstructor.java new file mode 100644 index 000000000..11bdba4fe --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/configuration/file/YamlConstructor.java @@ -0,0 +1,46 @@ +package me.confuser.banmanager.common.configuration.file; + +import me.confuser.banmanager.common.configuration.serialization.ConfigurationSerialization; +import me.confuser.banmanager.common.snakeyaml.constructor.SafeConstructor; +import me.confuser.banmanager.common.snakeyaml.error.YAMLException; +import me.confuser.banmanager.common.snakeyaml.nodes.Node; +import me.confuser.banmanager.common.snakeyaml.nodes.Tag; + +import java.util.LinkedHashMap; +import java.util.Map; + +public class YamlConstructor extends SafeConstructor { + + YamlConstructor() { + yamlConstructors.put(Tag.MAP, new ConstructCustomObject()); + } + + private class ConstructCustomObject extends ConstructYamlMap { + @Override public Object construct(final Node node) { + if (node.isTwoStepsConstruction()) { + throw new YAMLException("Unexpected referential mapping structure. Node: " + node); + } + + final Map raw = (Map) super.construct(node); + + if (raw.containsKey(ConfigurationSerialization.SERIALIZED_TYPE_KEY)) { + final Map typed = new LinkedHashMap<>(raw.size()); + for (final Map.Entry entry : raw.entrySet()) { + typed.put(entry.getKey().toString(), entry.getValue()); + } + + try { + return ConfigurationSerialization.deserializeObject(typed); + } catch (final IllegalArgumentException ex) { + throw new YAMLException("Could not deserialize object", ex); + } + } + + return raw; + } + + @Override public void construct2ndStep(final Node node, final Object object) { + throw new YAMLException("Unexpected referential mapping structure. Node: " + node); + } + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/configuration/file/YamlRepresenter.java b/common/src/main/java/me/confuser/banmanager/common/configuration/file/YamlRepresenter.java new file mode 100644 index 000000000..3963d7fd5 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/configuration/file/YamlRepresenter.java @@ -0,0 +1,40 @@ +package me.confuser.banmanager.common.configuration.file; + +import me.confuser.banmanager.common.configuration.ConfigurationSection; +import me.confuser.banmanager.common.configuration.serialization.ConfigurationSerializable; +import me.confuser.banmanager.common.configuration.serialization.ConfigurationSerialization; +import me.confuser.banmanager.common.snakeyaml.nodes.Node; +import me.confuser.banmanager.common.snakeyaml.representer.Representer; + +import java.util.LinkedHashMap; +import java.util.Map; + +class YamlRepresenter extends Representer { + + YamlRepresenter() { + this.multiRepresenters.put(ConfigurationSection.class, new RepresentConfigurationSection()); + this.multiRepresenters + .put(ConfigurationSerializable.class, new RepresentConfigurationSerializable()); + } + + private class RepresentConfigurationSection extends RepresentMap { + + @Override public Node representData(Object data) { + return super.representData(((ConfigurationSection) data).getValues(false)); + } + } + + + private class RepresentConfigurationSerializable extends RepresentMap { + + @Override public Node representData(Object data) { + ConfigurationSerializable serializable = (ConfigurationSerializable) data; + Map values = new LinkedHashMap<>(); + values.put(ConfigurationSerialization.SERIALIZED_TYPE_KEY, + ConfigurationSerialization.getAlias(serializable.getClass())); + values.putAll(serializable.serialize()); + + return super.representData(values); + } + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/configuration/serialization/ConfigurationSerializable.java b/common/src/main/java/me/confuser/banmanager/common/configuration/serialization/ConfigurationSerializable.java new file mode 100644 index 000000000..4c3d11351 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/configuration/serialization/ConfigurationSerializable.java @@ -0,0 +1,33 @@ +package me.confuser.banmanager.common.configuration.serialization; + +import java.util.Map; + +/** + * Represents an object that may be serialized. + *

These objects MUST implement one of the following, in addition to + * the methods as defined by this interface: + *

    + *
  • A static method "deserialize" that accepts a single {@link Map}< + * {@link String}, {@link Object}> and returns the class.
  • + *
  • A static method "valueOf" that accepts a single {@link Map}<{@link + * String}, {@link Object}> and returns the class.
  • + *
  • A constructor that accepts a single {@link Map}<{@link String}, + * {@link Object}>.
  • + *
+ * In addition to implementing this interface, you must register the class + * with {@link ConfigurationSerialization#registerClass(Class)}. + * + * @see DelegateDeserialization + * @see SerializableAs + */ +public interface ConfigurationSerializable { + + /** + * Creates a Map representation of this class. + *

This class must provide a method to restore this class, as defined in + * the {@link ConfigurationSerializable} interface javadoc. + * + * @return Map containing the current state of this class + */ + Map serialize(); +} diff --git a/common/src/main/java/me/confuser/banmanager/common/configuration/serialization/ConfigurationSerialization.java b/common/src/main/java/me/confuser/banmanager/common/configuration/serialization/ConfigurationSerialization.java new file mode 100644 index 000000000..6a75c6fa6 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/configuration/serialization/ConfigurationSerialization.java @@ -0,0 +1,273 @@ +package me.confuser.banmanager.common.configuration.serialization; + +import me.confuser.banmanager.common.configuration.Configuration; + +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.util.HashMap; +import java.util.Map; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * Utility class for storing and retrieving classes for {@link Configuration}. + */ +public class ConfigurationSerialization { + + public static final String SERIALIZED_TYPE_KEY = "=="; + private static final Map> aliases = + new HashMap<>(); + private final Class clazz; + + protected ConfigurationSerialization(Class clazz) { + this.clazz = clazz; + } + + /** + * Attempts to deserialize the given arguments into a new instance of the + * given class. + *

The class must implement {@link ConfigurationSerializable}, including + * the extra methods as specified in the javadoc of + * ConfigurationSerializable.

+ *

If a new instance could not be made, an example being the class not + * fully implementing the interface, null will be returned.

+ * + * @param args Arguments for deserialization + * @param clazz Class to deserialize into + * + * @return New instance of the specified class + */ + public static ConfigurationSerializable deserializeObject(Map args, + Class clazz) { + return new ConfigurationSerialization(clazz).deserialize(args); + } + + /** + * Attempts to deserialize the given arguments into a new instance of the + * given class. + *

+ * The class must implement {@link ConfigurationSerializable}, including + * the extra methods as specified in the javadoc of + * ConfigurationSerializable.

+ *

+ * If a new instance could not be made, an example being the class not + * fully implementing the interface, null will be returned.

+ * + * @param args Arguments for deserialization + * + * @return New instance of the specified class + */ + public static ConfigurationSerializable deserializeObject(Map args) { + Class clazz = null; + + if (args.containsKey(SERIALIZED_TYPE_KEY)) { + try { + String alias = (String) args.get(SERIALIZED_TYPE_KEY); + + if (alias == null) { + throw new IllegalArgumentException("Cannot have null alias"); + } + clazz = getClassByAlias(alias); + if (clazz == null) { + throw new IllegalArgumentException( + "Specified class does not exist ('" + alias + "')"); + } + } catch (ClassCastException ex) { + ex.fillInStackTrace(); + throw ex; + } + } else { + throw new IllegalArgumentException( + "Args doesn't contain type key ('" + SERIALIZED_TYPE_KEY + "')"); + } + + return new ConfigurationSerialization(clazz).deserialize(args); + } + + /** + * Registers the given {@link ConfigurationSerializable} class by its + * alias. + * + * @param clazz Class to register + */ + public static void registerClass(Class clazz) { + DelegateDeserialization delegate = clazz.getAnnotation(DelegateDeserialization.class); + + if (delegate == null) { + registerClass(clazz, getAlias(clazz)); + registerClass(clazz, clazz.getName()); + } + } + + /** + * Registers the given alias to the specified {@link + * ConfigurationSerializable} class. + * + * @param clazz Class to register + * @param alias Alias to register as + * + * @see SerializableAs + */ + public static void registerClass(Class clazz, + String alias) { + aliases.put(alias, clazz); + } + + /** + * Unregisters the specified alias to a {@link ConfigurationSerializable} + * + * @param alias Alias to unregister + */ + public static void unregisterClass(String alias) { + aliases.remove(alias); + } + + /** + * Unregisters any aliases for the specified {@link + * ConfigurationSerializable} class. + * + * @param clazz Class to unregister + */ + public static void unregisterClass(Class clazz) { + while (aliases.values().remove(clazz)) { + } + } + + /** + * Attempts to get a registered {@link ConfigurationSerializable} class by + * its alias. + * + * @param alias Alias of the serializable + * + * @return Registered class, or null if not found + */ + public static Class getClassByAlias(String alias) { + return aliases.get(alias); + } + + /** + * Gets the correct alias for the given {@link ConfigurationSerializable} + * class. + * + * @param clazz Class to get alias for + * + * @return Alias to use for the class + */ + public static String getAlias(Class clazz) { + DelegateDeserialization delegate = clazz.getAnnotation(DelegateDeserialization.class); + + if (delegate != null) { + if (delegate.value() == clazz) { + delegate = null; + } else { + return getAlias(delegate.value()); + } + } + + SerializableAs alias = clazz.getAnnotation(SerializableAs.class); + + if (alias != null) { + return alias.value(); + } + + return clazz.getName(); + } + + protected Method getMethod(String name, boolean isStatic) { + try { + Method method = this.clazz.getDeclaredMethod(name, Map.class); + + if (!ConfigurationSerializable.class.isAssignableFrom(method.getReturnType())) { + return null; + } + if (Modifier.isStatic(method.getModifiers()) != isStatic) { + return null; + } + + return method; + } catch (NoSuchMethodException | SecurityException ignored) { + return null; + } + } + + protected Constructor getConstructor() { + try { + return this.clazz.getConstructor(Map.class); + } catch (NoSuchMethodException | SecurityException ignored) { + return null; + } + } + + protected ConfigurationSerializable deserializeViaMethod(Method method, Map args) { + try { + ConfigurationSerializable result = + (ConfigurationSerializable) method.invoke(null, args); + + if (result == null) { + Logger.getLogger(ConfigurationSerialization.class.getName()).log(Level.SEVERE, + "Could not call method '" + method.toString() + "' of " + this.clazz + + " for deserialization: method returned null"); + } else { + return result; + } + } catch (IllegalAccessException | InvocationTargetException | IllegalArgumentException ex) { + if (ex instanceof InvocationTargetException) { + Logger.getLogger(ConfigurationSerialization.class.getName()).log(Level.SEVERE, + "Could not call method '" + method.toString() + "' of " + this.clazz + + " for deserialization", ex.getCause()); + } else { + Logger.getLogger(ConfigurationSerialization.class.getName()).log(Level.SEVERE, + "Could not call method '" + method.toString() + "' of " + this.clazz + + " for deserialization", ex); + } + } + + return null; + } + + protected ConfigurationSerializable deserializeViaCtor( + Constructor ctor, Map args) { + try { + return ctor.newInstance(args); + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | InstantiationException ex) { + if (ex instanceof InvocationTargetException) { + Logger.getLogger(ConfigurationSerialization.class.getName()).log(Level.SEVERE, + "Could not call constructor '" + ctor.toString() + "' of " + this.clazz + + " for deserialization", ex.getCause()); + } else { + Logger.getLogger(ConfigurationSerialization.class.getName()).log(Level.SEVERE, + "Could not call constructor '" + ctor.toString() + "' of " + this.clazz + + " for deserialization", ex); + } + } + + return null; + } + + public ConfigurationSerializable deserialize(Map args) { + if (args == null) { + throw new NullPointerException("Args must not be null"); + } + ConfigurationSerializable result = null; + Method method = getMethod("deserialize", true); + if (method != null) { + result = deserializeViaMethod(method, args); + } + if (result == null) { + method = getMethod("valueOf", true); + if (method != null) { + result = deserializeViaMethod(method, args); + } + } + if (result == null) { + Constructor constructor = getConstructor(); + if (constructor != null) { + result = deserializeViaCtor(constructor, args); + } + } + + return result; + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/configuration/serialization/DelegateDeserialization.java b/common/src/main/java/me/confuser/banmanager/common/configuration/serialization/DelegateDeserialization.java new file mode 100644 index 000000000..f7cf383ab --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/configuration/serialization/DelegateDeserialization.java @@ -0,0 +1,23 @@ +package me.confuser.banmanager.common.configuration.serialization; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Applies to a {@link ConfigurationSerializable} that will delegate all + * deserialization to another {@link ConfigurationSerializable}. + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +public @interface DelegateDeserialization { + + /** + * Which class should be used as a delegate for this classes + * deserialization + * + * @return Delegate class + */ + Class value(); +} diff --git a/common/src/main/java/me/confuser/banmanager/common/configuration/serialization/SerializableAs.java b/common/src/main/java/me/confuser/banmanager/common/configuration/serialization/SerializableAs.java new file mode 100644 index 000000000..014f5fcc9 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/configuration/serialization/SerializableAs.java @@ -0,0 +1,35 @@ +package me.confuser.banmanager.common.configuration.serialization; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Represents an "alias" that a {@link ConfigurationSerializable} may be + * stored as. + * If this is not present on a {@link ConfigurationSerializable} class, it + * will use the fully qualified name of the class. + *

+ * This value will be stored in the configuration so that the configuration + * deserialization can determine what type it is. + *

+ * Using this annotation on any other class than a {@link + * ConfigurationSerializable} will have no effect. + * + * @see ConfigurationSerialization#registerClass(Class, String) + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +public @interface SerializableAs { + + /** + * This is the name your class will be stored and retrieved as. + *

+ * This name MUST be unique. We recommend using names such as + * "MyPluginThing" instead of "Thing". + * + * @return Name to serialize the class as. + */ + String value(); +} diff --git a/common/src/main/java/me/confuser/banmanager/common/data/IpBanData.java b/common/src/main/java/me/confuser/banmanager/common/data/IpBanData.java new file mode 100644 index 000000000..19245be4c --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/data/IpBanData.java @@ -0,0 +1,87 @@ +package me.confuser.banmanager.common.data; + +import me.confuser.banmanager.common.ipaddr.IPAddress; +import me.confuser.banmanager.common.ormlite.field.DatabaseField; +import me.confuser.banmanager.common.ormlite.table.DatabaseTable; +import me.confuser.banmanager.common.storage.mysql.ByteArray; + +import lombok.Getter; +import me.confuser.banmanager.common.storage.mysql.IpAddress; + +@DatabaseTable +public class IpBanData { + + @Getter + @DatabaseField(generatedId = true) + private int id; + @Getter + @DatabaseField(canBeNull = false, persisterClass = IpAddress.class, columnDefinition = "VARBINARY(16) NOT NULL") + private IPAddress ip; + @Getter + @DatabaseField(canBeNull = false) + private String reason; + @Getter + @DatabaseField(canBeNull = false, foreign = true, foreignAutoRefresh = true, persisterClass = ByteArray.class, columnDefinition = "BINARY(16) NOT NULL") + private PlayerData actor; + + // Should always be database time + @Getter + @DatabaseField(index = true, columnDefinition = "BIGINT UNSIGNED NOT NULL") + private long created = System.currentTimeMillis() / 1000L; + @Getter + @DatabaseField(index = true, columnDefinition = "BIGINT UNSIGNED NOT NULL") + private long updated = System.currentTimeMillis() / 1000L; + @Getter + @DatabaseField(index = true, columnDefinition = "BIGINT UNSIGNED NOT NULL") + private long expires = 0; + + @DatabaseField + @Getter + private boolean silent = false; + + IpBanData() { + + } + + public IpBanData(IPAddress ip, PlayerData actor, String reason, boolean silent) { + this.ip = ip; + this.reason = reason; + this.actor = actor; + this.silent = silent; + } + + public IpBanData(IPAddress ip, PlayerData actor, String reason, boolean silent, long expires) { + this(ip, actor, reason, silent); + + this.expires = expires; + } + + public IpBanData(IPAddress ip, PlayerData actor, String reason, boolean silent, long expires, long created) { + this(ip, actor, reason, silent, expires); + + this.created = created; + } + + public IpBanData(int id, IPAddress ip, PlayerData actor, String reason, boolean silent, long expires, long created, long updated) { + this(ip, actor, reason, silent, expires, created); + + this.id = id; + this.updated = updated; + } + + public IpBanData(IpBanRecord record) { + this(record.getIp(), record.getPastActor(), record.getReason(), record.isSilent(), record.getExpired(), record.getPastCreated()); + } + + public boolean hasExpired() { + return getExpires() != 0 && getExpires() <= (System.currentTimeMillis() / 1000L); + } + + public boolean equalsBan(IpBanData ban) { + return ban.getReason().equals(this.reason) + && ban.getExpires() == expires + && ban.getCreated() == this.created + && ban.getIp().equals(this.ip) + && ban.getActor().getUUID().equals(this.actor.getUUID()); + } +} diff --git a/src/main/java/me/confuser/banmanager/data/IpBanRecord.java b/common/src/main/java/me/confuser/banmanager/common/data/IpBanRecord.java similarity index 64% rename from src/main/java/me/confuser/banmanager/data/IpBanRecord.java rename to common/src/main/java/me/confuser/banmanager/common/data/IpBanRecord.java index 25f9b5171..e98d22f9b 100644 --- a/src/main/java/me/confuser/banmanager/data/IpBanRecord.java +++ b/common/src/main/java/me/confuser/banmanager/common/data/IpBanRecord.java @@ -1,9 +1,11 @@ -package me.confuser.banmanager.data; +package me.confuser.banmanager.common.data; -import com.j256.ormlite.field.DatabaseField; -import com.j256.ormlite.table.DatabaseTable; import lombok.Getter; -import me.confuser.banmanager.storage.mysql.ByteArray; +import me.confuser.banmanager.common.ipaddr.IPAddress; +import me.confuser.banmanager.common.ormlite.field.DatabaseField; +import me.confuser.banmanager.common.ormlite.table.DatabaseTable; +import me.confuser.banmanager.common.storage.mysql.ByteArray; +import me.confuser.banmanager.common.storage.mysql.IpAddress; @DatabaseTable public class IpBanRecord { @@ -12,15 +14,15 @@ public class IpBanRecord { @Getter private int id; - @DatabaseField(canBeNull = false, columnDefinition = "INT UNSIGNED NOT NULL") + @DatabaseField(canBeNull = false, persisterClass = IpAddress.class, columnDefinition = "VARBINARY(16) NOT NULL") @Getter - private long ip; + private IPAddress ip; @DatabaseField(canBeNull = false) @Getter private String reason; - @DatabaseField(canBeNull = false, columnDefinition = "INT(10) NOT NULL") + @DatabaseField(canBeNull = false, columnDefinition = "BIGINT UNSIGNED NOT NULL") @Getter private long expired; @@ -32,11 +34,11 @@ public class IpBanRecord { @Getter private PlayerData pastActor; - @DatabaseField(canBeNull = false, columnDefinition = "INT(10) NOT NULL") + @DatabaseField(canBeNull = false, columnDefinition = "BIGINT UNSIGNED NOT NULL") @Getter private long pastCreated; - @DatabaseField(index = true, canBeNull = false, columnDefinition = "INT(10) NOT NULL") + @DatabaseField(index = true, canBeNull = false, columnDefinition = "BIGINT UNSIGNED NOT NULL") @Getter private long created = System.currentTimeMillis() / 1000L; @@ -44,6 +46,10 @@ public class IpBanRecord { @Getter private String createdReason; + @DatabaseField + @Getter + private boolean silent = false; + IpBanRecord() { } @@ -54,6 +60,7 @@ public IpBanRecord(IpBanData ban, PlayerData actor, String reason) { pastActor = ban.getActor(); pastCreated = ban.getCreated(); createdReason = reason; + silent = ban.isSilent(); this.reason = ban.getReason(); this.actor = actor; @@ -65,6 +72,7 @@ public IpBanRecord(IpBanData ban, PlayerData actor, long created) { expired = ban.getExpires(); pastActor = ban.getActor(); pastCreated = ban.getCreated(); + silent = ban.isSilent(); this.actor = actor; this.created = created; diff --git a/common/src/main/java/me/confuser/banmanager/common/data/IpMuteData.java b/common/src/main/java/me/confuser/banmanager/common/data/IpMuteData.java new file mode 100644 index 000000000..86e01f498 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/data/IpMuteData.java @@ -0,0 +1,89 @@ +package me.confuser.banmanager.common.data; + +import lombok.Getter; +import me.confuser.banmanager.common.ipaddr.IPAddress; +import me.confuser.banmanager.common.ormlite.field.DatabaseField; +import me.confuser.banmanager.common.ormlite.table.DatabaseTable; +import me.confuser.banmanager.common.storage.mysql.ByteArray; +import me.confuser.banmanager.common.storage.mysql.IpAddress; + +@DatabaseTable +public class IpMuteData { + + @Getter + @DatabaseField(generatedId = true) + private int id; + @Getter + @DatabaseField(canBeNull = false, persisterClass = IpAddress.class, columnDefinition = "VARBINARY(16) NOT NULL") + private IPAddress ip; + @Getter + @DatabaseField(canBeNull = false) + private String reason; + @Getter + @DatabaseField(canBeNull = false, foreign = true, foreignAutoRefresh = true, persisterClass = ByteArray.class, columnDefinition = "BINARY(16) NOT NULL") + private PlayerData actor; + + // Should always be database time + @Getter + @DatabaseField(index = true, columnDefinition = "BIGINT UNSIGNED NOT NULL") + private long created = System.currentTimeMillis() / 1000L; + @Getter + @DatabaseField(index = true, columnDefinition = "BIGINT UNSIGNED NOT NULL") + private long updated = System.currentTimeMillis() / 1000L; + @Getter + @DatabaseField(index = true, columnDefinition = "BIGINT UNSIGNED NOT NULL") + private long expires = 0; + + @DatabaseField(index = true) + @Getter + private boolean soft = false; + + @DatabaseField + @Getter + private boolean silent = false; + + IpMuteData() { + + } + + public IpMuteData(IPAddress ip, PlayerData actor, String reason, boolean silent, boolean soft) { + this.ip = ip; + this.actor = actor; + this.reason = reason; + this.silent = silent; + this.soft = soft; + } + + public IpMuteData(IPAddress ip, PlayerData actor, String reason, boolean silent, boolean soft, long expires) { + this(ip, actor, reason, silent, soft); + this.expires = expires; + } + + public IpMuteData(IPAddress ip, PlayerData actor, String reason, boolean silent, boolean soft, long expires, long created) { + this(ip, actor, reason, silent, soft, expires); + this.created = created; + } + + public IpMuteData(int id, IPAddress ip, PlayerData actor, String reason, boolean silent, boolean soft, long expires, long created, long updated) { + this(ip, actor, reason, silent, soft, expires, created); + + this.id = id; + this.updated = updated; + } + + public IpMuteData(IpMuteRecord record) { + this(record.getIp(), record.getPastActor(), record.getReason(), record.isSilent(), record.isSoft(), record.getExpired(), record.getPastCreated()); + } + + public boolean hasExpired() { + return getExpires() != 0 && getExpires() <= (System.currentTimeMillis() / 1000L); + } + + public boolean equalsMute(IpMuteData mute) { + return mute.getReason().equals(this.reason) + && mute.getExpires() == expires + && mute.getCreated() == this.created + && mute.getIp().equals(this.ip) + && mute.getActor().getUUID().equals(this.actor.getUUID()); + } +} diff --git a/src/main/java/me/confuser/banmanager/data/IpMuteRecord.java b/common/src/main/java/me/confuser/banmanager/common/data/IpMuteRecord.java similarity index 66% rename from src/main/java/me/confuser/banmanager/data/IpMuteRecord.java rename to common/src/main/java/me/confuser/banmanager/common/data/IpMuteRecord.java index 4e17522d3..57007ff72 100644 --- a/src/main/java/me/confuser/banmanager/data/IpMuteRecord.java +++ b/common/src/main/java/me/confuser/banmanager/common/data/IpMuteRecord.java @@ -1,9 +1,11 @@ -package me.confuser.banmanager.data; +package me.confuser.banmanager.common.data; -import com.j256.ormlite.field.DatabaseField; -import com.j256.ormlite.table.DatabaseTable; import lombok.Getter; -import me.confuser.banmanager.storage.mysql.ByteArray; +import me.confuser.banmanager.common.ipaddr.IPAddress; +import me.confuser.banmanager.common.ormlite.field.DatabaseField; +import me.confuser.banmanager.common.ormlite.table.DatabaseTable; +import me.confuser.banmanager.common.storage.mysql.ByteArray; +import me.confuser.banmanager.common.storage.mysql.IpAddress; @DatabaseTable public class IpMuteRecord { @@ -12,15 +14,15 @@ public class IpMuteRecord { @Getter private int id; - @DatabaseField(index = true, canBeNull = false, columnDefinition = "INT UNSIGNED NOT NULL") + @DatabaseField(canBeNull = false, persisterClass = IpAddress.class, columnDefinition = "VARBINARY(16) NOT NULL") @Getter - private long ip; + private IPAddress ip; @DatabaseField(canBeNull = false) @Getter private String reason; - @DatabaseField(canBeNull = false, columnDefinition = "INT(10) NOT NULL") + @DatabaseField(canBeNull = false, columnDefinition = "BIGINT UNSIGNED NOT NULL") @Getter private long expired; @@ -32,11 +34,11 @@ public class IpMuteRecord { @Getter private PlayerData pastActor; - @DatabaseField(canBeNull = false, columnDefinition = "INT(10) NOT NULL") + @DatabaseField(canBeNull = false, columnDefinition = "BIGINT UNSIGNED NOT NULL") @Getter private long pastCreated; - @DatabaseField(index = true, canBeNull = false, columnDefinition = "INT(10) NOT NULL") + @DatabaseField(index = true, canBeNull = false, columnDefinition = "BIGINT UNSIGNED NOT NULL") @Getter private long created = System.currentTimeMillis() / 1000L; @@ -48,6 +50,10 @@ public class IpMuteRecord { @Getter private boolean soft = false; + @DatabaseField + @Getter + private boolean silent = false; + IpMuteRecord() { } @@ -58,6 +64,7 @@ public IpMuteRecord(IpMuteData mute, PlayerData actor, String reason) { pastActor = mute.getActor(); pastCreated = mute.getCreated(); createdReason = reason; + silent = mute.isSilent(); soft = mute.isSoft(); this.reason = mute.getReason(); @@ -70,6 +77,7 @@ public IpMuteRecord(IpMuteData mute, PlayerData actor, long created) { expired = mute.getExpires(); pastActor = mute.getActor(); pastCreated = mute.getCreated(); + silent = mute.isSilent(); this.actor = actor; this.created = created; diff --git a/common/src/main/java/me/confuser/banmanager/common/data/IpRangeBanData.java b/common/src/main/java/me/confuser/banmanager/common/data/IpRangeBanData.java new file mode 100644 index 000000000..71467bc82 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/data/IpRangeBanData.java @@ -0,0 +1,101 @@ +package me.confuser.banmanager.common.data; + +import lombok.Getter; +import me.confuser.banmanager.common.google.guava.collect.Range; +import me.confuser.banmanager.common.ipaddr.IPAddress; +import me.confuser.banmanager.common.ormlite.field.DatabaseField; +import me.confuser.banmanager.common.ormlite.table.DatabaseTable; +import me.confuser.banmanager.common.storage.mysql.ByteArray; +import me.confuser.banmanager.common.storage.mysql.IpAddress; +import me.confuser.banmanager.common.util.IPUtils; + +@DatabaseTable +public class IpRangeBanData { + + @Getter + @DatabaseField(generatedId = true) + private int id; + + @Getter + @DatabaseField(canBeNull = false, persisterClass = IpAddress.class, columnDefinition = "VARBINARY(16) NOT NULL") + private IPAddress fromIp; + + @Getter + @DatabaseField(canBeNull = false, persisterClass = IpAddress.class, columnDefinition = "VARBINARY(16) NOT NULL") + private IPAddress toIp; + + @Getter + @DatabaseField(canBeNull = false) + private String reason; + + @Getter + @DatabaseField(canBeNull = false, foreign = true, foreignAutoRefresh = true, persisterClass = ByteArray.class, columnDefinition = "BINARY(16) NOT NULL") + private PlayerData actor; + + // Should always be database time + @Getter + @DatabaseField(index = true, columnDefinition = "BIGINT UNSIGNED NOT NULL") + private long created = System.currentTimeMillis() / 1000L; + @Getter + @DatabaseField(index = true, columnDefinition = "BIGINT UNSIGNED NOT NULL") + private long updated = System.currentTimeMillis() / 1000L; + @Getter + @DatabaseField(index = true, columnDefinition = "BIGINT UNSIGNED NOT NULL") + private long expires = 0; + + @DatabaseField + @Getter + private boolean silent = false; + + IpRangeBanData() { + + } + + public IpRangeBanData(IPAddress fromIp, IPAddress toIp, PlayerData actor, String reason, boolean silent) { + this.fromIp = fromIp; + this.toIp = toIp; + this.reason = reason; + this.actor = actor; + this.silent = silent; + } + + public IpRangeBanData(IPAddress fromIp, IPAddress toIp, PlayerData actor, String reason, boolean silent, long expires) { + this(fromIp, toIp, actor, reason, silent); + + this.expires = expires; + } + + public IpRangeBanData(IPAddress fromIp, IPAddress toIp, PlayerData actor, String reason, boolean silent, long expires, long created) { + this(fromIp, toIp, actor, reason, silent, expires); + + this.created = created; + } + + public IpRangeBanData(int id, IPAddress fromIp, IPAddress toIp, PlayerData actor, String reason, boolean silent, long expires, long created, long updated) { + this(fromIp, toIp, actor, reason, silent, expires, created); + + this.id = id; + this.updated = updated; + } + + public boolean hasExpired() { + return getExpires() != 0 && getExpires() <= (System.currentTimeMillis() / 1000L); + } + + public boolean inRange(IPAddress ip) { + return IPUtils.isInRange(fromIp, toIp, ip); + } + + public Range getRange() { + return Range.closed(fromIp, toIp); + } + + public boolean equalsBan(IpRangeBanData ban) { + return ban.getReason().equals(this.reason) + && ban.getExpires() == expires + && ban.getCreated() == this.created + && ban.getFromIp() == this.fromIp + && ban.getToIp() == this.toIp + && ban.getActor().getUUID().equals(this.actor.getUUID()); + } +} diff --git a/src/main/java/me/confuser/banmanager/data/IpRangeBanRecord.java b/common/src/main/java/me/confuser/banmanager/common/data/IpRangeBanRecord.java similarity index 58% rename from src/main/java/me/confuser/banmanager/data/IpRangeBanRecord.java rename to common/src/main/java/me/confuser/banmanager/common/data/IpRangeBanRecord.java index dc18238a3..c63f3f897 100644 --- a/src/main/java/me/confuser/banmanager/data/IpRangeBanRecord.java +++ b/common/src/main/java/me/confuser/banmanager/common/data/IpRangeBanRecord.java @@ -1,10 +1,12 @@ -package me.confuser.banmanager.data; +package me.confuser.banmanager.common.data; -import com.google.common.collect.Range; -import com.j256.ormlite.field.DatabaseField; -import com.j256.ormlite.table.DatabaseTable; import lombok.Getter; -import me.confuser.banmanager.storage.mysql.ByteArray; +import me.confuser.banmanager.common.google.guava.collect.Range; +import me.confuser.banmanager.common.ipaddr.IPAddress; +import me.confuser.banmanager.common.ormlite.field.DatabaseField; +import me.confuser.banmanager.common.ormlite.table.DatabaseTable; +import me.confuser.banmanager.common.storage.mysql.ByteArray; +import me.confuser.banmanager.common.storage.mysql.IpAddress; @DatabaseTable public class IpRangeBanRecord { @@ -13,19 +15,19 @@ public class IpRangeBanRecord { @Getter private int id; - @DatabaseField(canBeNull = false, columnDefinition = "INT UNSIGNED NOT NULL", index = true) + @DatabaseField(canBeNull = false, persisterClass = IpAddress.class, columnDefinition = "VARBINARY(16) NOT NULL", index = true) @Getter - private long fromIp; + private IPAddress fromIp; - @DatabaseField(canBeNull = false, columnDefinition = "INT UNSIGNED NOT NULL", index = true) + @DatabaseField(canBeNull = false, persisterClass = IpAddress.class, columnDefinition = "VARBINARY(16) NOT NULL", index = true) @Getter - private long toIp; + private IPAddress toIp; @DatabaseField(canBeNull = false) @Getter private String reason; - @DatabaseField(canBeNull = false, columnDefinition = "INT(10) NOT NULL") + @DatabaseField(canBeNull = false, columnDefinition = "BIGINT UNSIGNED NOT NULL") @Getter private long expired; @@ -37,11 +39,11 @@ public class IpRangeBanRecord { @Getter private PlayerData pastActor; - @DatabaseField(canBeNull = false, columnDefinition = "INT(10) NOT NULL") + @DatabaseField(canBeNull = false, columnDefinition = "BIGINT UNSIGNED NOT NULL") @Getter private long pastCreated; - @DatabaseField(index = true, canBeNull = false, columnDefinition = "INT(10) NOT NULL") + @DatabaseField(index = true, canBeNull = false, columnDefinition = "BIGINT UNSIGNED NOT NULL") @Getter private long created = System.currentTimeMillis() / 1000L; @@ -49,6 +51,10 @@ public class IpRangeBanRecord { @Getter private String createdReason; + @DatabaseField + @Getter + private boolean silent = false; + IpRangeBanRecord() { } @@ -60,6 +66,7 @@ public IpRangeBanRecord(IpRangeBanData ban, PlayerData actor, String reason) { pastActor = ban.getActor(); pastCreated = ban.getCreated(); createdReason = reason; + silent = ban.isSilent(); this.reason = ban.getReason(); this.actor = actor; diff --git a/src/main/java/me/confuser/banmanager/data/NameBanData.java b/common/src/main/java/me/confuser/banmanager/common/data/NameBanData.java similarity index 60% rename from src/main/java/me/confuser/banmanager/data/NameBanData.java rename to common/src/main/java/me/confuser/banmanager/common/data/NameBanData.java index a96a426a2..b0ba6ff6f 100644 --- a/src/main/java/me/confuser/banmanager/data/NameBanData.java +++ b/common/src/main/java/me/confuser/banmanager/common/data/NameBanData.java @@ -1,9 +1,9 @@ -package me.confuser.banmanager.data; +package me.confuser.banmanager.common.data; -import com.j256.ormlite.field.DatabaseField; -import com.j256.ormlite.table.DatabaseTable; import lombok.Getter; -import me.confuser.banmanager.storage.mysql.ByteArray; +import me.confuser.banmanager.common.ormlite.field.DatabaseField; +import me.confuser.banmanager.common.ormlite.table.DatabaseTable; +import me.confuser.banmanager.common.storage.mysql.ByteArray; @DatabaseTable public class NameBanData { @@ -25,43 +25,48 @@ public class NameBanData { private PlayerData actor; // Should always be database time - @DatabaseField(index = true, columnDefinition = "INT(10) NOT NULL") + @DatabaseField(index = true, columnDefinition = "BIGINT UNSIGNED NOT NULL") @Getter private long created = System.currentTimeMillis() / 1000L; - @DatabaseField(index = true, columnDefinition = "INT(10) NOT NULL") + @DatabaseField(index = true, columnDefinition = "BIGINT UNSIGNED NOT NULL") @Getter private long updated = System.currentTimeMillis() / 1000L; - @DatabaseField(index = true, columnDefinition = "INT(10) NOT NULL") + @DatabaseField(index = true, columnDefinition = "BIGINT UNSIGNED NOT NULL") @Getter private long expires = 0; + @DatabaseField + @Getter + private boolean silent = false; + NameBanData() { } - public NameBanData(String name, PlayerData actor, String reason) { + public NameBanData(String name, PlayerData actor, String reason, boolean silent) { this.name = name; this.reason = reason; this.actor = actor; + this.silent = silent; } - public NameBanData(String name, PlayerData actor, String reason, long expires) { - this(name, actor, reason); + public NameBanData(String name, PlayerData actor, String reason, boolean silent, long expires) { + this(name, actor, reason, silent); this.expires = expires; } // Only use for imports! - public NameBanData(String name, PlayerData actor, String reason, long expires, long created) { - this(name, actor, reason, expires); + public NameBanData(String name, PlayerData actor, String reason, boolean silent, long expires, long created) { + this(name, actor, reason, silent, expires); this.created = created; } - public NameBanData(int id, String name, PlayerData actor, String reason, long expires, long created, long updated) { - this(name, actor, reason, expires, created); + public NameBanData(int id, String name, PlayerData actor, String reason, boolean silent, long expires, long created, long updated) { + this(name, actor, reason, silent, expires, created); this.id = id; this.updated = updated; diff --git a/src/main/java/me/confuser/banmanager/data/NameBanRecord.java b/common/src/main/java/me/confuser/banmanager/common/data/NameBanRecord.java similarity index 69% rename from src/main/java/me/confuser/banmanager/data/NameBanRecord.java rename to common/src/main/java/me/confuser/banmanager/common/data/NameBanRecord.java index ae7e4052c..6432ac42f 100644 --- a/src/main/java/me/confuser/banmanager/data/NameBanRecord.java +++ b/common/src/main/java/me/confuser/banmanager/common/data/NameBanRecord.java @@ -1,9 +1,9 @@ -package me.confuser.banmanager.data; +package me.confuser.banmanager.common.data; -import com.j256.ormlite.field.DatabaseField; -import com.j256.ormlite.table.DatabaseTable; import lombok.Getter; -import me.confuser.banmanager.storage.mysql.ByteArray; +import me.confuser.banmanager.common.ormlite.field.DatabaseField; +import me.confuser.banmanager.common.ormlite.table.DatabaseTable; +import me.confuser.banmanager.common.storage.mysql.ByteArray; @DatabaseTable public class NameBanRecord { @@ -20,7 +20,7 @@ public class NameBanRecord { @Getter private String reason; - @DatabaseField(canBeNull = false) + @DatabaseField(canBeNull = false, columnDefinition = "BIGINT UNSIGNED NOT NULL") @Getter private long expired; @@ -32,11 +32,11 @@ public class NameBanRecord { @DatabaseField(canBeNull = false, foreign = true, foreignAutoRefresh = true, persisterClass = ByteArray.class, columnDefinition = "BINARY(16) NOT NULL") private PlayerData pastActor; - @DatabaseField(canBeNull = false, columnDefinition = "INT(10) NOT NULL") + @DatabaseField(canBeNull = false, columnDefinition = "BIGINT UNSIGNED NOT NULL") @Getter private long pastCreated; - @DatabaseField(index = true, canBeNull = false, columnDefinition = "INT(10) NOT NULL") + @DatabaseField(index = true, canBeNull = false, columnDefinition = "BIGINT UNSIGNED NOT NULL") @Getter private long created = System.currentTimeMillis() / 1000L; @@ -44,6 +44,10 @@ public class NameBanRecord { @Getter private String createdReason; + @DatabaseField + @Getter + private boolean silent = false; + NameBanRecord() { } @@ -54,6 +58,7 @@ public NameBanRecord(NameBanData ban, PlayerData actor, String reason) { pastActor = ban.getActor(); pastCreated = ban.getCreated(); createdReason = reason; + silent = ban.isSilent(); this.reason = ban.getReason(); this.actor = actor; @@ -66,15 +71,17 @@ public NameBanRecord(NameBanData ban, PlayerData actor, long created) { pastActor = ban.getActor(); pastCreated = ban.getCreated(); + silent = ban.isSilent(); + this.actor = actor; this.created = created; } public boolean equalsBan(NameBanData ban) { return ban.getReason().equals(this.reason) - && ban.getExpires() == expired - && ban.getCreated() == this.pastCreated - && ban.getName().equals(this.getName()) - && ban.getActor().getUUID().equals(this.pastActor.getUUID()); + && ban.getExpires() == expired + && ban.getCreated() == this.pastCreated + && ban.getName().equals(this.getName()) + && ban.getActor().getUUID().equals(this.pastActor.getUUID()); } } diff --git a/src/main/java/me/confuser/banmanager/data/PlayerBanData.java b/common/src/main/java/me/confuser/banmanager/common/data/PlayerBanData.java similarity index 58% rename from src/main/java/me/confuser/banmanager/data/PlayerBanData.java rename to common/src/main/java/me/confuser/banmanager/common/data/PlayerBanData.java index 303a8bd3d..88ffd34f7 100644 --- a/src/main/java/me/confuser/banmanager/data/PlayerBanData.java +++ b/common/src/main/java/me/confuser/banmanager/common/data/PlayerBanData.java @@ -1,9 +1,9 @@ -package me.confuser.banmanager.data; +package me.confuser.banmanager.common.data; -import com.j256.ormlite.field.DatabaseField; -import com.j256.ormlite.table.DatabaseTable; import lombok.Getter; -import me.confuser.banmanager.storage.mysql.ByteArray; +import me.confuser.banmanager.common.ormlite.field.DatabaseField; +import me.confuser.banmanager.common.ormlite.table.DatabaseTable; +import me.confuser.banmanager.common.storage.mysql.ByteArray; @DatabaseTable public class PlayerBanData { @@ -22,48 +22,53 @@ public class PlayerBanData { private PlayerData actor; // Should always be database time - @DatabaseField(index = true, columnDefinition = "INT(10) NOT NULL") + @DatabaseField(index = true, columnDefinition = "BIGINT UNSIGNED NOT NULL") @Getter private long created = System.currentTimeMillis() / 1000L; - @DatabaseField(index = true, columnDefinition = "INT(10) NOT NULL") + @DatabaseField(index = true, columnDefinition = "BIGINT UNSIGNED NOT NULL") @Getter private long updated = System.currentTimeMillis() / 1000L; - @DatabaseField(index = true, columnDefinition = "INT(10) NOT NULL") + @DatabaseField(index = true, columnDefinition = "BIGINT UNSIGNED NOT NULL") @Getter private long expires = 0; + @DatabaseField + @Getter + private boolean silent = false; + PlayerBanData() { } - public PlayerBanData(PlayerData player, PlayerData actor, String reason) { + public PlayerBanData(PlayerData player, PlayerData actor, String reason, boolean silent) { this.player = player; this.reason = reason; this.actor = actor; + this.silent = silent; } - public PlayerBanData(PlayerData player, PlayerData actor, String reason, long expires) { - this(player, actor, reason); + public PlayerBanData(PlayerData player, PlayerData actor, String reason, boolean silent, long expires) { + this(player, actor, reason, silent); this.expires = expires; } // Only use for imports! - public PlayerBanData(PlayerData player, PlayerData actor, String reason, long expires, long created) { - this(player, actor, reason, expires); + public PlayerBanData(PlayerData player, PlayerData actor, String reason, boolean silent, long expires, long created) { + this(player, actor, reason, silent, expires); this.created = created; } - public PlayerBanData(int id, PlayerData player, PlayerData actor, String reason, long expires, long created, long updated) { - this(player, actor, reason, expires, created); + public PlayerBanData(int id, PlayerData player, PlayerData actor, String reason, boolean silent, long expires, long created, long updated) { + this(player, actor, reason, silent, expires, created); this.id = id; this.updated = updated; } public PlayerBanData(PlayerBanRecord record) { - this(record.getPlayer(), record.getPastActor(), record.getReason(), record.getExpired(), record.getPastCreated()); + this(record.getPlayer(), record.getPastActor(), record.getReason(), record.isSilent(), record.getExpired(), record.getPastCreated()); } public boolean hasExpired() { @@ -72,9 +77,9 @@ public boolean hasExpired() { public boolean equalsBan(PlayerBanData ban) { return ban.getReason().equals(this.reason) - && ban.getExpires() == expires - && ban.getCreated() == this.created - && ban.getPlayer().getUUID().equals(this.getPlayer().getUUID()) - && ban.getActor().getUUID().equals(this.actor.getUUID()); + && ban.getExpires() == expires + && ban.getCreated() == this.created + && ban.getPlayer().getUUID().equals(this.getPlayer().getUUID()) + && ban.getActor().getUUID().equals(this.actor.getUUID()); } } diff --git a/src/main/java/me/confuser/banmanager/data/PlayerBanRecord.java b/common/src/main/java/me/confuser/banmanager/common/data/PlayerBanRecord.java similarity index 78% rename from src/main/java/me/confuser/banmanager/data/PlayerBanRecord.java rename to common/src/main/java/me/confuser/banmanager/common/data/PlayerBanRecord.java index e3d217c78..575ea76ff 100644 --- a/src/main/java/me/confuser/banmanager/data/PlayerBanRecord.java +++ b/common/src/main/java/me/confuser/banmanager/common/data/PlayerBanRecord.java @@ -1,9 +1,9 @@ -package me.confuser.banmanager.data; +package me.confuser.banmanager.common.data; -import com.j256.ormlite.field.DatabaseField; -import com.j256.ormlite.table.DatabaseTable; import lombok.Getter; -import me.confuser.banmanager.storage.mysql.ByteArray; +import me.confuser.banmanager.common.ormlite.field.DatabaseField; +import me.confuser.banmanager.common.ormlite.table.DatabaseTable; +import me.confuser.banmanager.common.storage.mysql.ByteArray; @DatabaseTable public class PlayerBanRecord { @@ -20,7 +20,7 @@ public class PlayerBanRecord { @Getter private String reason; - @DatabaseField(canBeNull = false) + @DatabaseField(canBeNull = false, columnDefinition = "BIGINT UNSIGNED NOT NULL") @Getter private long expired; @@ -32,11 +32,11 @@ public class PlayerBanRecord { @DatabaseField(canBeNull = false, foreign = true, foreignAutoRefresh = true, persisterClass = ByteArray.class, columnDefinition = "BINARY(16) NOT NULL") private PlayerData pastActor; - @DatabaseField(canBeNull = false, columnDefinition = "INT(10) NOT NULL") + @DatabaseField(canBeNull = false, columnDefinition = "BIGINT UNSIGNED NOT NULL") @Getter private long pastCreated; - @DatabaseField(index = true, canBeNull = false, columnDefinition = "INT(10) NOT NULL") + @DatabaseField(index = true, canBeNull = false, columnDefinition = "BIGINT UNSIGNED NOT NULL") @Getter private long created = System.currentTimeMillis() / 1000L; @@ -44,6 +44,10 @@ public class PlayerBanRecord { @Getter private String createdReason; + @DatabaseField + @Getter + private boolean silent = false; + PlayerBanRecord() { } @@ -54,6 +58,7 @@ public PlayerBanRecord(PlayerBanData ban, PlayerData actor, String reason) { pastActor = ban.getActor(); pastCreated = ban.getCreated(); createdReason = reason; + silent = ban.isSilent(); this.reason = ban.getReason(); this.actor = actor; @@ -65,6 +70,7 @@ public PlayerBanRecord(PlayerBanData ban, PlayerData actor, long created) { expired = ban.getExpires(); pastActor = ban.getActor(); pastCreated = ban.getCreated(); + silent = ban.isSilent(); this.actor = actor; this.created = created; diff --git a/common/src/main/java/me/confuser/banmanager/common/data/PlayerData.java b/common/src/main/java/me/confuser/banmanager/common/data/PlayerData.java new file mode 100644 index 000000000..985080c3f --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/data/PlayerData.java @@ -0,0 +1,77 @@ +package me.confuser.banmanager.common.data; + +import lombok.Getter; +import lombok.Setter; +import me.confuser.banmanager.common.ipaddr.AddressStringException; +import me.confuser.banmanager.common.ipaddr.IPAddress; +import me.confuser.banmanager.common.ipaddr.IPAddressString; +import me.confuser.banmanager.common.ormlite.field.DatabaseField; +import me.confuser.banmanager.common.ormlite.table.DatabaseTable; +import me.confuser.banmanager.common.storage.PlayerStorage; +import me.confuser.banmanager.common.storage.mysql.ByteArray; +import me.confuser.banmanager.common.storage.mysql.IpAddress; +import me.confuser.banmanager.common.util.UUIDUtils; + +import java.util.UUID; + +@DatabaseTable(tableName = "players", daoClass = PlayerStorage.class) +public class PlayerData { + + @DatabaseField(id = true, persisterClass = ByteArray.class, columnDefinition = "BINARY(16) NOT NULL") + @Getter + private byte[] id; + @DatabaseField(index = true, width = 16, columnDefinition = "VARCHAR(16) NOT NULL") + @Getter + @Setter + private String name; + @Getter + @DatabaseField(index = true, persisterClass = IpAddress.class, columnDefinition = "VARBINARY(16) NOT NULL") + private IPAddress ip; + @Getter + @DatabaseField(columnDefinition = "BIGINT UNSIGNED NOT NULL") + private long lastSeen = System.currentTimeMillis() / 1000L; + + private UUID uuid = null; + + PlayerData() { + + } + + public PlayerData(UUID uuid, String name) { + this.uuid = uuid; + this.id = UUIDUtils.toBytes(uuid); + this.name = name; + + try { + this.ip = new IPAddressString("127.0.0.1").toAddress(); + } catch (AddressStringException e) { + e.printStackTrace(); + } + + this.lastSeen = System.currentTimeMillis() / 1000L; + } + + public PlayerData(UUID uuid, String name, IPAddress ip) { + this.uuid = uuid; + this.id = UUIDUtils.toBytes(uuid); + this.name = name; + this.ip = ip; + this.lastSeen = System.currentTimeMillis() / 1000L; + } + + public PlayerData(UUID uuid, String name, IPAddress ip, long lastSeen) { + this.uuid = uuid; + this.id = UUIDUtils.toBytes(uuid); + this.name = name; + this.ip = ip; + this.lastSeen = lastSeen; + } + + public UUID getUUID() { + if (uuid == null) { + uuid = UUIDUtils.fromBytes(id); + } + + return uuid; + } +} diff --git a/src/main/java/me/confuser/banmanager/data/PlayerExemptionsData.java b/common/src/main/java/me/confuser/banmanager/common/data/PlayerExemptionsData.java similarity index 87% rename from src/main/java/me/confuser/banmanager/data/PlayerExemptionsData.java rename to common/src/main/java/me/confuser/banmanager/common/data/PlayerExemptionsData.java index 2fbbc03d5..5a6f7f92a 100644 --- a/src/main/java/me/confuser/banmanager/data/PlayerExemptionsData.java +++ b/common/src/main/java/me/confuser/banmanager/common/data/PlayerExemptionsData.java @@ -1,4 +1,4 @@ -package me.confuser.banmanager.data; +package me.confuser.banmanager.common.data; import java.util.HashSet; diff --git a/common/src/main/java/me/confuser/banmanager/common/data/PlayerHistoryData.java b/common/src/main/java/me/confuser/banmanager/common/data/PlayerHistoryData.java new file mode 100644 index 000000000..9cc8b8357 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/data/PlayerHistoryData.java @@ -0,0 +1,41 @@ +package me.confuser.banmanager.common.data; + +import lombok.Getter; +import lombok.Setter; +import me.confuser.banmanager.common.ipaddr.IPAddress; +import me.confuser.banmanager.common.ormlite.field.DatabaseField; +import me.confuser.banmanager.common.ormlite.table.DatabaseTable; +import me.confuser.banmanager.common.storage.mysql.ByteArray; +import me.confuser.banmanager.common.storage.mysql.IpAddress; + +@DatabaseTable +public class PlayerHistoryData { + + @Getter + @DatabaseField(generatedId = true) + private int id; + @Getter + @DatabaseField(canBeNull = false, foreign = true, persisterClass = ByteArray.class, columnDefinition = "BINARY(16) NOT NULL") + private PlayerData player; + @Getter + @DatabaseField(index = true, persisterClass = IpAddress.class, canBeNull = false, columnDefinition = "VARBINARY(16) NOT NULL") + private IPAddress ip; + + // Should always be database time + @Getter + @DatabaseField(index = true, columnDefinition = "BIGINT UNSIGNED NOT NULL") + private long join = System.currentTimeMillis() / 1000L; + @Getter + @Setter + @DatabaseField(index = true, columnDefinition = "BIGINT UNSIGNED NOT NULL") + private long leave = System.currentTimeMillis() / 1000L; + + PlayerHistoryData() { + + } + + public PlayerHistoryData(PlayerData player) { + this.player = player; + this.ip = player.getIp(); + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/data/PlayerKickData.java b/common/src/main/java/me/confuser/banmanager/common/data/PlayerKickData.java new file mode 100644 index 000000000..015ff21ee --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/data/PlayerKickData.java @@ -0,0 +1,45 @@ +package me.confuser.banmanager.common.data; + +import lombok.Getter; +import me.confuser.banmanager.common.ormlite.field.DatabaseField; +import me.confuser.banmanager.common.ormlite.table.DatabaseTable; +import me.confuser.banmanager.common.storage.mysql.ByteArray; + +@DatabaseTable +public class PlayerKickData { + + @Getter + @DatabaseField(generatedId = true) + private int id; + @Getter + @DatabaseField(canBeNull = false, foreign = true, foreignAutoRefresh = true, persisterClass = ByteArray.class, columnDefinition = "BINARY(16) NOT NULL") + private PlayerData player; + @Getter + @DatabaseField(canBeNull = false) + private String reason; + @Getter + @DatabaseField(canBeNull = false, foreign = true, foreignAutoRefresh = true, persisterClass = ByteArray.class, columnDefinition = "BINARY(16) NOT NULL") + private PlayerData actor; + // Should always be database time + @DatabaseField(index = true, columnDefinition = "BIGINT UNSIGNED NOT NULL") + @Getter + private long created = System.currentTimeMillis() / 1000L; + + PlayerKickData() { + + } + + public PlayerKickData(PlayerData player, PlayerData actor, String reason) { + this.player = player; + this.reason = reason; + this.actor = actor; + } + + // Imports only! + public PlayerKickData(PlayerData player, PlayerData actor, String reason, long created) { + this.player = player; + this.reason = reason; + this.actor = actor; + this.created = created; + } +} diff --git a/src/main/java/me/confuser/banmanager/data/PlayerMuteData.java b/common/src/main/java/me/confuser/banmanager/common/data/PlayerMuteData.java similarity index 65% rename from src/main/java/me/confuser/banmanager/data/PlayerMuteData.java rename to common/src/main/java/me/confuser/banmanager/common/data/PlayerMuteData.java index 22ae5ad27..cb7ccbc93 100644 --- a/src/main/java/me/confuser/banmanager/data/PlayerMuteData.java +++ b/common/src/main/java/me/confuser/banmanager/common/data/PlayerMuteData.java @@ -1,9 +1,9 @@ -package me.confuser.banmanager.data; +package me.confuser.banmanager.common.data; -import me.confuser.banmanager.storage.mysql.ByteArray; -import com.j256.ormlite.field.DatabaseField; -import com.j256.ormlite.table.DatabaseTable; import lombok.Getter; +import me.confuser.banmanager.common.ormlite.field.DatabaseField; +import me.confuser.banmanager.common.ormlite.table.DatabaseTable; +import me.confuser.banmanager.common.storage.mysql.ByteArray; @DatabaseTable public class PlayerMuteData { @@ -22,13 +22,13 @@ public class PlayerMuteData { private PlayerData actor; // Should always be database time - @DatabaseField(index = true, columnDefinition = "INT(10) NOT NULL") + @DatabaseField(index = true, columnDefinition = "BIGINT UNSIGNED NOT NULL") @Getter private long created = System.currentTimeMillis() / 1000L; - @DatabaseField(index = true, columnDefinition = "INT(10) NOT NULL") + @DatabaseField(index = true, columnDefinition = "BIGINT UNSIGNED NOT NULL") @Getter private long updated = System.currentTimeMillis() / 1000L; - @DatabaseField(index = true, columnDefinition = "INT(10) NOT NULL") + @DatabaseField(index = true, columnDefinition = "BIGINT UNSIGNED NOT NULL") @Getter private long expires = 0; @@ -37,39 +37,44 @@ public class PlayerMuteData { @Getter private boolean soft = false; + @DatabaseField + @Getter + private boolean silent = false; + PlayerMuteData() { } - public PlayerMuteData(PlayerData player, PlayerData actor, String reason, boolean soft) { + public PlayerMuteData(PlayerData player, PlayerData actor, String reason, boolean silent, boolean soft) { this.player = player; this.reason = reason; this.actor = actor; + this.silent = silent; this.soft = soft; } - public PlayerMuteData(PlayerData player, PlayerData actor, String reason, boolean soft, long expires) { - this(player, actor, reason, soft); + public PlayerMuteData(PlayerData player, PlayerData actor, String reason, boolean silent, boolean soft, long expires) { + this(player, actor, reason, silent, soft); this.expires = expires; } // Only use for imports! - public PlayerMuteData(PlayerData player, PlayerData actor, String reason, boolean soft, long expires, long created) { - this(player, actor, reason, soft, expires); + public PlayerMuteData(PlayerData player, PlayerData actor, String reason, boolean silent, boolean soft, long expires, long created) { + this(player, actor, reason, silent, soft, expires); this.created = created; } - public PlayerMuteData(int id, PlayerData player, PlayerData actor, String reason, boolean soft, long expires, long created, long updated) { - this(player, actor, reason, soft, expires, created); + public PlayerMuteData(int id, PlayerData player, PlayerData actor, String reason, boolean silent, boolean soft, long expires, long created, long updated) { + this(player, actor, reason, silent, soft, expires, created); this.id = id; this.updated = updated; } public PlayerMuteData(PlayerMuteRecord record) { - this(record.getPlayer(), record.getPastActor(), record.getReason(), record.isSoft(), record.getExpired(), record.getPastCreated()); + this(record.getPlayer(), record.getPastActor(), record.getReason(), record.isSilent(), record.isSoft(), record.getExpired(), record.getPastCreated()); } public boolean hasExpired() { diff --git a/src/main/java/me/confuser/banmanager/data/PlayerMuteRecord.java b/common/src/main/java/me/confuser/banmanager/common/data/PlayerMuteRecord.java similarity index 79% rename from src/main/java/me/confuser/banmanager/data/PlayerMuteRecord.java rename to common/src/main/java/me/confuser/banmanager/common/data/PlayerMuteRecord.java index 82c8a7c01..842dbc25e 100644 --- a/src/main/java/me/confuser/banmanager/data/PlayerMuteRecord.java +++ b/common/src/main/java/me/confuser/banmanager/common/data/PlayerMuteRecord.java @@ -1,9 +1,9 @@ -package me.confuser.banmanager.data; +package me.confuser.banmanager.common.data; -import com.j256.ormlite.field.DatabaseField; -import com.j256.ormlite.table.DatabaseTable; import lombok.Getter; -import me.confuser.banmanager.storage.mysql.ByteArray; +import me.confuser.banmanager.common.ormlite.field.DatabaseField; +import me.confuser.banmanager.common.ormlite.table.DatabaseTable; +import me.confuser.banmanager.common.storage.mysql.ByteArray; @DatabaseTable public class PlayerMuteRecord { @@ -20,7 +20,7 @@ public class PlayerMuteRecord { @Getter private String reason; - @DatabaseField(canBeNull = false) + @DatabaseField(canBeNull = false, columnDefinition = "BIGINT UNSIGNED NOT NULL") @Getter private long expired; @@ -32,11 +32,11 @@ public class PlayerMuteRecord { @Getter private PlayerData pastActor; - @DatabaseField(canBeNull = false, columnDefinition = "INT(10) NOT NULL") + @DatabaseField(canBeNull = false, columnDefinition = "BIGINT UNSIGNED NOT NULL") @Getter private long pastCreated; - @DatabaseField(index = true, canBeNull = false, columnDefinition = "INT(10) NOT NULL") + @DatabaseField(index = true, canBeNull = false, columnDefinition = "BIGINT UNSIGNED NOT NULL") @Getter private long created = System.currentTimeMillis() / 1000L; @@ -48,6 +48,10 @@ public class PlayerMuteRecord { @Getter private boolean soft = false; + @DatabaseField + @Getter + private boolean silent = false; + PlayerMuteRecord() { } @@ -58,6 +62,7 @@ public PlayerMuteRecord(PlayerMuteData mute, PlayerData actor, String reason) { pastActor = mute.getActor(); pastCreated = mute.getCreated(); createdReason = reason; + silent = mute.isSilent(); soft = mute.isSoft(); this.reason = mute.getReason(); @@ -70,6 +75,7 @@ public PlayerMuteRecord(PlayerMuteData mute, PlayerData actor, long created) { expired = mute.getExpires(); pastActor = mute.getActor(); pastCreated = mute.getCreated(); + silent = mute.isSilent(); soft = mute.isSoft(); this.actor = actor; diff --git a/src/main/java/me/confuser/banmanager/data/PlayerNoteData.java b/common/src/main/java/me/confuser/banmanager/common/data/PlayerNoteData.java similarity index 77% rename from src/main/java/me/confuser/banmanager/data/PlayerNoteData.java rename to common/src/main/java/me/confuser/banmanager/common/data/PlayerNoteData.java index ac5ed4021..f35687038 100644 --- a/src/main/java/me/confuser/banmanager/data/PlayerNoteData.java +++ b/common/src/main/java/me/confuser/banmanager/common/data/PlayerNoteData.java @@ -1,10 +1,9 @@ -package me.confuser.banmanager.data; +package me.confuser.banmanager.common.data; -import com.j256.ormlite.field.DatabaseField; -import com.j256.ormlite.table.DatabaseTable; import lombok.Getter; -import me.confuser.banmanager.storage.mysql.ByteArray; -import org.bukkit.ChatColor; +import me.confuser.banmanager.common.ormlite.field.DatabaseField; +import me.confuser.banmanager.common.ormlite.table.DatabaseTable; +import me.confuser.banmanager.common.storage.mysql.ByteArray; @DatabaseTable public class PlayerNoteData { @@ -22,7 +21,7 @@ public class PlayerNoteData { @Getter private PlayerData actor; // Should always be database time - @DatabaseField(index = true, columnDefinition = "INT(10) NOT NULL") + @DatabaseField(index = true, columnDefinition = "BIGINT UNSIGNED NOT NULL") @Getter private long created = System.currentTimeMillis() / 1000L; @@ -48,8 +47,4 @@ public boolean equalsNote(PlayerNoteData note) { && note.getPlayer().getUUID().equals(this.getPlayer().getUUID()) && note.getActor().getUUID().equals(this.actor.getUUID()); } - - public String getMessageColours() { - return ChatColor.translateAlternateColorCodes('&', this.message); - } } diff --git a/src/main/java/me/confuser/banmanager/data/PlayerReportCommandData.java b/common/src/main/java/me/confuser/banmanager/common/data/PlayerReportCommandData.java similarity index 73% rename from src/main/java/me/confuser/banmanager/data/PlayerReportCommandData.java rename to common/src/main/java/me/confuser/banmanager/common/data/PlayerReportCommandData.java index 47e071ec4..b2ffcc935 100644 --- a/src/main/java/me/confuser/banmanager/data/PlayerReportCommandData.java +++ b/common/src/main/java/me/confuser/banmanager/common/data/PlayerReportCommandData.java @@ -1,9 +1,9 @@ -package me.confuser.banmanager.data; +package me.confuser.banmanager.common.data; -import com.j256.ormlite.field.DatabaseField; -import com.j256.ormlite.table.DatabaseTable; import lombok.Getter; -import me.confuser.banmanager.storage.mysql.ByteArray; +import me.confuser.banmanager.common.ormlite.field.DatabaseField; +import me.confuser.banmanager.common.ormlite.table.DatabaseTable; +import me.confuser.banmanager.common.storage.mysql.ByteArray; @DatabaseTable public class PlayerReportCommandData { @@ -29,10 +29,10 @@ public class PlayerReportCommandData { @Getter private String args; - @DatabaseField(index = true, columnDefinition = "INT(10) NOT NULL") + @DatabaseField(index = true, columnDefinition = "BIGINT UNSIGNED NOT NULL") @Getter private long created = System.currentTimeMillis() / 1000L; - @DatabaseField(index = true, columnDefinition = "INT(10) NOT NULL") + @DatabaseField(index = true, columnDefinition = "BIGINT UNSIGNED NOT NULL") @Getter private long updated = System.currentTimeMillis() / 1000L; diff --git a/src/main/java/me/confuser/banmanager/data/PlayerReportCommentData.java b/common/src/main/java/me/confuser/banmanager/common/data/PlayerReportCommentData.java similarity index 71% rename from src/main/java/me/confuser/banmanager/data/PlayerReportCommentData.java rename to common/src/main/java/me/confuser/banmanager/common/data/PlayerReportCommentData.java index 5a0887109..b895c65ba 100644 --- a/src/main/java/me/confuser/banmanager/data/PlayerReportCommentData.java +++ b/common/src/main/java/me/confuser/banmanager/common/data/PlayerReportCommentData.java @@ -1,9 +1,9 @@ -package me.confuser.banmanager.data; +package me.confuser.banmanager.common.data; -import com.j256.ormlite.field.DatabaseField; -import com.j256.ormlite.table.DatabaseTable; import lombok.Getter; -import me.confuser.banmanager.storage.mysql.ByteArray; +import me.confuser.banmanager.common.ormlite.field.DatabaseField; +import me.confuser.banmanager.common.ormlite.table.DatabaseTable; +import me.confuser.banmanager.common.storage.mysql.ByteArray; @DatabaseTable public class PlayerReportCommentData { @@ -25,10 +25,10 @@ public class PlayerReportCommentData { @Getter private String comment; - @DatabaseField(index = true, columnDefinition = "INT(10) NOT NULL") + @DatabaseField(index = true, columnDefinition = "BIGINT UNSIGNED NOT NULL") @Getter private long created = System.currentTimeMillis() / 1000L; - @DatabaseField(index = true, columnDefinition = "INT(10) NOT NULL") + @DatabaseField(index = true, columnDefinition = "BIGINT UNSIGNED NOT NULL") @Getter private long updated = System.currentTimeMillis() / 1000L; diff --git a/src/main/java/me/confuser/banmanager/data/PlayerReportData.java b/common/src/main/java/me/confuser/banmanager/common/data/PlayerReportData.java similarity index 75% rename from src/main/java/me/confuser/banmanager/data/PlayerReportData.java rename to common/src/main/java/me/confuser/banmanager/common/data/PlayerReportData.java index 8ac699729..ff8b955b7 100644 --- a/src/main/java/me/confuser/banmanager/data/PlayerReportData.java +++ b/common/src/main/java/me/confuser/banmanager/common/data/PlayerReportData.java @@ -1,10 +1,10 @@ -package me.confuser.banmanager.data; +package me.confuser.banmanager.common.data; -import com.j256.ormlite.field.DatabaseField; -import com.j256.ormlite.table.DatabaseTable; import lombok.Getter; import lombok.Setter; -import me.confuser.banmanager.storage.mysql.ByteArray; +import me.confuser.banmanager.common.ormlite.field.DatabaseField; +import me.confuser.banmanager.common.ormlite.table.DatabaseTable; +import me.confuser.banmanager.common.storage.mysql.ByteArray; @DatabaseTable public class PlayerReportData { @@ -26,7 +26,7 @@ public class PlayerReportData { @DatabaseField(index = true, canBeNull = false, foreign = true, foreignAutoRefresh = true, persisterClass = ByteArray.class, columnDefinition = "BINARY(16) NOT NULL") private PlayerData actor; - @DatabaseField(index = true, canBeNull = false, foreign = true, foreignAutoRefresh = true, uniqueIndex = false) + @DatabaseField(index = true, canBeNull = false, foreign = true, foreignAutoRefresh = true, uniqueIndex = false, defaultValue = "1") @Getter @Setter private ReportState state; @@ -37,11 +37,11 @@ public class PlayerReportData { private PlayerData assignee; // Should always be database time - @DatabaseField(index = true, columnDefinition = "INT(10) NOT NULL") + @DatabaseField(index = true, columnDefinition = "BIGINT UNSIGNED NOT NULL") @Getter private long created = System.currentTimeMillis() / 1000L; - @DatabaseField(index = true, columnDefinition = "INT(10) NOT NULL") + @DatabaseField(index = true, columnDefinition = "BIGINT UNSIGNED NOT NULL") @Getter private long updated = System.currentTimeMillis() / 1000L; diff --git a/src/main/java/me/confuser/banmanager/data/PlayerReportLocationData.java b/common/src/main/java/me/confuser/banmanager/common/data/PlayerReportLocationData.java similarity index 71% rename from src/main/java/me/confuser/banmanager/data/PlayerReportLocationData.java rename to common/src/main/java/me/confuser/banmanager/common/data/PlayerReportLocationData.java index ea7f09a54..282af5fc7 100644 --- a/src/main/java/me/confuser/banmanager/data/PlayerReportLocationData.java +++ b/common/src/main/java/me/confuser/banmanager/common/data/PlayerReportLocationData.java @@ -1,10 +1,9 @@ -package me.confuser.banmanager.data; +package me.confuser.banmanager.common.data; -import com.j256.ormlite.field.DatabaseField; -import com.j256.ormlite.table.DatabaseTable; import lombok.Getter; -import me.confuser.banmanager.storage.mysql.ByteArray; -import org.bukkit.Location; +import me.confuser.banmanager.common.ormlite.field.DatabaseField; +import me.confuser.banmanager.common.ormlite.table.DatabaseTable; +import me.confuser.banmanager.common.storage.mysql.ByteArray; @DatabaseTable public class PlayerReportLocationData { @@ -50,15 +49,17 @@ public class PlayerReportLocationData { } - public PlayerReportLocationData(PlayerReportData report, PlayerData player, Location location) { + public PlayerReportLocationData(PlayerReportData report, PlayerData player, String world, double x, double y, double + z, float + pitch, float yaw) { this.report = report; this.player = player; - this.world = location.getWorld().getName(); - this.x = location.getX(); - this.y = location.getY(); - this.z = location.getZ(); - this.pitch = location.getPitch(); - this.yaw = location.getYaw(); + this.world = world; + this.x = x; + this.y = y; + this.z = z; + this.pitch = pitch; + this.yaw = yaw; } } diff --git a/src/main/java/me/confuser/banmanager/data/PlayerWarnData.java b/common/src/main/java/me/confuser/banmanager/common/data/PlayerWarnData.java similarity index 81% rename from src/main/java/me/confuser/banmanager/data/PlayerWarnData.java rename to common/src/main/java/me/confuser/banmanager/common/data/PlayerWarnData.java index 1583d1ad9..0f84fb017 100644 --- a/src/main/java/me/confuser/banmanager/data/PlayerWarnData.java +++ b/common/src/main/java/me/confuser/banmanager/common/data/PlayerWarnData.java @@ -1,10 +1,10 @@ -package me.confuser.banmanager.data; +package me.confuser.banmanager.common.data; -import com.j256.ormlite.field.DatabaseField; -import com.j256.ormlite.table.DatabaseTable; import lombok.Getter; import lombok.Setter; -import me.confuser.banmanager.storage.mysql.ByteArray; +import me.confuser.banmanager.common.ormlite.field.DatabaseField; +import me.confuser.banmanager.common.ormlite.table.DatabaseTable; +import me.confuser.banmanager.common.storage.mysql.ByteArray; @DatabaseTable public class PlayerWarnData { @@ -26,11 +26,11 @@ public class PlayerWarnData { private PlayerData actor; // Should always be database time - @DatabaseField(index = true, columnDefinition = "INT(10) NOT NULL") + @DatabaseField(index = true, columnDefinition = "BIGINT UNSIGNED NOT NULL") @Getter private long created = System.currentTimeMillis() / 1000L; - @DatabaseField(index = true, columnDefinition = "INT(10) NOT NULL") + @DatabaseField(index = true, columnDefinition = "BIGINT UNSIGNED NOT NULL") @Getter private long expires = 0; diff --git a/src/main/java/me/confuser/banmanager/data/ReportState.java b/common/src/main/java/me/confuser/banmanager/common/data/ReportState.java similarity index 62% rename from src/main/java/me/confuser/banmanager/data/ReportState.java rename to common/src/main/java/me/confuser/banmanager/common/data/ReportState.java index b7809b830..b3970b54b 100644 --- a/src/main/java/me/confuser/banmanager/data/ReportState.java +++ b/common/src/main/java/me/confuser/banmanager/common/data/ReportState.java @@ -1,7 +1,7 @@ -package me.confuser.banmanager.data; +package me.confuser.banmanager.common.data; -import com.j256.ormlite.field.DatabaseField; -import com.j256.ormlite.table.DatabaseTable; +import me.confuser.banmanager.common.ormlite.field.DatabaseField; +import me.confuser.banmanager.common.ormlite.table.DatabaseTable; import lombok.Getter; @DatabaseTable diff --git a/src/main/java/me/confuser/banmanager/data/RollbackData.java b/common/src/main/java/me/confuser/banmanager/common/data/RollbackData.java similarity index 76% rename from src/main/java/me/confuser/banmanager/data/RollbackData.java rename to common/src/main/java/me/confuser/banmanager/common/data/RollbackData.java index 7bf4962d0..fadb9e115 100644 --- a/src/main/java/me/confuser/banmanager/data/RollbackData.java +++ b/common/src/main/java/me/confuser/banmanager/common/data/RollbackData.java @@ -1,9 +1,9 @@ -package me.confuser.banmanager.data; +package me.confuser.banmanager.common.data; -import com.j256.ormlite.field.DatabaseField; -import com.j256.ormlite.table.DatabaseTable; import lombok.Getter; -import me.confuser.banmanager.storage.mysql.ByteArray; +import me.confuser.banmanager.common.ormlite.field.DatabaseField; +import me.confuser.banmanager.common.ormlite.table.DatabaseTable; +import me.confuser.banmanager.common.storage.mysql.ByteArray; @DatabaseTable public class RollbackData { @@ -25,11 +25,11 @@ public class RollbackData { private String type; // Should always be database time - @DatabaseField(index = true, columnDefinition = "INT(10) NOT NULL") + @DatabaseField(index = true, columnDefinition = "BIGINT UNSIGNED NOT NULL") @Getter private long created = System.currentTimeMillis() / 1000L; - @DatabaseField(index = true, columnDefinition = "INT(10) NOT NULL") + @DatabaseField(index = true, columnDefinition = "BIGINT UNSIGNED NOT NULL") @Getter private long expires = 0; diff --git a/common/src/main/java/me/confuser/banmanager/common/data/global/GlobalIpBanData.java b/common/src/main/java/me/confuser/banmanager/common/data/global/GlobalIpBanData.java new file mode 100644 index 000000000..f9fc2b250 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/data/global/GlobalIpBanData.java @@ -0,0 +1,80 @@ +package me.confuser.banmanager.common.data.global; + +import lombok.Getter; +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.data.IpBanData; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.ipaddr.IPAddress; +import me.confuser.banmanager.common.ormlite.field.DatabaseField; +import me.confuser.banmanager.common.storage.mysql.ByteArray; +import me.confuser.banmanager.common.storage.mysql.IpAddress; +import me.confuser.banmanager.common.util.UUIDUtils; + +import java.sql.SQLException; +import java.util.UUID; + +public class GlobalIpBanData { + + @DatabaseField(generatedId = true) + @Getter + private int id; + + @Getter + @DatabaseField(canBeNull = false, persisterClass = IpAddress.class, columnDefinition = "VARBINARY(16) NOT NULL") + private IPAddress ip; + + @DatabaseField(canBeNull = false) + @Getter + private String reason; + + @DatabaseField(columnName = "actorUuid", canBeNull = false, index = true, persisterClass = ByteArray.class, columnDefinition = "BINARY(16) NOT NULL") + private byte[] actorUuidBytes; + + @DatabaseField(canBeNull = false, width = 16, columnDefinition = "VARCHAR(16) NOT NULL") + @Getter + private String actorName; + + // Should always be database time + @DatabaseField(index = true, columnDefinition = "BIGINT UNSIGNED NOT NULL") + @Getter + private long created = System.currentTimeMillis() / 1000L; + + @DatabaseField(index = true, columnDefinition = "BIGINT UNSIGNED NOT NULL") + @Getter + private long expires = 0; + + private UUID actorUUID; + + GlobalIpBanData() { + + } + + public GlobalIpBanData(IPAddress ip, PlayerData actor, String reason) { + this.ip = ip; + this.reason = reason; + this.actorUuidBytes = actor.getId(); + this.actorName = actor.getName(); + } + + public GlobalIpBanData(IPAddress ip, PlayerData actor, String reason, long expires) { + this(ip, actor, reason); + + this.expires = expires; + } + + public UUID getActorUUID() { + if (actorUUID == null) { + actorUUID = UUIDUtils.fromBytes(actorUuidBytes); + } + + return actorUUID; + } + + public PlayerData getActor(BanManagerPlugin plugin) throws SQLException { + return plugin.getPlayerStorage().createIfNotExists(getActorUUID(), getActorName()); + } + + public IpBanData toLocal(BanManagerPlugin plugin) throws SQLException { + return new IpBanData(ip, getActor(plugin), reason, false, expires, created); + } +} diff --git a/src/main/java/me/confuser/banmanager/data/global/GlobalIpBanRecordData.java b/common/src/main/java/me/confuser/banmanager/common/data/global/GlobalIpBanRecordData.java similarity index 50% rename from src/main/java/me/confuser/banmanager/data/global/GlobalIpBanRecordData.java rename to common/src/main/java/me/confuser/banmanager/common/data/global/GlobalIpBanRecordData.java index 3532e3ebf..bff4af498 100644 --- a/src/main/java/me/confuser/banmanager/data/global/GlobalIpBanRecordData.java +++ b/common/src/main/java/me/confuser/banmanager/common/data/global/GlobalIpBanRecordData.java @@ -1,12 +1,13 @@ -package me.confuser.banmanager.data.global; +package me.confuser.banmanager.common.data.global; -import com.j256.ormlite.field.DatabaseField; import lombok.Getter; -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.storage.PlayerStorage; -import me.confuser.banmanager.storage.mysql.ByteArray; -import me.confuser.banmanager.util.UUIDUtils; +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.ipaddr.IPAddress; +import me.confuser.banmanager.common.ormlite.field.DatabaseField; +import me.confuser.banmanager.common.storage.mysql.ByteArray; +import me.confuser.banmanager.common.storage.mysql.IpAddress; +import me.confuser.banmanager.common.util.UUIDUtils; import java.sql.SQLException; import java.util.UUID; @@ -18,8 +19,8 @@ public class GlobalIpBanRecordData { private int id; @Getter - @DatabaseField(canBeNull = false, columnDefinition = "INT UNSIGNED NOT NULL") - private long ip; + @DatabaseField(canBeNull = false, persisterClass = IpAddress.class, columnDefinition = "VARBINARY(16) NOT NULL") + private IPAddress ip; @DatabaseField(columnName = "actorUuid", canBeNull = false, index = true, persisterClass = ByteArray.class, columnDefinition = "BINARY(16) NOT NULL") private byte[] actorUuidBytes; @@ -29,26 +30,24 @@ public class GlobalIpBanRecordData { private String actorName; // Should always be database time - @DatabaseField(index = true, columnDefinition = "INT(10) NOT NULL") + @DatabaseField(index = true, columnDefinition = "BIGINT UNSIGNED NOT NULL") @Getter private long created = System.currentTimeMillis() / 1000L; private UUID actorUUID; - private PlayerStorage playerStorage = BanManager.getPlugin().getPlayerStorage(); - GlobalIpBanRecordData() { } - public GlobalIpBanRecordData(long ip, PlayerData actor) { + public GlobalIpBanRecordData(IPAddress ip, PlayerData actor) { this.ip = ip; this.actorUuidBytes = actor.getId(); this.actorName = actor.getName(); } // Only use for imports! - public GlobalIpBanRecordData(long ip, PlayerData actor, long created) { + public GlobalIpBanRecordData(IPAddress ip, PlayerData actor, long created) { this(ip, actor); this.created = created; @@ -62,7 +61,7 @@ public UUID getActorUUID() { return actorUUID; } - public PlayerData getActor() throws SQLException { - return playerStorage.createIfNotExists(getActorUUID(), getActorName()); + public PlayerData getActor(BanManagerPlugin plugin) throws SQLException { + return plugin.getPlayerStorage().createIfNotExists(getActorUUID(), getActorName()); } } diff --git a/src/main/java/me/confuser/banmanager/data/global/GlobalPlayerBanData.java b/common/src/main/java/me/confuser/banmanager/common/data/global/GlobalPlayerBanData.java similarity index 67% rename from src/main/java/me/confuser/banmanager/data/global/GlobalPlayerBanData.java rename to common/src/main/java/me/confuser/banmanager/common/data/global/GlobalPlayerBanData.java index b0457dd7d..03641dff9 100644 --- a/src/main/java/me/confuser/banmanager/data/global/GlobalPlayerBanData.java +++ b/common/src/main/java/me/confuser/banmanager/common/data/global/GlobalPlayerBanData.java @@ -1,13 +1,13 @@ -package me.confuser.banmanager.data.global; +package me.confuser.banmanager.common.data.global; -import com.j256.ormlite.field.DatabaseField; import lombok.Getter; -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.PlayerBanData; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.storage.PlayerStorage; -import me.confuser.banmanager.storage.mysql.ByteArray; -import me.confuser.banmanager.util.UUIDUtils; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.data.PlayerBanData; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.ormlite.field.DatabaseField; +import me.confuser.banmanager.common.storage.mysql.ByteArray; +import me.confuser.banmanager.common.util.UUIDUtils; import java.sql.SQLException; import java.util.UUID; @@ -37,19 +37,17 @@ public class GlobalPlayerBanData { private String actorName; // Should always be database time - @DatabaseField(index = true, columnDefinition = "INT(10) NOT NULL") + @DatabaseField(index = true, columnDefinition = "BIGINT UNSIGNED NOT NULL") @Getter private long created = System.currentTimeMillis() / 1000L; - @DatabaseField(index = true, columnDefinition = "INT(10) NOT NULL") + @DatabaseField(index = true, columnDefinition = "BIGINT UNSIGNED NOT NULL") @Getter private long expires = 0; private UUID uuid; private UUID actorUUID; - private PlayerStorage playerStorage = BanManager.getPlugin().getPlayerStorage(); - GlobalPlayerBanData() { } @@ -95,15 +93,15 @@ public UUID getActorUUID() { return actorUUID; } - public PlayerData getPlayer() throws SQLException { - return playerStorage.createIfNotExists(getUUID(), getName()); + public PlayerData getPlayer(BanManagerPlugin plugin) throws SQLException { + return plugin.getPlayerStorage().createIfNotExists(getUUID(), getName()); } - public PlayerData getActor() throws SQLException { - return playerStorage.createIfNotExists(getActorUUID(), getActorName()); + public PlayerData getActor(BanManagerPlugin plugin) throws SQLException { + return plugin.getPlayerStorage().createIfNotExists(getActorUUID(), getActorName()); } - public PlayerBanData toLocal() throws SQLException { - return new PlayerBanData(getPlayer(), getActor(), reason, expires, created); + public PlayerBanData toLocal(BanManagerPlugin plugin) throws SQLException { + return new PlayerBanData(getPlayer(plugin), getActor(plugin), reason, false, expires, created); } } diff --git a/src/main/java/me/confuser/banmanager/data/global/GlobalPlayerBanRecordData.java b/common/src/main/java/me/confuser/banmanager/common/data/global/GlobalPlayerBanRecordData.java similarity index 69% rename from src/main/java/me/confuser/banmanager/data/global/GlobalPlayerBanRecordData.java rename to common/src/main/java/me/confuser/banmanager/common/data/global/GlobalPlayerBanRecordData.java index c33cd35f5..d663af409 100644 --- a/src/main/java/me/confuser/banmanager/data/global/GlobalPlayerBanRecordData.java +++ b/common/src/main/java/me/confuser/banmanager/common/data/global/GlobalPlayerBanRecordData.java @@ -1,12 +1,11 @@ -package me.confuser.banmanager.data.global; +package me.confuser.banmanager.common.data.global; -import com.j256.ormlite.field.DatabaseField; import lombok.Getter; -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.storage.PlayerStorage; -import me.confuser.banmanager.storage.mysql.ByteArray; -import me.confuser.banmanager.util.UUIDUtils; +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.ormlite.field.DatabaseField; +import me.confuser.banmanager.common.storage.mysql.ByteArray; +import me.confuser.banmanager.common.util.UUIDUtils; import java.sql.SQLException; import java.util.UUID; @@ -32,15 +31,13 @@ public class GlobalPlayerBanRecordData { private String actorName; // Should always be database time - @DatabaseField(index = true, columnDefinition = "INT(10) NOT NULL") + @DatabaseField(index = true, columnDefinition = "BIGINT UNSIGNED NOT NULL") @Getter private long created = System.currentTimeMillis() / 1000L; private UUID uuid; private UUID actorUUID; - private PlayerStorage playerStorage = BanManager.getPlugin().getPlayerStorage(); - GlobalPlayerBanRecordData() { } @@ -75,11 +72,11 @@ public UUID getActorUUID() { return actorUUID; } - public PlayerData getPlayer() throws SQLException { - return playerStorage.createIfNotExists(getUUID(), getName()); + public PlayerData getPlayer(BanManagerPlugin plugin) throws SQLException { + return plugin.getPlayerStorage().createIfNotExists(getUUID(), getName()); } - public PlayerData getActor() throws SQLException { - return playerStorage.createIfNotExists(getActorUUID(), getActorName()); + public PlayerData getActor(BanManagerPlugin plugin) throws SQLException { + return plugin.getPlayerStorage().createIfNotExists(getActorUUID(), getActorName()); } } diff --git a/src/main/java/me/confuser/banmanager/data/global/GlobalPlayerMuteData.java b/common/src/main/java/me/confuser/banmanager/common/data/global/GlobalPlayerMuteData.java similarity index 68% rename from src/main/java/me/confuser/banmanager/data/global/GlobalPlayerMuteData.java rename to common/src/main/java/me/confuser/banmanager/common/data/global/GlobalPlayerMuteData.java index 06080b43c..2ab0fee94 100644 --- a/src/main/java/me/confuser/banmanager/data/global/GlobalPlayerMuteData.java +++ b/common/src/main/java/me/confuser/banmanager/common/data/global/GlobalPlayerMuteData.java @@ -1,13 +1,12 @@ -package me.confuser.banmanager.data.global; +package me.confuser.banmanager.common.data.global; -import com.j256.ormlite.field.DatabaseField; import lombok.Getter; -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.data.PlayerMuteData; -import me.confuser.banmanager.storage.PlayerStorage; -import me.confuser.banmanager.storage.mysql.ByteArray; -import me.confuser.banmanager.util.UUIDUtils; +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.data.PlayerMuteData; +import me.confuser.banmanager.common.ormlite.field.DatabaseField; +import me.confuser.banmanager.common.storage.mysql.ByteArray; +import me.confuser.banmanager.common.util.UUIDUtils; import java.sql.SQLException; import java.util.UUID; @@ -37,11 +36,11 @@ public class GlobalPlayerMuteData { private String actorName; // Should always be database time - @DatabaseField(index = true, columnDefinition = "INT(10) NOT NULL") + @DatabaseField(index = true, columnDefinition = "BIGINT UNSIGNED NOT NULL") @Getter private long created = System.currentTimeMillis() / 1000L; - @DatabaseField(index = true, columnDefinition = "INT(10) NOT NULL") + @DatabaseField(index = true, columnDefinition = "BIGINT UNSIGNED NOT NULL") @Getter private long expires = 0; @@ -52,7 +51,6 @@ public class GlobalPlayerMuteData { private UUID uuid; private UUID actorUUID; - private PlayerStorage playerStorage = BanManager.getPlugin().getPlayerStorage(); GlobalPlayerMuteData() { @@ -100,15 +98,15 @@ public UUID getActorUUID() { return actorUUID; } - public PlayerData getPlayer() throws SQLException { - return playerStorage.createIfNotExists(getUUID(), getName()); + public PlayerData getPlayer(BanManagerPlugin plugin) throws SQLException { + return plugin.getPlayerStorage().createIfNotExists(getUUID(), getName()); } - public PlayerData getActor() throws SQLException { - return playerStorage.createIfNotExists(getActorUUID(), getActorName()); + public PlayerData getActor(BanManagerPlugin plugin) throws SQLException { + return plugin.getPlayerStorage().createIfNotExists(getActorUUID(), getActorName()); } - public PlayerMuteData toLocal() throws SQLException { - return new PlayerMuteData(getPlayer(), getActor(), reason, soft, expires, created); + public PlayerMuteData toLocal(BanManagerPlugin plugin) throws SQLException { + return new PlayerMuteData(getPlayer(plugin), getActor(plugin), reason, false, soft, expires, created); } } diff --git a/src/main/java/me/confuser/banmanager/data/global/GlobalPlayerMuteRecordData.java b/common/src/main/java/me/confuser/banmanager/common/data/global/GlobalPlayerMuteRecordData.java similarity index 69% rename from src/main/java/me/confuser/banmanager/data/global/GlobalPlayerMuteRecordData.java rename to common/src/main/java/me/confuser/banmanager/common/data/global/GlobalPlayerMuteRecordData.java index 456da57e1..6525bda19 100644 --- a/src/main/java/me/confuser/banmanager/data/global/GlobalPlayerMuteRecordData.java +++ b/common/src/main/java/me/confuser/banmanager/common/data/global/GlobalPlayerMuteRecordData.java @@ -1,12 +1,11 @@ -package me.confuser.banmanager.data.global; +package me.confuser.banmanager.common.data.global; -import com.j256.ormlite.field.DatabaseField; import lombok.Getter; -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.storage.PlayerStorage; -import me.confuser.banmanager.storage.mysql.ByteArray; -import me.confuser.banmanager.util.UUIDUtils; +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.ormlite.field.DatabaseField; +import me.confuser.banmanager.common.storage.mysql.ByteArray; +import me.confuser.banmanager.common.util.UUIDUtils; import java.sql.SQLException; import java.util.UUID; @@ -32,15 +31,13 @@ public class GlobalPlayerMuteRecordData { private String actorName; // Should always be database time - @DatabaseField(index = true, columnDefinition = "INT(10) NOT NULL") + @DatabaseField(index = true, columnDefinition = "BIGINT UNSIGNED NOT NULL") @Getter private long created = System.currentTimeMillis() / 1000L; private UUID uuid; private UUID actorUUID; - private PlayerStorage playerStorage = BanManager.getPlugin().getPlayerStorage(); - GlobalPlayerMuteRecordData() { } @@ -75,11 +72,11 @@ public UUID getActorUUID() { return actorUUID; } - public PlayerData getPlayer() throws SQLException { - return playerStorage.createIfNotExists(getUUID(), getName()); + public PlayerData getPlayer(BanManagerPlugin plugin) throws SQLException { + return plugin.getPlayerStorage().createIfNotExists(getUUID(), getName()); } - public PlayerData getActor() throws SQLException { - return playerStorage.createIfNotExists(getActorUUID(), getActorName()); + public PlayerData getActor(BanManagerPlugin plugin) throws SQLException { + return plugin.getPlayerStorage().createIfNotExists(getActorUUID(), getActorName()); } } diff --git a/src/main/java/me/confuser/banmanager/data/global/GlobalPlayerNoteData.java b/common/src/main/java/me/confuser/banmanager/common/data/global/GlobalPlayerNoteData.java similarity index 63% rename from src/main/java/me/confuser/banmanager/data/global/GlobalPlayerNoteData.java rename to common/src/main/java/me/confuser/banmanager/common/data/global/GlobalPlayerNoteData.java index 7b4d5b3c7..feea68f06 100644 --- a/src/main/java/me/confuser/banmanager/data/global/GlobalPlayerNoteData.java +++ b/common/src/main/java/me/confuser/banmanager/common/data/global/GlobalPlayerNoteData.java @@ -1,14 +1,12 @@ -package me.confuser.banmanager.data.global; +package me.confuser.banmanager.common.data.global; -import com.j256.ormlite.field.DatabaseField; import lombok.Getter; -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.data.PlayerNoteData; -import me.confuser.banmanager.storage.PlayerStorage; -import me.confuser.banmanager.storage.mysql.ByteArray; -import me.confuser.banmanager.util.UUIDUtils; -import org.bukkit.ChatColor; +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.data.PlayerNoteData; +import me.confuser.banmanager.common.ormlite.field.DatabaseField; +import me.confuser.banmanager.common.storage.mysql.ByteArray; +import me.confuser.banmanager.common.util.UUIDUtils; import java.sql.SQLException; import java.util.UUID; @@ -38,15 +36,13 @@ public class GlobalPlayerNoteData { private String actorName; // Should always be database time - @DatabaseField(index = true, columnDefinition = "INT(10) NOT NULL") + @DatabaseField(index = true, columnDefinition = "BIGINT UNSIGNED NOT NULL") @Getter private long created = System.currentTimeMillis() / 1000L; private UUID uuid; private UUID actorUUID; - private PlayerStorage playerStorage = BanManager.getPlugin().getPlayerStorage(); - GlobalPlayerNoteData() { } @@ -82,19 +78,20 @@ public UUID getActorUUID() { return actorUUID; } - public PlayerData getPlayer() throws SQLException { - return playerStorage.createIfNotExists(getUUID(), getName()); + public PlayerData getPlayer(BanManagerPlugin plugin) throws SQLException { + return plugin.getPlayerStorage().createIfNotExists(getUUID(), getName()); } - public PlayerData getActor() throws SQLException { - return playerStorage.createIfNotExists(getActorUUID(), getActorName()); + public PlayerData getActor(BanManagerPlugin plugin) throws SQLException { + return plugin.getPlayerStorage().createIfNotExists(getActorUUID(), getActorName()); } - public PlayerNoteData toLocal() throws SQLException { - return new PlayerNoteData(getPlayer(), getActor(), message, created); + public PlayerNoteData toLocal(BanManagerPlugin plugin) throws SQLException { + return new PlayerNoteData(getPlayer(plugin), getActor(plugin), message, created); } public String getMessageColours() { - return ChatColor.translateAlternateColorCodes('&', this.message); +// return ChatColor.translateAlternateColorCodes('&', this.message); + return this.message; } } diff --git a/common/src/main/java/me/confuser/banmanager/common/listeners/CommonBanListener.java b/common/src/main/java/me/confuser/banmanager/common/listeners/CommonBanListener.java new file mode 100755 index 000000000..e0e2d758e --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/listeners/CommonBanListener.java @@ -0,0 +1,186 @@ +package me.confuser.banmanager.common.listeners; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.CommonPlayer; +import me.confuser.banmanager.common.data.*; +import me.confuser.banmanager.common.util.DateUtils; +import me.confuser.banmanager.common.util.Message; + +import java.util.List; + +public class CommonBanListener { + private BanManagerPlugin plugin; + + public CommonBanListener(BanManagerPlugin plugin) { + this.plugin = plugin; + } + + public void notifyOnBan(PlayerBanData data, boolean silent) { + String broadcastPermission; + Message message; + + if (data.getExpires() == 0) { + broadcastPermission = "bm.notify.ban"; + message = Message.get("ban.notify"); + } else { + broadcastPermission = "bm.notify.tempban"; + message = Message.get("tempban.notify"); + message.set("expires", DateUtils.getDifferenceFormat(data.getExpires())); + } + + message + .set("id", data.getId()) + .set("player", data.getPlayer().getName()) + .set("playerId", data.getPlayer().getUUID().toString()) + .set("actor", data.getActor().getName()) + .set("reason", data.getReason()); + + if (!silent) { + plugin.getServer().broadcast(message.toString(), broadcastPermission); + } else if (plugin.getPlayerStorage().getConsole().getUUID().equals(data.getActor().getUUID())) { + plugin.getServer().getConsoleSender().sendMessage(message); + return; + } + + // Check if the sender is online and does not have the + // broadcastPermission + CommonPlayer player = plugin.getServer().getPlayer(data.getActor().getUUID()); + + if (player == null || !player.isOnline()) { + return; + } + + if (silent || !player.hasPermission(broadcastPermission)) { + message.sendTo(player); + } + } + + public void notifyOnBan(IpBanData data, boolean silent) { + String broadcastPermission; + Message message; + + if (data.getExpires() == 0) { + broadcastPermission = "bm.notify.banip"; + message = Message.get("banip.notify"); + } else { + broadcastPermission = "bm.notify.tempbanip"; + message = Message.get("tempbanip.notify"); + message.set("expires", DateUtils.getDifferenceFormat(data.getExpires())); + } + + List players = plugin.getPlayerStorage().getDuplicatesInTime(data.getIp(), plugin.getConfig().getTimeAssociatedAlts()); + StringBuilder playerNames = new StringBuilder(); + + for (PlayerData player : players) { + playerNames.append(player.getName()); + playerNames.append(", "); + } + + if (playerNames.length() >= 2) playerNames.setLength(playerNames.length() - 2); + + message + .set("id", data.getId()) + .set("ip", data.getIp().toString()) + .set("actor", data.getActor().getName()) + .set("reason", data.getReason()) + .set("players", playerNames.toString()); + + if (!silent) { + plugin.getServer().broadcast(message.toString(), broadcastPermission); + } else if (plugin.getPlayerStorage().getConsole().getUUID().equals(data.getActor().getUUID())) { + plugin.getServer().getConsoleSender().sendMessage(message); + return; + } + + // Check if the sender is online and does not have the + // broadcastPermission + CommonPlayer player = plugin.getServer().getPlayer(data.getActor().getUUID()); + + if (player == null || !player.isOnline()) { + return; + } + + if (silent || !player.hasPermission(broadcastPermission)) { + message.sendTo(player); + } + } + + public void notifyOnBan(IpRangeBanData data, boolean silent) { + String broadcastPermission; + Message message; + + if (data.getExpires() == 0) { + broadcastPermission = "bm.notify.baniprange"; + message = Message.get("baniprange.notify"); + } else { + broadcastPermission = "bm.notify.tempbaniprange"; + message = Message.get("tempbaniprange.notify"); + message.set("expires", DateUtils.getDifferenceFormat(data.getExpires())); + } + + message + .set("id", data.getId()) + .set("from", data.getFromIp().toString()) + .set("to", data.getToIp().toString()) + .set("actor", data.getActor().getName()) + .set("reason", data.getReason()); + + if (!silent) { + plugin.getServer().broadcast(message.toString(), broadcastPermission); + } else if (plugin.getPlayerStorage().getConsole().getUUID().equals(data.getActor().getUUID())) { + plugin.getServer().getConsoleSender().sendMessage(message); + return; + } + + // Check if the sender is online and does not have the + // broadcastPermission + CommonPlayer player = plugin.getServer().getPlayer(data.getActor().getUUID()); + + if (player == null || !player.isOnline()) { + return; + } + + if (silent || !player.hasPermission(broadcastPermission)) { + message.sendTo(player); + } + } + + public void notifyOnBan(NameBanData data, boolean silent) { + String broadcastPermission; + Message message; + + if (data.getExpires() == 0) { + broadcastPermission = "bm.notify.banname"; + message = Message.get("banname.notify"); + } else { + broadcastPermission = "bm.notify.tempbanname"; + message = Message.get("tempbanname.notify"); + message.set("expires", DateUtils.getDifferenceFormat(data.getExpires())); + } + + message + .set("id", data.getId()) + .set("name", data.getName()) + .set("actor", data.getActor().getName()) + .set("reason", data.getReason()); + + if (!silent) { + plugin.getServer().broadcast(message.toString(), broadcastPermission); + } else if (plugin.getPlayerStorage().getConsole().getUUID().equals(data.getActor().getUUID())) { + plugin.getServer().getConsoleSender().sendMessage(message); + return; + } + + // Check if the sender is online and does not have the + // broadcastPermission + CommonPlayer player = plugin.getServer().getPlayer(data.getActor().getUUID()); + + if (player == null || !player.isOnline()) { + return; + } + + if (silent || !player.hasPermission(broadcastPermission)) { + message.sendTo(player); + } + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/listeners/CommonChatHandler.java b/common/src/main/java/me/confuser/banmanager/common/listeners/CommonChatHandler.java new file mode 100755 index 000000000..ec518efbd --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/listeners/CommonChatHandler.java @@ -0,0 +1,5 @@ +package me.confuser.banmanager.common.listeners; + +public interface CommonChatHandler { + void handleSoftMute(); +} diff --git a/common/src/main/java/me/confuser/banmanager/common/listeners/CommonChatListener.java b/common/src/main/java/me/confuser/banmanager/common/listeners/CommonChatListener.java new file mode 100755 index 000000000..1f79d571b --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/listeners/CommonChatListener.java @@ -0,0 +1,142 @@ +package me.confuser.banmanager.common.listeners; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.CommonPlayer; +import me.confuser.banmanager.common.data.IpMuteData; +import me.confuser.banmanager.common.data.PlayerMuteData; +import me.confuser.banmanager.common.data.PlayerWarnData; +import me.confuser.banmanager.common.util.DateUtils; +import me.confuser.banmanager.common.util.Message; + +import java.net.InetAddress; +import java.sql.SQLException; + +public class CommonChatListener { + private BanManagerPlugin plugin; + + public CommonChatListener(BanManagerPlugin plugin) { + this.plugin = plugin; + } + + public boolean onPlayerChat(CommonPlayer player, CommonChatHandler handler, String chatMessage) { + if (!plugin.getPlayerMuteStorage().isMuted(player.getUniqueId())) { + if (plugin.getPlayerWarnStorage().isMuted(player.getUniqueId())) { + PlayerWarnData warning = plugin.getPlayerWarnStorage().getMute(player.getUniqueId()); + + if (warning.getReason().toLowerCase().equals(chatMessage.toLowerCase())) { + plugin.getPlayerWarnStorage().removeMute(player.getUniqueId()); + Message.get("warn.player.disallowed.removed").sendTo(player); + } else { + Message.get("warn.player.disallowed.header").sendTo(player); + Message.get("warn.player.disallowed.reason").set("reason", warning.getReason()).sendTo(player); + } + + return true; + } + + return false; + } + + PlayerMuteData mute = plugin.getPlayerMuteStorage().getMute(player.getUniqueId()); + + if (mute.hasExpired()) { + try { + plugin.getPlayerMuteStorage().unmute(mute, plugin.getPlayerStorage().getConsole()); + } catch (SQLException e) { + e.printStackTrace(); + } + return false; + } + + Message broadcast = Message.get("mute.player.broadcast") + .set("message", chatMessage) + .set("displayName", player.getDisplayName()) + .set("player", player.getName()) + .set("playerId", player.getUniqueId().toString()) + .set("reason", mute.getReason()) + .set("id", mute.getId()) + .set("actor", mute.getActor().getName()); + + plugin.getServer().broadcast(broadcast.toString(), "bm.notify.muted"); + + if (mute.isSoft()) { + handler.handleSoftMute(); + return false; + } + + Message message; + + if (mute.getExpires() == 0) { + message = Message.get("mute.player.disallowed"); + } else { + message = Message.get("tempmute.player.disallowed") + .set("expires", DateUtils.getDifferenceFormat(mute.getExpires())); + } + + message.set("displayName", player.getDisplayName()) + .set("player", player.getName()) + .set("playerId", player.getUniqueId().toString()) + .set("reason", mute.getReason()) + .set("id", mute.getId()) + .set("actor", mute.getActor().getName()); + + player.sendMessage(message); + + return true; + } + + public boolean onIpChat(CommonPlayer player, InetAddress address, CommonChatHandler handler, String chatMessage) { + if (!plugin.getIpMuteStorage().isMuted(address)) { + return false; + } + + IpMuteData mute = plugin.getIpMuteStorage().getMute(address); + + if (mute.hasExpired()) { + try { + plugin.getIpMuteStorage().unmute(mute, plugin.getPlayerStorage().getConsole()); + } catch (SQLException e) { + e.printStackTrace(); + } + + return false; + } + + Message broadcast = Message.get("muteip.ip.broadcast") + .set("message", chatMessage) + .set("displayName", player.getDisplayName()) + .set("player", player.getName()) + .set("playerId", player.getUniqueId().toString()) + .set("reason", mute.getReason()) + .set("id", mute.getId()) + .set("actor", mute.getActor().getName()); + + plugin.getServer().broadcast(broadcast.toString(), "bm.notify.mutedip"); + + if (mute.isSoft()) { + handler.handleSoftMute(); + return false; + } + + Message message; + + if (mute.getExpires() == 0) { + message = Message.get("muteip.ip.disallowed"); + } else { + message = Message.get("tempmuteip.ip.disallowed") + .set("expires", DateUtils.getDifferenceFormat(mute.getExpires())); + } + + message.set("displayName", player.getDisplayName()) + .set("player", player.getName()) + .set("playerId", player.getUniqueId().toString()) + .set("reason", mute.getReason()) + .set("actor", mute.getActor().getName()) + .set("id", mute.getId()) + .set("ip", mute.getIp().toString()); + + player.sendMessage(message.toString()); + + return true; + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/listeners/CommonCommandListener.java b/common/src/main/java/me/confuser/banmanager/common/listeners/CommonCommandListener.java new file mode 100755 index 000000000..7f0746060 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/listeners/CommonCommandListener.java @@ -0,0 +1,49 @@ +package me.confuser.banmanager.common.listeners; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.CommonPlayer; +import me.confuser.banmanager.common.util.Message; +import me.confuser.banmanager.common.util.StringUtils; + +public class CommonCommandListener { + private BanManagerPlugin plugin; + + public CommonCommandListener(BanManagerPlugin plugin) { + this.plugin = plugin; + } + + public boolean onCommand(CommonPlayer player, String cmd, String[] args) { + if (!plugin.getPlayerMuteStorage().isMuted(player.getUniqueId())) { + return false; + } + + int startIndex = 0; + + if (args[0].replace("/", "").toLowerCase().equals(cmd)) { + startIndex = 1; + } + + boolean isSoft = plugin.getPlayerMuteStorage().getMute(player.getUniqueId()).isSoft(); + boolean deepCheck = isSoft ? !plugin.getConfig().isSoftBlockedCommand(cmd) : !plugin.getConfig().isBlockedCommand(cmd); + + if (deepCheck) { + // Check if arguments blocked + boolean shouldCancel = false; + for (int i = startIndex; i < args.length; i++) { + String check = cmd + " " + StringUtils.join(args, " ", startIndex, i + 1); + + if ((isSoft && plugin.getConfig().isSoftBlockedCommand(check)) || plugin.getConfig().isBlockedCommand(check)) { + shouldCancel = true; + cmd = check; + break; + } + } + + if (!shouldCancel) return false; + } + + if (!isSoft) player.sendMessage(Message.get("mute.player.blocked").set("command", cmd).toString()); + + return true; + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/listeners/CommonDiscordListener.java b/common/src/main/java/me/confuser/banmanager/common/listeners/CommonDiscordListener.java new file mode 100644 index 000000000..85cce9ebb --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/listeners/CommonDiscordListener.java @@ -0,0 +1,331 @@ +package me.confuser.banmanager.common.listeners; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.data.*; +import me.confuser.banmanager.common.util.DateUtils; + +import java.util.List; + +import javax.net.ssl.HttpsURLConnection; + +import java.time.format.DateTimeFormatter; +import java.time.ZoneOffset; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.net.URL; +import java.sql.SQLException; +import java.time.ZoneId; + +public class CommonDiscordListener { + private BanManagerPlugin plugin; + + public CommonDiscordListener(BanManagerPlugin plugin) { + this.plugin = plugin; + } + + private String toISO8601(long timestamp) { + return DateTimeFormatter.ISO_INSTANT + .format(java.time.Instant.ofEpochMilli(timestamp).atZone(ZoneId.systemDefault())); + } + + public Object[] notifyOnBan(PlayerBanData ban) { + String url; + String payload; + boolean ignoreSilent; + + if (ban.getExpires() == 0) { + url = plugin.getDiscordConfig().getType("ban").getUrl(); + payload = plugin.getDiscordConfig().getType("ban").getPayload(); + ignoreSilent = plugin.getDiscordConfig().getType("ban").isIgnoreSilent(); + } else { + url = plugin.getDiscordConfig().getType("tempban").getUrl(); + payload = plugin.getDiscordConfig().getType("tempban").getPayload(); + ignoreSilent = plugin.getDiscordConfig().getType("tempban").isIgnoreSilent(); + } + + payload = payload.replace("[player]", ban.getPlayer().getName()) + .replace("[playerId]", ban.getPlayer().getUUID().toString()) + .replace("[actor]", ban.getActor().getName()) + .replace("[actorId]", ban.getActor().getUUID().toString()) + .replace("[id]", String.valueOf(ban.getId())) + .replace("[created]", toISO8601(ban.getCreated())) + .replace("[reason]", ban.getReason()); + + if (ban.getExpires() != 0) { + payload = payload.replace("[expires]", DateUtils.getDifferenceFormat(ban.getExpires())); + } + + return new Object[] { url, payload, ignoreSilent }; + } + + public Object[] notifyOnBan(IpBanData ban) { + String url; + String payload; + boolean ignoreSilent; + List players = plugin.getPlayerStorage().getDuplicatesInTime(ban.getIp(), + plugin.getConfig().getTimeAssociatedAlts()); + StringBuilder playerNames = new StringBuilder(); + + for (PlayerData player : players) { + playerNames.append(player.getName()); + playerNames.append(", "); + } + + if (playerNames.length() >= 2) + playerNames.setLength(playerNames.length() - 2); + + if (ban.getExpires() == 0) { + url = plugin.getDiscordConfig().getType("banip").getUrl(); + payload = plugin.getDiscordConfig().getType("banip").getPayload(); + ignoreSilent = plugin.getDiscordConfig().getType("banip").isIgnoreSilent(); + } else { + url = plugin.getDiscordConfig().getType("tempbanip").getUrl(); + payload = plugin.getDiscordConfig().getType("tempbanip").getPayload(); + ignoreSilent = plugin.getDiscordConfig().getType("tempbanip").isIgnoreSilent(); + } + + payload = payload.replace("[ip]", ban.getIp().toString()) + .replace("[actor]", ban.getActor().getName()) + .replace("[actorId]", ban.getActor().getUUID().toString()) + .replace("[reason]", ban.getReason()) + .replace("[created]", toISO8601(ban.getCreated())) + .replace("[players]", playerNames.toString()); + + if (ban.getExpires() != 0) { + payload = payload.replace("[expires]", DateUtils.getDifferenceFormat(ban.getExpires())); + } + + return new Object[] { url, payload, ignoreSilent }; + } + + public Object[] notifyOnKick(PlayerKickData kick) { + String url = plugin.getDiscordConfig().getType("kick").getUrl(); + String payload = plugin.getDiscordConfig().getType("kick").getPayload(); + boolean ignoreSilent = plugin.getDiscordConfig().getType("kick").isIgnoreSilent(); + + payload = payload.replace("[player]", kick.getPlayer().getName()) + .replace("[playerId]", kick.getPlayer().getUUID().toString()) + .replace("[actor]", kick.getActor().getName()) + .replace("[actorId]", kick.getActor().getUUID().toString()) + .replace("[id]", String.valueOf(kick.getId())) + .replace("[created]", toISO8601(kick.getCreated())) + .replace("[reason]", kick.getReason()); + + return new Object[] { url, payload, ignoreSilent }; + } + + public Object[] notifyOnMute(PlayerMuteData mute) { + String url; + String payload; + boolean ignoreSilent; + + if (mute.getExpires() == 0) { + url = plugin.getDiscordConfig().getType("mute").getUrl(); + payload = plugin.getDiscordConfig().getType("mute").getPayload(); + ignoreSilent = plugin.getDiscordConfig().getType("mute").isIgnoreSilent(); + } else { + url = plugin.getDiscordConfig().getType("tempmute").getUrl(); + payload = plugin.getDiscordConfig().getType("tempmute").getPayload(); + ignoreSilent = plugin.getDiscordConfig().getType("tempmute").isIgnoreSilent(); + } + + payload = payload.replace("[player]", mute.getPlayer().getName()) + .replace("[playerId]", mute.getPlayer().getUUID().toString()) + .replace("[actor]", mute.getActor().getName()) + .replace("[actorId]", mute.getActor().getUUID().toString()) + .replace("[id]", String.valueOf(mute.getId())) + .replace("[created]", toISO8601(mute.getCreated())) + .replace("[reason]", mute.getReason()); + + if (mute.getExpires() != 0) { + payload = payload.replace("[expires]", DateUtils.getDifferenceFormat(mute.getExpires())); + } + + return new Object[] { url, payload, ignoreSilent }; + } + + public Object[] notifyOnWarn(PlayerWarnData warn) { + String url; + String payload; + boolean ignoreSilent; + + if (warn.getExpires() == 0) { + url = plugin.getDiscordConfig().getType("warning").getUrl(); + payload = plugin.getDiscordConfig().getType("warning").getPayload(); + ignoreSilent = plugin.getDiscordConfig().getType("warning").isIgnoreSilent(); + } else { + url = plugin.getDiscordConfig().getType("tempwarning").getUrl(); + payload = plugin.getDiscordConfig().getType("tempwarning").getPayload(); + ignoreSilent = plugin.getDiscordConfig().getType("tempwarning").isIgnoreSilent(); + } + + payload = payload.replace("[player]", warn.getPlayer().getName()) + .replace("[playerId]", warn.getPlayer().getUUID().toString()) + .replace("[actor]", warn.getActor().getName()) + .replace("[actorId]", warn.getActor().getUUID().toString()) + .replace("[id]", String.valueOf(warn.getId())) + .replace("[created]", toISO8601(warn.getCreated())) + .replace("[points]", String.valueOf(warn.getPoints())) + .replace("[reason]", warn.getReason()); + + if (warn.getExpires() != 0) { + payload = payload.replace("[expires]", DateUtils.getDifferenceFormat(warn.getExpires())); + } + + return new Object[] { url, payload, ignoreSilent }; + } + + public Object[] notifyOnUnban(PlayerBanData ban, PlayerData actor, String reason) { + String url = plugin.getDiscordConfig().getType("unban").getUrl(); + String payload = plugin.getDiscordConfig().getType("unban").getPayload(); + + payload = payload.replace("[player]", ban.getPlayer().getName()) + .replace("[playerId]", ban.getPlayer().getUUID().toString()) + .replace("[actor]", actor.getName()) + .replace("[actorId]", actor.getUUID().toString()) + .replace("[id]", String.valueOf(ban.getId())) + .replace("[created]", toISO8601(ban.getCreated())) + .replace("[reason]", reason); + + return new Object[] { url, payload }; + } + + public Object[] notifyOnUnban(IpBanData ban, PlayerData actor, String reason) { + String url = plugin.getDiscordConfig().getType("unbanip").getUrl(); + String payload = plugin.getDiscordConfig().getType("unbanip").getPayload(); + + payload = payload.replace("[ip]", ban.getIp().toString()) + .replace("[actor]", actor.getName()) + .replace("[actorId]", actor.getUUID().toString()) + .replace("[id]", String.valueOf(ban.getId())) + .replace("[created]", toISO8601(ban.getCreated())) + .replace("[reason]", reason); + + return new Object[] { url, payload }; + } + + public Object[] notifyOnUnmute(PlayerMuteData mute, PlayerData actor, String reason) { + String url = plugin.getDiscordConfig().getType("unmute").getUrl(); + String payload = plugin.getDiscordConfig().getType("unmute").getPayload(); + + payload = payload.replace("[player]", mute.getPlayer().getName()) + .replace("[playerId]", mute.getPlayer().getUUID().toString()) + .replace("[actor]", actor.getName()) + .replace("[actorId]", actor.getUUID().toString()) + .replace("[id]", String.valueOf(mute.getId())) + .replace("[created]", toISO8601(mute.getCreated())) + .replace("[reason]", reason); + + return new Object[] { url, payload }; + } + + public Object[] notifyOnReport(PlayerReportData report, PlayerData actor, String reason) { + String url = plugin.getDiscordConfig().getType("report").getUrl(); + String payload = plugin.getDiscordConfig().getType("report").getPayload(); + boolean ignoreSilent = plugin.getDiscordConfig().getType("report").isIgnoreSilent(); + List locations = null; + try { + locations = plugin.getPlayerReportLocationStorage().getByReport(report); + } catch (SQLException e) { + e.printStackTrace(); + } + + payload = payload.replace("[player]", report.getPlayer().getName()) + .replace("[playerId]", report.getPlayer().getUUID().toString()) + .replace("[actor]", actor.getName()) + .replace("[actorId]", actor.getUUID().toString()) + .replace("[id]", String.valueOf(report.getId())) + .replace("[created]", toISO8601(report.getCreated())) + .replace("[reason]", reason); + + if (locations != null && locations.size() > 0) { + PlayerReportLocationData playerLocation = null; + PlayerReportLocationData actorLocation = null; + + for (PlayerReportLocationData location : locations) { + if (location.getPlayer().equals(actor)) { + actorLocation = location; + } else { + playerLocation = location; + } + } + + if (playerLocation != null) { + payload = payload.replace("[playerWorld]", playerLocation.getWorld()) + .replace("[playerX]", String.valueOf(playerLocation.getX())) + .replace("[playerY]", String.valueOf(playerLocation.getY())) + .replace("[playerZ]", String.valueOf(playerLocation.getZ())) + .replace("[playerYaw]", String.valueOf(playerLocation.getYaw())) + .replace("[playerPitch]", String.valueOf(playerLocation.getPitch())); + } + + if (actorLocation != null) { + payload = payload.replace("[actorWorld]", actorLocation.getWorld()) + .replace("[actorX]", String.valueOf(actorLocation.getX())) + .replace("[actorY]", String.valueOf(actorLocation.getY())) + .replace("[actorZ]", String.valueOf(actorLocation.getZ())) + .replace("[actorYaw]", String.valueOf(actorLocation.getYaw())) + .replace("[actorPitch]", String.valueOf(actorLocation.getPitch())); + } + } + + return new Object[] { url, payload, ignoreSilent }; + } + + public void send(String url, String payload) { + BufferedReader reader = null; + OutputStream stream = null; + + if (plugin.getConfig().isDebugEnabled()) { + plugin.getLogger().info("Sending Discord webhook to " + url + " with payload:" + payload); + } + + try { + HttpsURLConnection connection = (HttpsURLConnection) new URL(url).openConnection(); + connection.addRequestProperty("Content-Type", "application/json"); + connection.addRequestProperty("User-Agent", "BanManager"); + connection.setDoOutput(true); + connection.setRequestMethod("POST"); + + stream = connection.getOutputStream(); + stream.write(payload.getBytes()); + stream.flush(); + + int responseCode = connection.getResponseCode(); + if (responseCode > 299) { + plugin.getLogger().warning("Failed to send Discord webhook"); + plugin.getLogger().warning("Response code: " + responseCode); + + StringBuilder responseBody = new StringBuilder(); + try { + reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); + } catch (IOException e) { + reader = new BufferedReader(new InputStreamReader(connection.getErrorStream())); + } + + String line; + while ((line = reader.readLine()) != null) { + responseBody.append(line); + } + + plugin.getLogger().warning("Response body: " + responseBody.toString()); + } + + connection.getInputStream().close(); + connection.disconnect(); + } catch (Exception e) { + plugin.getLogger().warning("Failed to send Discord message with payload: " + payload); + plugin.getLogger().warning("Error: " + e.getMessage()); + e.printStackTrace(); + } finally { + try { + if (reader != null) reader.close(); + if (stream != null) stream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/listeners/CommonHooksListener.java b/common/src/main/java/me/confuser/banmanager/common/listeners/CommonHooksListener.java new file mode 100755 index 000000000..bcb33b972 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/listeners/CommonHooksListener.java @@ -0,0 +1,230 @@ +package me.confuser.banmanager.common.listeners; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.configs.ActionCommand; +import me.confuser.banmanager.common.configs.Hook; +import me.confuser.banmanager.common.configs.HooksConfig; +import me.confuser.banmanager.common.data.*; +import me.confuser.banmanager.common.google.guava.collect.ImmutableMap; + +import java.util.List; +import java.util.Map; + +public class CommonHooksListener { + private BanManagerPlugin plugin; + + public CommonHooksListener(BanManagerPlugin plugin) { + this.plugin = plugin; + } + + public void onBan(PlayerBanData data, boolean pre) { + HooksConfig config = plugin.getConfig().getHooksConfig(); + final Hook hook = data.getExpires() == 0 ? config.getHook("ban") : config.getHook("tempban"); + + if (hook == null) return; + + List commands = pre ? hook.getPre() : hook.getPost(); + + if (commands.size() != 0) { + executeCommands(commands, ImmutableMap.of( + "player", data.getPlayer().getName() + , "playerId", data.getPlayer().getUUID().toString() + , "actor", data.getActor().getName() + , "reason", data.getReason() + , "expires", Long.toString(data.getExpires()) + )); + } + } + + public void onUnban(PlayerBanData data, PlayerData actor, String reason) { + HooksConfig config = plugin.getConfig().getHooksConfig(); + final Hook hook = config.getHook("unban"); + + if (hook == null) return; + + if (hook.getPost().size() != 0) { + executeCommands(hook.getPost(), ImmutableMap.of( + "player", data.getPlayer().getName() + , "playerId", data.getPlayer().getUUID().toString() + , "actor", actor.getName() + , "reason", reason + , "expires", Long.toString(data.getExpires()) + )); + } + } + + public void onMute(PlayerMuteData data, boolean pre) { + HooksConfig config = plugin.getConfig().getHooksConfig(); + final Hook hook = data.getExpires() == 0 ? config.getHook("mute") : config.getHook("tempmute"); + + if (hook == null) return; + + List commands = pre ? hook.getPre() : hook.getPost(); + + if (commands.size() != 0) { + executeCommands(commands, ImmutableMap.of( + "player", data.getPlayer().getName() + , "playerId", data.getPlayer().getUUID().toString() + , "actor", data.getActor().getName() + , "reason", data.getReason() + , "expires", Long.toString(data.getExpires()) + )); + } + } + + public void onUnmute(PlayerMuteData data, PlayerData actor, String reason) { + HooksConfig config = plugin.getConfig().getHooksConfig(); + final Hook hook = config.getHook("unmute"); + + if (hook == null) return; + + if (hook.getPost().size() != 0) { + executeCommands(hook.getPost(), ImmutableMap.of( + "player", data.getPlayer().getName() + , "playerId", data.getPlayer().getUUID().toString() + , "actor", actor.getName() + , "reason", reason + , "expires", Long.toString(data.getExpires()) + )); + } + } + + public void onBan(IpBanData data, boolean pre) { + HooksConfig config = plugin.getConfig().getHooksConfig(); + final Hook hook = data.getExpires() == 0 ? config.getHook("ipban") : config.getHook("tempipban"); + + if (hook == null) return; + + List commands = pre ? hook.getPre() : hook.getPost(); + + if (commands.size() != 0) { + executeCommands(commands, ImmutableMap.of( + "ip", data.getIp().toString() + , "actor", data.getActor().getName() + , "reason", data.getReason() + , "expires", Long.toString(data.getExpires()) + )); + } + } + + public void onUnban(IpBanData data, PlayerData actor, String reason) { + HooksConfig config = plugin.getConfig().getHooksConfig(); + final Hook hook = config.getHook("unbanip"); + + if (hook == null) return; + + if (hook.getPost().size() != 0) { + executeCommands(hook.getPost(), ImmutableMap.of( + "ip", data.getIp().toString() + , "actor", actor.getName() + , "reason", reason + , "expires", Long.toString(data.getExpires()) + )); + } + } + + public void onBan(IpRangeBanData data, boolean pre) { + HooksConfig config = plugin.getConfig().getHooksConfig(); + final Hook hook = data.getExpires() == 0 ? config.getHook("iprangeban") : config + .getHook("temprangeipban"); + + if (hook == null) return; + + List commands = pre ? hook.getPre() : hook.getPost(); + + if (commands.size() != 0) { + executeCommands(commands, ImmutableMap.of( + "from", data.getFromIp().toString() + , "to", data.getToIp().toString() + , "actor", data.getActor().getName() + , "reason", data.getReason() + , "expires", Long.toString(data.getExpires()) + )); + } + } + + public void onUnban(IpRangeBanData data, PlayerData actor, String reason) { + HooksConfig config = plugin.getConfig().getHooksConfig(); + final Hook hook = config.getHook("unbaniprange"); + + if (hook == null) return; + + if (hook.getPost().size() != 0) { + executeCommands(hook.getPost(), ImmutableMap.of( + "from", data.getFromIp().toString() + , "to", data.getToIp().toString() + , "actor", actor.getName() + , "reason", reason + , "expires", Long.toString(data.getExpires()) + )); + } + } + + public void onWarn(PlayerWarnData data, boolean pre) { + HooksConfig config = plugin.getConfig().getHooksConfig(); + final Hook hook = config.getHook("warn"); + + if (hook == null) return; + + List commands = pre ? hook.getPre() : hook.getPost(); + + if (commands.size() != 0) { + executeCommands(commands, ImmutableMap.of( + "player", data.getPlayer().getName() + , "playerId", data.getPlayer().getUUID().toString() + , "actor", data.getActor().getName() + , "reason", data.getReason() + , "expires", Long.toString(data.getExpires()) + )); + } + } + + public void onNote(PlayerNoteData data) { + HooksConfig config = plugin.getConfig().getHooksConfig(); + final Hook hook = config.getHook("note"); + + if (hook == null) return; + + if (hook.getPost().size() != 0) { + executeCommands(hook.getPost(), ImmutableMap.of( + "player", data.getPlayer().getName() + , "playerId", data.getPlayer().getUUID().toString() + , "actor", data.getActor().getName() + , "message", data.getMessage() + )); + } + } + + public void onReport(PlayerReportData data, boolean pre) { + HooksConfig config = plugin.getConfig().getHooksConfig(); + final Hook hook = config.getHook("report"); + + if (hook == null) return; + + List commands = pre ? hook.getPre() : hook.getPost(); + + if (hook.getPost().size() != 0) { + executeCommands(commands, ImmutableMap.of( + "id", String.valueOf(data.getId()), + "player", data.getPlayer().getName() + , "playerId", data.getPlayer().getUUID().toString() + , "actor", data.getActor().getName() + , "message", data.getReason() + )); + } + } + + private void executeCommands(List commands, final Map messages) { + for (final ActionCommand command : commands) { + plugin.getScheduler().runSyncLater(() -> { + String hookCommand = command.getCommand(); + + for (Map.Entry entry : messages.entrySet()) { + hookCommand = hookCommand.replace("[" + entry.getKey() + "]", entry.getValue()); + } + + plugin.getServer().dispatchCommand(plugin.getServer().getConsoleSender(), hookCommand); + }, command.getDelay()); + } + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/listeners/CommonJoinHandler.java b/common/src/main/java/me/confuser/banmanager/common/listeners/CommonJoinHandler.java new file mode 100755 index 000000000..f8956165f --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/listeners/CommonJoinHandler.java @@ -0,0 +1,9 @@ +package me.confuser.banmanager.common.listeners; + +import me.confuser.banmanager.common.util.Message; +import me.confuser.banmanager.common.data.PlayerData; + +public interface CommonJoinHandler { + void handleDeny(Message message); + void handlePlayerDeny(PlayerData player, Message message); +} diff --git a/common/src/main/java/me/confuser/banmanager/common/listeners/CommonJoinListener.java b/common/src/main/java/me/confuser/banmanager/common/listeners/CommonJoinListener.java new file mode 100755 index 000000000..5407a59b5 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/listeners/CommonJoinListener.java @@ -0,0 +1,593 @@ +package me.confuser.banmanager.common.listeners; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.CommonPlayer; +import me.confuser.banmanager.common.commands.NotesCommand; +import me.confuser.banmanager.common.data.*; +import me.confuser.banmanager.common.google.guava.cache.Cache; +import me.confuser.banmanager.common.google.guava.cache.CacheBuilder; +import me.confuser.banmanager.common.ipaddr.IPAddress; +import me.confuser.banmanager.common.maxmind.db.model.CountryResponse; +import me.confuser.banmanager.common.ormlite.dao.CloseableIterator; +import me.confuser.banmanager.common.util.*; + +import java.io.IOException; +import java.sql.SQLException; +import java.sql.SQLIntegrityConstraintViolationException; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; +import java.util.concurrent.TimeUnit; + +@SuppressWarnings("UnstableApiUsage") +public class CommonJoinListener { + // Used for throttling attempted join messages + Cache joinCache = CacheBuilder.newBuilder() + .expireAfterWrite(1, TimeUnit.MINUTES) + .concurrencyLevel(2) + .maximumSize(100) + .build(); + private BanManagerPlugin plugin; + + public CommonJoinListener(BanManagerPlugin plugin) { + this.plugin = plugin; + } + + public void banCheck(UUID id, String name, IPAddress address, CommonJoinHandler handler) { + if (plugin.getConfig().isCheckOnJoin()) { + // Check for new bans/mutes + if (!plugin.getIpBanStorage().isBanned(address)) { + try { + IpBanData ban = plugin.getIpBanStorage().retrieveBan(address); + + if (ban != null) plugin.getIpBanStorage().addBan(ban); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + if (!plugin.getPlayerBanStorage().isBanned(id)) { + try { + PlayerBanData ban = plugin.getPlayerBanStorage().retrieveBan(id); + + if (ban != null) plugin.getPlayerBanStorage().addBan(ban); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + if (!plugin.getPlayerMuteStorage().isMuted(id)) { + try { + PlayerMuteData mute = plugin.getPlayerMuteStorage().retrieveMute(id); + + if (mute != null) plugin.getPlayerMuteStorage().addMute(mute); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + + if (plugin.getIpRangeBanStorage().isBanned(address)) { + IpRangeBanData data = plugin.getIpRangeBanStorage().getBan(address); + + if (data.hasExpired()) { + try { + plugin.getIpRangeBanStorage().unban(data, plugin.getPlayerStorage().getConsole()); + } catch (SQLException e) { + e.printStackTrace(); + } + + return; + } + + if (data.getExpires() == 0 && plugin.getExemptionsConfig().isExempt(id, "baniprange")) { + return; + } else if (data.getExpires() != 0 && plugin.getExemptionsConfig().isExempt(id, "tempbaniprange")) { + return; + } + + String dateTimeFormat; + Message message; + + if (data.getExpires() == 0) { + message = Message.get("baniprange.ip.disallowed"); + dateTimeFormat = Message.getString("baniprange.ip.dateTimeFormat"); + } else { + message = Message.get("tempbaniprange.ip.disallowed"); + message.set("expires", DateUtils.getDifferenceFormat(data.getExpires())); + + dateTimeFormat = Message.getString("tempbaniprange.ip.dateTimeFormat"); + } + + message.set("id", data.getId()); + message.set("ip", address.toString()); + message.set("reason", data.getReason()); + message.set("actor", data.getActor().getName()); + message.set("created", DateUtils.format(dateTimeFormat, data.getCreated())); + + handler.handleDeny(message); + return; + } + + if (plugin.getIpBanStorage().isBanned(address)) { + IpBanData data = plugin.getIpBanStorage().getBan(address); + + if (data.hasExpired()) { + try { + plugin.getIpBanStorage().unban(data, plugin.getPlayerStorage().getConsole()); + } catch (SQLException e) { + e.printStackTrace(); + } + + return; + } + + String dateTimeFormat; + Message message; + + if (data.getExpires() == 0) { + message = Message.get("banip.ip.disallowed"); + dateTimeFormat = Message.getString("banip.ip.dateTimeFormat"); + } else { + message = Message.get("tempbanip.ip.disallowed"); + message.set("expires", DateUtils.getDifferenceFormat(data.getExpires())); + + dateTimeFormat = Message.getString("tempbanip.ip.dateTimeFormat"); + } + + message.set("id", data.getId()); + message.set("ip", address.toString()); + message.set("reason", data.getReason()); + message.set("actor", data.getActor().getName()); + message.set("created", DateUtils.format(dateTimeFormat, data.getCreated())); + + handler.handleDeny(message); + handleJoinDeny(address.toString(), data.getActor(), data.getReason()); + return; + } + + if (plugin.getNameBanStorage().isBanned(name)) { + NameBanData data = plugin.getNameBanStorage().getBan(name); + + if (data.hasExpired()) { + try { + plugin.getNameBanStorage().unban(data, plugin.getPlayerStorage().getConsole()); + } catch (SQLException e) { + e.printStackTrace(); + } + + return; + } + + String dateTimeFormat; + Message message; + + if (data.getExpires() == 0) { + message = Message.get("banname.name.disallowed"); + dateTimeFormat = Message.getString("banname.name.dateTimeFormat"); + } else { + message = Message.get("tempbanname.name.disallowed"); + message.set("expires", DateUtils.getDifferenceFormat(data.getExpires())); + + dateTimeFormat = Message.getString("tempbanname.name.dateTimeFormat"); + } + + message.set("id", data.getId()); + message.set("name", name); + message.set("reason", data.getReason()); + message.set("actor", data.getActor().getName()); + message.set("created", DateUtils.format(dateTimeFormat, data.getCreated())); + + handler.handleDeny(message); + return; + } + + PlayerBanData data = plugin.getPlayerBanStorage().getBan(id); + + if (data != null && data.hasExpired()) { + try { + plugin.getPlayerBanStorage().unban(data, plugin.getPlayerStorage().getConsole()); + } catch (SQLException e) { + e.printStackTrace(); + } + + return; + } + + if (data == null) { + return; + } + + String dateTimeFormat; + Message message; + + if (data.getExpires() == 0) { + message = Message.get("ban.player.disallowed"); + dateTimeFormat = Message.getString("ban.player.dateTimeFormat"); + } else { + message = Message.get("tempban.player.disallowed"); + message.set("expires", DateUtils.getDifferenceFormat(data.getExpires())); + + dateTimeFormat = Message.getString("tempban.player.dateTimeFormat"); + } + + message.set("id", data.getId()); + message.set("player", data.getPlayer().getName()); + message.set("reason", data.getReason()); + message.set("actor", data.getActor().getName()); + message.set("created", DateUtils.format(dateTimeFormat, data.getCreated())); + + handler.handlePlayerDeny(data.getPlayer(), message); + handleJoinDeny(data.getPlayer(), data.getActor(), data.getReason()); + } + + public void onPreJoin(UUID id, String name, IPAddress address) { + PlayerData player = new PlayerData(id, name, address); + + try { + plugin.getPlayerStorage().createOrUpdate(player); + } catch (SQLException e) { + e.printStackTrace(); + return; + } + + if (plugin.getConfig().isLogIpsEnabled()) plugin.getPlayerHistoryStorage().create(player); + } + + public void onJoin(final CommonPlayer player) { + plugin.getScheduler().runAsyncLater(() -> { + // Handle quick disconnects + if (player == null || !player.isOnline()) { + return; + } + + UUID id = player.getUniqueId(); + CloseableIterator notesItr = null; + + try { + notesItr = plugin.getPlayerNoteStorage().getNotes(id); + ArrayList notes = new ArrayList<>(); + String dateTimeFormat = Message.getString("notes.dateTimeFormat"); + + while (notesItr != null && notesItr.hasNext()) { + PlayerNoteData note = notesItr.next(); + + Message noteMessage = Message.get("notes.note") + .set("player", note.getActor().getName()) + .set("message", note.getMessage()) + .set("id", note.getId()) + .set("created", DateUtils.format(dateTimeFormat, note.getCreated())); + + notes.add(noteMessage.toString()); + } + + if (notes.size() != 0) { + Message noteJoinMessage = Message.get("notes.joinAmount") + .set("amount", notes.size()) + .set("player", player.getName()); + + plugin.getServer().broadcastJSON(NotesCommand.notesAmountMessage(player.getName(), noteJoinMessage), "bm.notify.notes.joinAmount"); + + String header = Message.get("notes.header") + .set("player", player.getName()) + .toString(); + + plugin.getServer().broadcast(header, "bm.notify.notes.join"); + + for (String message : notes) { + plugin.getServer().broadcast(message, "bm.notify.notes.join"); + } + + } + } catch (SQLException e) { + e.printStackTrace(); + } finally { + if (notesItr != null) notesItr.closeQuietly(); + } + + CloseableIterator warnings = null; + try { + warnings = plugin.getPlayerWarnStorage().getUnreadWarnings(id); + + while (warnings.hasNext()) { + PlayerWarnData warning = warnings.next(); + + Message.get("warn.player.warned") + .set("displayName", player.getDisplayName()) + .set("player", player.getName()) + .set("reason", warning.getReason()) + .set("actor", warning.getActor().getName()) + .set("id", warning.getId()) + .sendTo(plugin.getServer().getPlayer(player.getUniqueId())); + + warning.setRead(true); + // TODO Move to one update query to set all warnings for player to read + plugin.getPlayerWarnStorage().update(warning); + } + } catch (SQLException e) { + e.printStackTrace(); + } finally { + if (warnings != null) warnings.closeQuietly(); + } + + if (player.hasPermission("bm.notify.reports.open")) { + try { + ReportList openReports = plugin.getPlayerReportStorage().getReports(1, 1); + + if (openReports == null || openReports.getList().size() != 0) { + openReports.send(plugin.getServer().getPlayer(player.getUniqueId()), 1); + } + } catch (SQLException e) { + e.printStackTrace(); + } + } + + if (player.hasPermission("bm.notify.reports.assigned")) { + try { + ReportList assignedReports = plugin.getPlayerReportStorage().getReports(1, 2, id); + + if (assignedReports == null || assignedReports.getList().size() != 0) { + assignedReports.send(plugin.getServer().getPlayer(player.getUniqueId()), 1); + } + } catch (SQLException e) { + e.printStackTrace(); + } + } + + }, 20L); + } + + public void onPlayerLogin(final CommonPlayer player, CommonJoinHandler handler) { + if (plugin.getGeoIpConfig().isEnabled() && !player.hasPermission("bm.exempt.country")) { + try { + CountryResponse countryResponse = plugin.getGeoIpConfig().getCountryDatabase().getCountry(player.getAddress()); + + if (!plugin.getGeoIpConfig().isCountryAllowed(countryResponse)) { + Message message = Message.get("deniedCountry") + .set("country", countryResponse.getCountry().getName()) + .set("countryIso", countryResponse.getCountry().getIsoCode()); + handler.handleDeny(message); + return; + } + + } catch (IOException e) { + } + } + + final IPAddress ip = IPUtils.toIPAddress(player.getAddress()); + + if (plugin.getConfig().getMaxOnlinePerIp() > 0 && !player.hasPermission("bm.exempt.maxonlineperip")) { + int count = 0; + + for (CommonPlayer onlinePlayer : plugin.getServer().getOnlinePlayers()) { + if (IPUtils.toIPAddress(onlinePlayer.getAddress()).equals(ip)) count++; + } + + if (count >= plugin.getConfig().getMaxOnlinePerIp()) { + handler.handleDeny(Message.get("deniedMaxIp")); + return; + } + + } + + if (plugin.getConfig().getMaxMultiaccountsRecently() > 0 && !player.hasPermission("bm.exempt.maxmultiaccountsrecently")) { + long timeDiff = plugin.getConfig().getMultiaccountsTime(); + + List multiAccountPlayers = plugin.getPlayerStorage().getDuplicatesInTime(ip, timeDiff); + + if (multiAccountPlayers.size() > plugin.getConfig().getMaxMultiaccountsRecently()) { + handler.handleDeny(Message.get("deniedMultiaccounts")); + return; + } + + } + + if (!plugin.getConfig().isDuplicateIpCheckEnabled()) { + return; + } + + if (player.hasPermission("bm.exempt.alts")) return; + + plugin.getScheduler().runAsyncLater(() -> { + // Handle quick disconnects + if (!player.isOnline()) { + return; + } + + final UUID uuid = player.getUniqueId(); + List duplicates = plugin.getPlayerBanStorage().getDuplicates(ip); + + if (duplicates.isEmpty()) { + return; + } + + if (plugin.getConfig().isDenyAlts()) { + denyAlts(duplicates, uuid); + } + + if (plugin.getConfig().isPunishAlts()) { + try { + punishAlts(duplicates, uuid); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + StringBuilder sb = new StringBuilder(); + + for (PlayerData playerData : duplicates) { + if (playerData.getUUID().equals(uuid)) { + continue; + } + + sb.append(playerData.getName()); + sb.append(", "); + } + + if (sb.length() == 0) return; + if (sb.length() >= 2) sb.setLength(sb.length() - 2); + + Message message = Message.get("duplicateIP"); + message.set("player", player.getName()); + message.set("players", sb.toString()); + + plugin.getServer().broadcast(message.toString(), "bm.notify.duplicateips"); + }, 20L); + + plugin.getScheduler().runAsyncLater(() -> { + // Handle quick disconnects + if (!player.isOnline()) { + return; + } + + final UUID uuid = player.getUniqueId(); + List duplicates = plugin.getPlayerStorage().getDuplicatesInTime(ip, plugin.getConfig().getTimeAssociatedAlts()); + + if (duplicates.isEmpty()) { + return; + } + + StringBuilder sb = new StringBuilder(); + + for (PlayerData playerData : duplicates) { + if (playerData.getUUID().equals(uuid)) { + continue; + } + + sb.append(playerData.getName()); + sb.append(", "); + } + + if (sb.length() == 0) return; + if (sb.length() >= 2) sb.setLength(sb.length() - 2); + + Message message = Message.get("duplicateIPAlts"); + message.set("player", player.getName()); + message.set("players", sb.toString()); + + plugin.getServer().broadcast(message.toString(), "bm.notify.alts"); + }, 20L); + } + + private void handleJoinDeny(PlayerData player, PlayerData actor, String reason) { + if (joinCache.getIfPresent(player.getName()) != null) return; + + joinCache.put(player.getName(), System.currentTimeMillis()); + Message message = Message.get("deniedNotify.player") + .set("player", player.getName()) + .set("reason", reason) + .set("actor", actor.getName()); + + plugin.getServer().broadcast(message.toString(), "bm.notify.denied.player"); + } + + private void handleJoinDeny(String ip, PlayerData actor, String reason) { + if (joinCache.getIfPresent(ip) != null) return; + + joinCache.put(ip, System.currentTimeMillis()); + Message message = Message.get("deniedNotify.ip") + .set("ip", ip) + .set("reason", reason) + .set("actor", actor.getName()); + + plugin.getServer().broadcast(message.toString(), "bm.notify.denied.ip"); + } + + private void denyAlts(List duplicates, final UUID uuid) { + if (plugin.getPlayerBanStorage().isBanned(uuid)) return; + + for (final PlayerData player : duplicates) { + if (player.getUUID().equals(uuid)) continue; + + final PlayerBanData ban = plugin.getPlayerBanStorage().getBan(player.getUUID()); + + if (ban == null) continue; + if (ban.hasExpired()) continue; + + CommonPlayer bukkitPlayer = plugin.getServer().getPlayer(uuid); + if(bukkitPlayer == null) continue; + + plugin.getScheduler().runSync(() -> { + if (!bukkitPlayer.isOnline()) { + return; + } + + Message kickMessage = Message.get("denyalts.player.disallowed") + .set("player", player.getName()) + .set("reason", ban.getReason()) + .set("id", ban.getId()) + .set("actor", ban.getActor().getName()); + + bukkitPlayer.kick(kickMessage.toString()); + }); + } + } + + private void punishAlts(List duplicates, UUID uuid) throws SQLException { + if (!plugin.getPlayerBanStorage().isBanned(uuid)) { + // Auto ban + for (PlayerData player : duplicates) { + if (player.getUUID().equals(uuid)) { + continue; + } + + PlayerBanData ban = plugin.getPlayerBanStorage().getBan(player.getUUID()); + + if (ban == null) continue; + if (ban.hasExpired()) continue; + + final PlayerBanData newBan = new PlayerBanData(plugin.getPlayerStorage().queryForId(UUIDUtils.toBytes(uuid)), + plugin.getPlayerStorage().getConsole(), + ban.getReason(), + ban.isSilent(), + ban.getExpires()); + + try { + plugin.getPlayerBanStorage().ban(newBan); + } catch (SQLIntegrityConstraintViolationException e) { + // Ignore duplicate entry errors + plugin.getPlayerBanStorage().addBan(newBan); + } + + plugin.getScheduler().runSync(() -> { + CommonPlayer bukkitPlayer = plugin.getServer().getPlayer(newBan.getPlayer().getUUID()); + + Message kickMessage = Message.get("ban.player.kick") + .set("displayName", bukkitPlayer.getDisplayName()) + .set("player", newBan.getPlayer().getName()) + .set("reason", newBan.getReason()) + .set("id", newBan.getId()) + .set("actor", newBan.getActor().getName()); + + bukkitPlayer.kick(kickMessage.toString()); + }); + } + } else if (!plugin.getPlayerMuteStorage().isMuted(uuid)) { + // Auto mute + for (PlayerData player : duplicates) { + if (player.getUUID().equals(uuid)) { + continue; + } + + PlayerMuteData mute = plugin.getPlayerMuteStorage().getMute(player.getUUID()); + + if (mute == null) continue; + if (mute.hasExpired()) continue; + + PlayerMuteData newMute = new PlayerMuteData(plugin.getPlayerStorage().queryForId(UUIDUtils.toBytes(uuid)), + plugin.getPlayerStorage().getConsole(), + mute.getReason(), + mute.isSilent(), + mute.isSoft(), + mute.getExpires()); + + try { + plugin.getPlayerMuteStorage().mute(newMute); + } catch (SQLIntegrityConstraintViolationException e) { + // Ignore duplicate entry errors + plugin.getPlayerMuteStorage().addMute(newMute); + } + } + } + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/listeners/CommonLeaveListener.java b/common/src/main/java/me/confuser/banmanager/common/listeners/CommonLeaveListener.java new file mode 100755 index 000000000..e2c4251f5 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/listeners/CommonLeaveListener.java @@ -0,0 +1,37 @@ +package me.confuser.banmanager.common.listeners; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.data.PlayerHistoryData; + +import java.sql.SQLException; +import java.util.UUID; + +public class CommonLeaveListener { + private BanManagerPlugin plugin; + + public CommonLeaveListener(BanManagerPlugin plugin) { + this.plugin = plugin; + } + + public void onLeave(UUID id, String name) { + if (plugin.getConfig().isLogIpsEnabled()) { + final PlayerHistoryData data = plugin.getPlayerHistoryStorage().remove(id); + + if (data == null) { + plugin.getLogger().warning("Could not find " + name + " session history, perhaps they " + + "disconnected too quickly?"); + return; + } + + data.setLeave(System.currentTimeMillis() / 1000L); + + plugin.getScheduler().runAsync(() -> { + try { + plugin.getPlayerHistoryStorage().create(data); + } catch (SQLException e) { + e.printStackTrace(); + } + }); + } + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/listeners/CommonMuteListener.java b/common/src/main/java/me/confuser/banmanager/common/listeners/CommonMuteListener.java new file mode 100755 index 000000000..a20e86d37 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/listeners/CommonMuteListener.java @@ -0,0 +1,110 @@ +package me.confuser.banmanager.common.listeners; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.CommonPlayer; +import me.confuser.banmanager.common.data.IpMuteData; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.data.PlayerMuteData; +import me.confuser.banmanager.common.util.DateUtils; +import me.confuser.banmanager.common.util.Message; + +import java.util.List; + +public class CommonMuteListener { + private BanManagerPlugin plugin; + + public CommonMuteListener(BanManagerPlugin plugin) { + this.plugin = plugin; + } + + public void notifyOnMute(PlayerMuteData data, boolean silent) { + String broadcastPermission; + Message message; + + if (data.getExpires() == 0) { + broadcastPermission = "bm.notify.mute"; + message = Message.get("mute.notify"); + } else { + broadcastPermission = "bm.notify.tempmute"; + message = Message.get("tempmute.notify"); + message.set("expires", DateUtils.getDifferenceFormat(data.getExpires())); + } + + message + .set("id", data.getId()) + .set("player", data.getPlayer().getName()) + .set("playerId", data.getPlayer().getUUID().toString()) + .set("actor", data.getActor().getName()) + .set("reason", data.getReason()); + + if (!silent) { + plugin.getServer().broadcast(message.toString(), broadcastPermission); + } else if (plugin.getPlayerStorage().getConsole().getUUID().equals(data.getActor().getUUID())) { + plugin.getServer().getConsoleSender().sendMessage(message); + return; + } + + // Check if the sender is online and does not have the + // broadcastPermission + CommonPlayer player = plugin.getServer().getPlayer(data.getActor().getUUID()); + + if (player == null || !player.isOnline()) { + return; + } + + if (silent || !player.hasPermission(broadcastPermission)) { + message.sendTo(player); + } + } + + public void notifyOnMute(IpMuteData data, boolean silent) { + String broadcastPermission; + Message message; + + if (data.getExpires() == 0) { + broadcastPermission = "bm.notify.muteip"; + message = Message.get("muteip.notify"); + } else { + broadcastPermission = "bm.notify.tempmuteip"; + message = Message.get("tempmuteip.notify"); + message.set("expires", DateUtils.getDifferenceFormat(data.getExpires())); + } + + List players = plugin.getPlayerStorage().getDuplicatesInTime(data.getIp(), plugin.getConfig().getTimeAssociatedAlts()); + StringBuilder playerNames = new StringBuilder(); + + for (PlayerData player : players) { + playerNames.append(player.getName()); + playerNames.append(", "); + } + + if (playerNames.length() == 0) return; + if (playerNames.length() >= 2) playerNames.setLength(playerNames.length() - 2); + + message + .set("id", data.getId()) + .set("ip", data.getIp().toString()) + .set("actor", data.getActor().getName()) + .set("reason", data.getReason()) + .set("players", playerNames.toString()); + + if (!silent) { + plugin.getServer().broadcast(message.toString(), broadcastPermission); + } else if (plugin.getPlayerStorage().getConsole().getUUID().equals(data.getActor().getUUID())) { + plugin.getServer().getConsoleSender().sendMessage(message); + return; + } + + // Check if the sender is online and does not have the + // broadcastPermission + CommonPlayer player = plugin.getServer().getPlayer(data.getActor().getUUID()); + + if (player == null || !player.isOnline()) { + return; + } + + if (silent || !player.hasPermission(broadcastPermission)) { + message.sendTo(player); + } + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/listeners/CommonNoteListener.java b/common/src/main/java/me/confuser/banmanager/common/listeners/CommonNoteListener.java new file mode 100755 index 000000000..3f639e41a --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/listeners/CommonNoteListener.java @@ -0,0 +1,38 @@ +package me.confuser.banmanager.common.listeners; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.CommonPlayer; +import me.confuser.banmanager.common.data.*; +import me.confuser.banmanager.common.util.Message; + +public class CommonNoteListener { + private BanManagerPlugin plugin; + + public CommonNoteListener(BanManagerPlugin plugin) { + this.plugin = plugin; + } + + public void notifyOnNote(PlayerNoteData data) { + Message message = Message.get("notes.notify"); + + message.set("player", data.getPlayer().getName()) + .set("playerId", data.getPlayer().getUUID().toString()) + .set("actor", data.getActor().getName()) + .set("id", data.getId()) + .set("message", data.getMessage()); + + plugin.getServer().broadcast(message.toString(), "bm.notify.notes"); + + // Check if the sender is online and does not have the + // broadcastPermission + CommonPlayer player = plugin.getServer().getPlayer(data.getActor().getUUID()); + + if (player == null || !player.isOnline()) { + return; + } + + if (!player.hasPermission("bm.notify.notes")) { + player.sendMessage(message); + } + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/listeners/CommonReportListener.java b/common/src/main/java/me/confuser/banmanager/common/listeners/CommonReportListener.java new file mode 100755 index 000000000..6db7c74c3 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/listeners/CommonReportListener.java @@ -0,0 +1,61 @@ +package me.confuser.banmanager.common.listeners; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.CommonPlayer; +import me.confuser.banmanager.common.data.PlayerReportData; +import me.confuser.banmanager.common.ormlite.stmt.DeleteBuilder; +import me.confuser.banmanager.common.util.Message; + +import java.sql.SQLException; + +public class CommonReportListener { + private BanManagerPlugin plugin; + + public CommonReportListener(BanManagerPlugin plugin) { + this.plugin = plugin; + } + + public void notifyOnReport(PlayerReportData data) { + Message message = Message.get("report.notify"); + + message.set("player", data.getPlayer().getName()) + .set("playerId", data.getPlayer().getUUID().toString()) + .set("actor", data.getActor().getName()) + .set("reason", data.getReason()) + .set("id", data.getId()); + + plugin.getServer().broadcast(message.toString(), "bm.notify.report"); + + // Check if the sender is online and does not have the + // broadcastPermission + CommonPlayer player = plugin.getServer().getPlayer(data.getActor().getUUID()); + + if (player == null || !player.isOnline()) { + return; + } + + if (!player.hasPermission("bm.notify.report")) { + message.sendTo(player); + } + } + + public void deleteReferences(PlayerReportData data) { + int id = data.getId(); + + try { + DeleteBuilder location = plugin.getPlayerReportLocationStorage().deleteBuilder(); + location.where().eq("report_id", id); + location.delete(); + + DeleteBuilder commands = plugin.getPlayerReportCommandStorage().deleteBuilder(); + commands.where().eq("report_id", id); + commands.delete(); + + DeleteBuilder comments = plugin.getPlayerReportCommentStorage().deleteBuilder(); + comments.where().eq("report_id", id); + comments.delete(); + } catch (SQLException e) { + e.printStackTrace(); + } + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/runnables/BanSync.java b/common/src/main/java/me/confuser/banmanager/common/runnables/BanSync.java new file mode 100644 index 000000000..5a6299521 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/runnables/BanSync.java @@ -0,0 +1,108 @@ +package me.confuser.banmanager.common.runnables; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.CommonPlayer; +import me.confuser.banmanager.common.data.PlayerBanData; +import me.confuser.banmanager.common.data.PlayerBanRecord; +import me.confuser.banmanager.common.ormlite.dao.CloseableIterator; +import me.confuser.banmanager.common.storage.PlayerBanStorage; +import me.confuser.banmanager.common.util.DateUtils; +import me.confuser.banmanager.common.util.Message; + +import java.sql.SQLException; + +public class BanSync extends BmRunnable { + + private PlayerBanStorage banStorage; + + public BanSync(BanManagerPlugin plugin) { + super(plugin, "playerBans"); + + banStorage = plugin.getPlayerBanStorage(); + } + + @Override + public void run() { + newBans(); + newUnbans(); + } + + private void newBans() { + + CloseableIterator itr = null; + try { + itr = banStorage.findBans(lastChecked); + + while (itr.hasNext()) { + final PlayerBanData ban = itr.next(); + + if (banStorage.isBanned(ban.getPlayer().getUUID())) { + if (ban.getUpdated() < lastChecked) continue; + + if (ban.equalsBan(banStorage.getBan(ban.getPlayer().getUUID()))) { + continue; + } + } + + banStorage.addBan(ban); + + plugin.getScheduler().runSync(() -> { + CommonPlayer bukkitPlayer = plugin.getServer().getPlayer(ban.getPlayer().getUUID()); + + if (bukkitPlayer == null || !bukkitPlayer.isOnline()) return; + + Message kickMessage; + + if (ban.getExpires() == 0) { + kickMessage = Message.get("ban.player.kick"); + } else { + kickMessage = Message.get("tempban.player.kick"); + kickMessage.set("expires", DateUtils.getDifferenceFormat(ban.getExpires())); + } + + kickMessage + .set("displayName", bukkitPlayer.getDisplayName()) + .set("player", ban.getPlayer().getName()) + .set("reason", ban.getReason()) + .set("actor", ban.getActor().getName()); + + bukkitPlayer.kick(kickMessage.toString()); + }); + + } + } catch (SQLException e) { + e.printStackTrace(); + } finally { + if (itr != null) itr.closeQuietly(); + } + + } + + private void newUnbans() { + + CloseableIterator itr = null; + try { + itr = plugin.getPlayerBanRecordStorage().findUnbans(lastChecked); + + while (itr.hasNext()) { + final PlayerBanRecord ban = itr.next(); + + if (!banStorage.isBanned(ban.getPlayer().getUUID())) { + continue; + } + + if (!ban.equalsBan(banStorage.getBan(ban.getPlayer().getUUID()))) { + continue; + } + + banStorage.removeBan(ban.getPlayer().getUUID()); + + } + } catch (SQLException e) { + e.printStackTrace(); + } finally { + if (itr != null) itr.closeQuietly(); + } + + } +} diff --git a/src/main/java/me/confuser/banmanager/runnables/BmRunnable.java b/common/src/main/java/me/confuser/banmanager/common/runnables/BmRunnable.java similarity index 62% rename from src/main/java/me/confuser/banmanager/runnables/BmRunnable.java rename to common/src/main/java/me/confuser/banmanager/common/runnables/BmRunnable.java index d4f946486..ebd10ae18 100644 --- a/src/main/java/me/confuser/banmanager/runnables/BmRunnable.java +++ b/common/src/main/java/me/confuser/banmanager/common/runnables/BmRunnable.java @@ -1,26 +1,29 @@ -package me.confuser.banmanager.runnables; +package me.confuser.banmanager.common.runnables; import lombok.Getter; -import me.confuser.banmanager.BanManager; +import me.confuser.banmanager.common.BanManagerPlugin; + public abstract class BmRunnable implements Runnable { - protected BanManager plugin = BanManager.getPlugin(); + @Getter + protected final String name; + protected BanManagerPlugin plugin; @Getter protected long lastChecked = 0; @Getter protected boolean isRunning = false; - @Getter - protected final String name; - public BmRunnable(String schedulerName) { + public BmRunnable(BanManagerPlugin plugin, String schedulerName) { + this.plugin = plugin; name = schedulerName; lastChecked = plugin.getSchedulesConfig().getLastChecked(name); } public boolean shouldExecute() { - return !isRunning && (System.currentTimeMillis() / 1000L) - lastChecked > plugin.getSchedulesConfig().getSchedule(name); + return !isRunning && (System.currentTimeMillis() / 1000L) - lastChecked > plugin.getSchedulesConfig() + .getSchedule(name); } public void beforeRun() { diff --git a/src/main/java/me/confuser/banmanager/runnables/ExpiresSync.java b/common/src/main/java/me/confuser/banmanager/common/runnables/ExpiresSync.java similarity index 52% rename from src/main/java/me/confuser/banmanager/runnables/ExpiresSync.java rename to common/src/main/java/me/confuser/banmanager/common/runnables/ExpiresSync.java index 45ee7aba5..e2bb94bfd 100644 --- a/src/main/java/me/confuser/banmanager/runnables/ExpiresSync.java +++ b/common/src/main/java/me/confuser/banmanager/common/runnables/ExpiresSync.java @@ -1,28 +1,41 @@ -package me.confuser.banmanager.runnables; +package me.confuser.banmanager.common.runnables; -import com.j256.ormlite.dao.CloseableIterator; -import me.confuser.banmanager.data.*; -import me.confuser.banmanager.storage.*; -import me.confuser.banmanager.util.DateUtils; +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.data.*; +import me.confuser.banmanager.common.ormlite.dao.CloseableIterator; +import me.confuser.banmanager.common.storage.*; +import me.confuser.banmanager.common.util.DateUtils; import java.sql.SQLException; public class ExpiresSync extends BmRunnable { - private PlayerBanStorage banStorage = plugin.getPlayerBanStorage(); - private PlayerBanRecordStorage banRecordStorage = plugin.getPlayerBanRecordStorage(); - private PlayerMuteStorage muteStorage = plugin.getPlayerMuteStorage(); - private PlayerMuteRecordStorage muteRecordStorage = plugin.getPlayerMuteRecordStorage(); - private IpBanStorage ipBanStorage = plugin.getIpBanStorage(); - private IpBanRecordStorage ipBanRecordStorage = plugin.getIpBanRecordStorage(); - private IpMuteStorage ipMuteStorage = plugin.getIpMuteStorage(); - private IpMuteRecordStorage ipMuteRecordStorage = plugin.getIpMuteRecordStorage(); - private IpRangeBanStorage ipRangeBanStorage = plugin.getIpRangeBanStorage(); - private IpRangeBanRecordStorage ipRangeBanRecordStorage = plugin.getIpRangeBanRecordStorage(); - private PlayerWarnStorage warnStorage = plugin.getPlayerWarnStorage(); - - public ExpiresSync() { - super("expiresCheck"); + private PlayerBanStorage banStorage; + private PlayerBanRecordStorage banRecordStorage; + private PlayerMuteStorage muteStorage; + private PlayerMuteRecordStorage muteRecordStorage; + private IpBanStorage ipBanStorage; + private IpBanRecordStorage ipBanRecordStorage; + private IpMuteStorage ipMuteStorage; + private IpMuteRecordStorage ipMuteRecordStorage; + private IpRangeBanStorage ipRangeBanStorage; + private IpRangeBanRecordStorage ipRangeBanRecordStorage; + private PlayerWarnStorage warnStorage; + + public ExpiresSync(BanManagerPlugin plugin) { + super(plugin, "expiresCheck"); + + banStorage = plugin.getPlayerBanStorage(); + banRecordStorage = plugin.getPlayerBanRecordStorage(); + muteStorage = plugin.getPlayerMuteStorage(); + muteRecordStorage = plugin.getPlayerMuteRecordStorage(); + ipBanStorage = plugin.getIpBanStorage(); + ipBanRecordStorage = plugin.getIpBanRecordStorage(); + ipMuteStorage = plugin.getIpMuteStorage(); + ipMuteRecordStorage = plugin.getIpMuteRecordStorage(); + ipRangeBanStorage = plugin.getIpRangeBanStorage(); + ipRangeBanRecordStorage = plugin.getIpRangeBanRecordStorage(); + warnStorage = plugin.getPlayerWarnStorage(); } @Override @@ -32,14 +45,12 @@ public void run() { CloseableIterator bans = null; try { bans = banStorage.queryBuilder().where().ne("expires", 0).and() - .le("expires", now).iterator(); + .le("expires", now).iterator(); while (bans.hasNext()) { PlayerBanData ban = bans.next(); - banRecordStorage.addRecord(ban, plugin.getPlayerStorage().getConsole(), ""); - banStorage.removeBan(ban); - banStorage.delete(ban); + banStorage.unban(ban, plugin.getPlayerStorage().getConsole(), ""); } } catch (SQLException e) { e.printStackTrace(); @@ -53,10 +64,8 @@ public void run() { while (mutes.hasNext()) { PlayerMuteData mute = mutes.next(); - muteRecordStorage.addRecord(mute, plugin.getPlayerStorage().getConsole(), ""); - muteStorage.removeMute(mute); - muteStorage.delete(mute); + muteStorage.unmute(mute, plugin.getPlayerStorage().getConsole(), ""); } } catch (SQLException e) { e.printStackTrace(); @@ -67,7 +76,7 @@ public void run() { CloseableIterator warnings = null; try { warnings = warnStorage.queryBuilder().where().ne("expires", 0).and() - .le("expires", now).iterator(); + .le("expires", now).iterator(); while (warnings.hasNext()) { PlayerWarnData warning = warnings.next(); @@ -83,14 +92,12 @@ public void run() { CloseableIterator ipBans = null; try { ipBans = ipBanStorage.queryBuilder().where().ne("expires", 0).and() - .le("expires", now).iterator(); + .le("expires", now).iterator(); while (ipBans.hasNext()) { IpBanData ban = ipBans.next(); - ipBanRecordStorage.addRecord(ban, plugin.getPlayerStorage().getConsole(), ""); - ipBanStorage.removeBan(ban); - ipBanStorage.delete(ban); + ipBanStorage.unban(ban, plugin.getPlayerStorage().getConsole(), ""); } } catch (SQLException e) { e.printStackTrace(); @@ -104,10 +111,8 @@ public void run() { while (ipMutes.hasNext()) { IpMuteData mute = ipMutes.next(); - ipMuteRecordStorage.addRecord(mute, plugin.getPlayerStorage().getConsole(), ""); - ipMuteStorage.removeMute(mute); - ipMuteStorage.delete(mute); + ipMuteStorage.unmute(mute, plugin.getPlayerStorage().getConsole(), ""); } } catch (SQLException e) { e.printStackTrace(); @@ -118,14 +123,12 @@ public void run() { CloseableIterator ipRangeBans = null; try { ipRangeBans = ipRangeBanStorage.queryBuilder().where().ne("expires", 0).and() - .le("expires", now).iterator(); + .le("expires", now).iterator(); while (ipRangeBans.hasNext()) { IpRangeBanData ban = ipRangeBans.next(); - ipRangeBanRecordStorage.addRecord(ban, plugin.getPlayerStorage().getConsole(), ""); - ipRangeBanStorage.removeBan(ban); - ipRangeBanStorage.delete(ban); + ipRangeBanStorage.unban(ban, plugin.getPlayerStorage().getConsole(), ""); } } catch (SQLException e) { e.printStackTrace(); diff --git a/common/src/main/java/me/confuser/banmanager/common/runnables/GlobalBanSync.java b/common/src/main/java/me/confuser/banmanager/common/runnables/GlobalBanSync.java new file mode 100644 index 000000000..2b0b16737 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/runnables/GlobalBanSync.java @@ -0,0 +1,121 @@ +package me.confuser.banmanager.common.runnables; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.CommonPlayer; +import me.confuser.banmanager.common.data.PlayerBanData; +import me.confuser.banmanager.common.data.global.GlobalPlayerBanData; +import me.confuser.banmanager.common.data.global.GlobalPlayerBanRecordData; +import me.confuser.banmanager.common.ormlite.dao.CloseableIterator; +import me.confuser.banmanager.common.storage.PlayerBanStorage; +import me.confuser.banmanager.common.storage.global.GlobalPlayerBanRecordStorage; +import me.confuser.banmanager.common.storage.global.GlobalPlayerBanStorage; +import me.confuser.banmanager.common.util.DateUtils; +import me.confuser.banmanager.common.util.Message; + +import java.sql.SQLException; + +public class GlobalBanSync extends BmRunnable { + + private GlobalPlayerBanStorage banStorage; + private PlayerBanStorage localBanStorage; + private GlobalPlayerBanRecordStorage recordStorage; + + public GlobalBanSync(BanManagerPlugin plugin) { + super(plugin, "externalPlayerBans"); + + banStorage = plugin.getGlobalPlayerBanStorage(); + localBanStorage = plugin.getPlayerBanStorage(); + recordStorage = plugin.getGlobalPlayerBanRecordStorage(); + } + + @Override + public void run() { + newBans(); + newUnbans(); + } + + private void newBans() { + CloseableIterator itr = null; + + try { + itr = banStorage.findBans(lastChecked); + + while (itr.hasNext()) { + GlobalPlayerBanData ban = itr.next(); + + final PlayerBanData localBan = localBanStorage.retrieveBan(ban.getUUID()); + + if (localBan != null) { + if (localBan.equalsBan(ban.toLocal(plugin))) { + kickPlayer(localBan); + continue; + } + + // Global ban overrides local + localBanStorage + .unban(localBan, ban.getActor(plugin)); + } else if (localBanStorage.isBanned(ban.getUUID())) { + localBanStorage.removeBan(ban.getUUID()); + } + + if (!localBanStorage.ban(ban.toLocal(plugin))) continue; + + final PlayerBanData globalBan = localBanStorage.getBan(ban.getUUID()); + + kickPlayer(globalBan); + + } + } catch (SQLException e) { + e.printStackTrace(); + } finally { + if (itr != null) itr.closeQuietly(); + } + } + + private void kickPlayer(PlayerBanData globalBan) { + plugin.getScheduler().runSync(() -> { + CommonPlayer bukkitPlayer = plugin.getServer().getPlayer(globalBan.getPlayer().getUUID()); + + if (bukkitPlayer == null || !bukkitPlayer.isOnline()) return; + + Message kickMessage; + + if (globalBan.getExpires() == 0) { + kickMessage = Message.get("ban.player.kick"); + } else { + kickMessage = Message.get("tempban.player.kick"); + kickMessage.set("expires", DateUtils.getDifferenceFormat(globalBan.getExpires())); + } + + kickMessage + .set("displayName", bukkitPlayer.getDisplayName()) + .set("player", globalBan.getPlayer().getName()) + .set("reason", globalBan.getReason()) + .set("actor", globalBan.getActor().getName()); + + bukkitPlayer.kick(kickMessage.toString()); + }); + } + + private void newUnbans() { + CloseableIterator itr = null; + + try { + itr = recordStorage.findUnbans(lastChecked); + + while (itr.hasNext()) { + GlobalPlayerBanRecordData record = itr.next(); + + if (!localBanStorage.isBanned(record.getUUID())) { + continue; + } + + localBanStorage.unban(localBanStorage.getBan(record.getUUID()), record.getActor(plugin)); + } + } catch (SQLException e) { + e.printStackTrace(); + } finally { + if (itr != null) itr.closeQuietly(); + } + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/runnables/GlobalIpSync.java b/common/src/main/java/me/confuser/banmanager/common/runnables/GlobalIpSync.java new file mode 100644 index 000000000..00dd371a5 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/runnables/GlobalIpSync.java @@ -0,0 +1,110 @@ +package me.confuser.banmanager.common.runnables; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.CommonPlayer; +import me.confuser.banmanager.common.data.IpBanData; +import me.confuser.banmanager.common.data.global.GlobalIpBanData; +import me.confuser.banmanager.common.data.global.GlobalIpBanRecordData; +import me.confuser.banmanager.common.ormlite.dao.CloseableIterator; +import me.confuser.banmanager.common.storage.IpBanStorage; +import me.confuser.banmanager.common.storage.global.GlobalIpBanRecordStorage; +import me.confuser.banmanager.common.storage.global.GlobalIpBanStorage; +import me.confuser.banmanager.common.util.IPUtils; +import me.confuser.banmanager.common.util.Message; + +import java.sql.SQLException; + +public class GlobalIpSync extends BmRunnable { + + private GlobalIpBanStorage banStorage; + private IpBanStorage localBanStorage; + private GlobalIpBanRecordStorage recordStorage; + + public GlobalIpSync(BanManagerPlugin plugin) { + super(plugin, "externalIpBans"); + + banStorage = plugin.getGlobalIpBanStorage(); + localBanStorage = plugin.getIpBanStorage(); + recordStorage = plugin.getGlobalIpBanRecordStorage(); + } + + @Override + public void run() { + newBans(); + newUnbans(); + } + + private void newBans() { + CloseableIterator itr = null; + + try { + itr = banStorage.findBans(lastChecked); + + while (itr.hasNext()) { + GlobalIpBanData ban = itr.next(); + + final IpBanData localBan = localBanStorage.retrieveBan(ban.getIp()); + + if (localBan != null) { + if (localBan.equalsBan(ban.toLocal(plugin))) { + kickPlayers(localBan); + continue; + } + + // Global ban overrides local + localBanStorage + .unban(localBan, ban.getActor(plugin)); + } else if (localBanStorage.isBanned(ban.getIp())) { + localBanStorage.removeBan(ban.getIp()); + } + + if (!localBanStorage.ban(ban.toLocal(plugin))) + continue; + + final IpBanData globalBan = localBanStorage.getBan(ban.getIp()); + + kickPlayers(globalBan); + } + } catch (SQLException e) { + e.printStackTrace(); + } finally { + if (itr != null) itr.closeQuietly(); + } + } + + private void kickPlayers(IpBanData globalBan) { + plugin.getScheduler().runSync(() -> { + Message kickMessage = Message.get("banip.ip.kick") + .set("reason", globalBan.getReason()) + .set("actor", globalBan.getActor().getName()); + + for (CommonPlayer onlinePlayer : plugin.getServer().getOnlinePlayers()) { + if (IPUtils.toIPAddress(onlinePlayer.getAddress()).equals(globalBan.getIp())) { + onlinePlayer.kick(kickMessage.toString()); + } + } + }); + } + + private void newUnbans() { + CloseableIterator itr = null; + + try { + itr = recordStorage.findUnbans(lastChecked); + + while (itr.hasNext()) { + GlobalIpBanRecordData record = itr.next(); + + if (!localBanStorage.isBanned(record.getIp())) { + continue; + } + + localBanStorage.unban(localBanStorage.getBan(record.getIp()), record.getActor(plugin)); + } + } catch (SQLException e) { + e.printStackTrace(); + } finally { + if (itr != null) itr.closeQuietly(); + } + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/runnables/GlobalMuteSync.java b/common/src/main/java/me/confuser/banmanager/common/runnables/GlobalMuteSync.java new file mode 100644 index 000000000..cae0fb854 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/runnables/GlobalMuteSync.java @@ -0,0 +1,90 @@ +package me.confuser.banmanager.common.runnables; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.data.PlayerMuteData; +import me.confuser.banmanager.common.data.global.GlobalPlayerMuteData; +import me.confuser.banmanager.common.data.global.GlobalPlayerMuteRecordData; +import me.confuser.banmanager.common.ormlite.dao.CloseableIterator; +import me.confuser.banmanager.common.storage.PlayerMuteStorage; +import me.confuser.banmanager.common.storage.global.GlobalPlayerMuteRecordStorage; +import me.confuser.banmanager.common.storage.global.GlobalPlayerMuteStorage; + +import java.sql.SQLException; + +public class GlobalMuteSync extends BmRunnable { + + private GlobalPlayerMuteStorage muteStorage; + private PlayerMuteStorage localMuteStorage; + private GlobalPlayerMuteRecordStorage recordStorage; + + public GlobalMuteSync(BanManagerPlugin plugin) { + super(plugin, "externalPlayerMutes"); + + localMuteStorage = plugin.getPlayerMuteStorage(); + muteStorage = plugin.getGlobalPlayerMuteStorage(); + recordStorage = plugin.getGlobalPlayerMuteRecordStorage(); + } + + @Override + public void run() { + newUnmutes(); + newMutes(); + } + + private void newMutes() { + CloseableIterator itr = null; + try { + itr = muteStorage.findMutes(lastChecked); + + while (itr.hasNext()) { + GlobalPlayerMuteData mute = itr.next(); + + PlayerMuteData localMute = localMuteStorage.retrieveMute(mute.getUUID()); + + if (localMute != null) { + if (localMute.equalsMute(mute.toLocal(plugin))) { + continue; + } + + // Global mute overrides local + localMuteStorage + .unmute(localMute, mute.getActor(plugin)); + } else if (localMuteStorage.isMuted(mute.getUUID())) { + localMuteStorage.removeMute(mute.getUUID()); + } + + localMuteStorage.mute(mute.toLocal(plugin)); + + } + } catch (SQLException e) { + e.printStackTrace(); + } finally { + if (itr != null) itr.closeQuietly(); + } + + } + + private void newUnmutes() { + CloseableIterator itr = null; + + try { + itr = recordStorage.findUnmutes(lastChecked); + + while (itr.hasNext()) { + GlobalPlayerMuteRecordData record = itr.next(); + + if (!localMuteStorage.isMuted(record.getUUID())) { + continue; + } + + localMuteStorage.unmute(localMuteStorage.getMute(record.getUUID()), record.getActor(plugin)); + + } + } catch (SQLException e) { + e.printStackTrace(); + } finally { + if (itr != null) + itr.closeQuietly(); + } + } +} diff --git a/src/main/java/me/confuser/banmanager/runnables/GlobalNoteSync.java b/common/src/main/java/me/confuser/banmanager/common/runnables/GlobalNoteSync.java similarity index 57% rename from src/main/java/me/confuser/banmanager/runnables/GlobalNoteSync.java rename to common/src/main/java/me/confuser/banmanager/common/runnables/GlobalNoteSync.java index 9e5d40941..43b2a3520 100644 --- a/src/main/java/me/confuser/banmanager/runnables/GlobalNoteSync.java +++ b/common/src/main/java/me/confuser/banmanager/common/runnables/GlobalNoteSync.java @@ -1,20 +1,24 @@ -package me.confuser.banmanager.runnables; +package me.confuser.banmanager.common.runnables; -import com.j256.ormlite.dao.CloseableIterator; -import me.confuser.banmanager.data.PlayerNoteData; -import me.confuser.banmanager.data.global.GlobalPlayerNoteData; -import me.confuser.banmanager.storage.PlayerNoteStorage; -import me.confuser.banmanager.storage.global.GlobalPlayerNoteStorage; +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.data.PlayerNoteData; +import me.confuser.banmanager.common.data.global.GlobalPlayerNoteData; +import me.confuser.banmanager.common.ormlite.dao.CloseableIterator; +import me.confuser.banmanager.common.storage.PlayerNoteStorage; +import me.confuser.banmanager.common.storage.global.GlobalPlayerNoteStorage; import java.sql.SQLException; public class GlobalNoteSync extends BmRunnable { - private GlobalPlayerNoteStorage noteStorage = plugin.getGlobalPlayerNoteStorage(); - private PlayerNoteStorage localNoteStorage = plugin.getPlayerNoteStorage(); + private GlobalPlayerNoteStorage noteStorage; + private PlayerNoteStorage localNoteStorage; - public GlobalNoteSync() { - super("externalPlayerNotes"); + public GlobalNoteSync(BanManagerPlugin plugin) { + super(plugin, "externalPlayerNotes"); + + noteStorage = plugin.getGlobalPlayerNoteStorage(); + localNoteStorage = plugin.getPlayerNoteStorage(); } @Override @@ -31,7 +35,7 @@ private void newNotes() { while (itr.hasNext()) { GlobalPlayerNoteData note = itr.next(); - final PlayerNoteData localNote = note.toLocal(); + final PlayerNoteData localNote = note.toLocal(plugin); CloseableIterator notes = null; boolean create = true; diff --git a/src/main/java/me/confuser/banmanager/runnables/IpRangeSync.java b/common/src/main/java/me/confuser/banmanager/common/runnables/IpRangeSync.java similarity index 70% rename from src/main/java/me/confuser/banmanager/runnables/IpRangeSync.java rename to common/src/main/java/me/confuser/banmanager/common/runnables/IpRangeSync.java index 33eb0320a..ab08dd6a7 100644 --- a/src/main/java/me/confuser/banmanager/runnables/IpRangeSync.java +++ b/common/src/main/java/me/confuser/banmanager/common/runnables/IpRangeSync.java @@ -1,20 +1,21 @@ -package me.confuser.banmanager.runnables; +package me.confuser.banmanager.common.runnables; -import com.j256.ormlite.dao.CloseableIterator; -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.IpRangeBanData; -import me.confuser.banmanager.data.IpRangeBanRecord; -import me.confuser.banmanager.storage.IpRangeBanStorage; +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.data.IpRangeBanData; +import me.confuser.banmanager.common.data.IpRangeBanRecord; +import me.confuser.banmanager.common.ormlite.dao.CloseableIterator; +import me.confuser.banmanager.common.storage.IpRangeBanStorage; import java.sql.SQLException; public class IpRangeSync extends BmRunnable { - private BanManager plugin = BanManager.getPlugin(); - private IpRangeBanStorage banStorage = plugin.getIpRangeBanStorage(); + private IpRangeBanStorage banStorage; - public IpRangeSync() { - super("ipRangeBans"); + public IpRangeSync(BanManagerPlugin plugin) { + super(plugin, "ipRangeBans"); + + banStorage = plugin.getIpRangeBanStorage(); } @Override diff --git a/src/main/java/me/confuser/banmanager/runnables/IpSync.java b/common/src/main/java/me/confuser/banmanager/common/runnables/IpSync.java similarity index 76% rename from src/main/java/me/confuser/banmanager/runnables/IpSync.java rename to common/src/main/java/me/confuser/banmanager/common/runnables/IpSync.java index 121da8528..8c8df5fac 100644 --- a/src/main/java/me/confuser/banmanager/runnables/IpSync.java +++ b/common/src/main/java/me/confuser/banmanager/common/runnables/IpSync.java @@ -1,22 +1,26 @@ -package me.confuser.banmanager.runnables; +package me.confuser.banmanager.common.runnables; -import com.j256.ormlite.dao.CloseableIterator; -import me.confuser.banmanager.data.IpBanData; -import me.confuser.banmanager.data.IpBanRecord; -import me.confuser.banmanager.data.IpMuteData; -import me.confuser.banmanager.data.IpMuteRecord; -import me.confuser.banmanager.storage.IpBanStorage; -import me.confuser.banmanager.storage.IpMuteStorage; +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.data.IpBanData; +import me.confuser.banmanager.common.data.IpBanRecord; +import me.confuser.banmanager.common.data.IpMuteData; +import me.confuser.banmanager.common.data.IpMuteRecord; +import me.confuser.banmanager.common.ormlite.dao.CloseableIterator; +import me.confuser.banmanager.common.storage.IpBanStorage; +import me.confuser.banmanager.common.storage.IpMuteStorage; import java.sql.SQLException; public class IpSync extends BmRunnable { - private IpBanStorage banStorage = plugin.getIpBanStorage(); - private IpMuteStorage muteStorage = plugin.getIpMuteStorage(); + private IpBanStorage banStorage; + private IpMuteStorage muteStorage; - public IpSync() { - super("ipBans"); + public IpSync(BanManagerPlugin plugin) { + super(plugin, "ipBans"); + + banStorage = plugin.getIpBanStorage(); + muteStorage = plugin.getIpMuteStorage(); } @Override diff --git a/src/main/java/me/confuser/banmanager/runnables/MuteSync.java b/common/src/main/java/me/confuser/banmanager/common/runnables/MuteSync.java similarity index 73% rename from src/main/java/me/confuser/banmanager/runnables/MuteSync.java rename to common/src/main/java/me/confuser/banmanager/common/runnables/MuteSync.java index d5b2b90eb..adff367bb 100644 --- a/src/main/java/me/confuser/banmanager/runnables/MuteSync.java +++ b/common/src/main/java/me/confuser/banmanager/common/runnables/MuteSync.java @@ -1,18 +1,21 @@ -package me.confuser.banmanager.runnables; +package me.confuser.banmanager.common.runnables; -import com.j256.ormlite.dao.CloseableIterator; -import me.confuser.banmanager.data.PlayerMuteData; -import me.confuser.banmanager.data.PlayerMuteRecord; -import me.confuser.banmanager.storage.PlayerMuteStorage; +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.data.PlayerMuteData; +import me.confuser.banmanager.common.data.PlayerMuteRecord; +import me.confuser.banmanager.common.ormlite.dao.CloseableIterator; +import me.confuser.banmanager.common.storage.PlayerMuteStorage; import java.sql.SQLException; public class MuteSync extends BmRunnable { - private PlayerMuteStorage muteStorage = plugin.getPlayerMuteStorage(); + private PlayerMuteStorage muteStorage; - public MuteSync() { - super("playerMutes"); + public MuteSync(BanManagerPlugin plugin) { + super(plugin, "playerMutes"); + + muteStorage = plugin.getPlayerMuteStorage(); } @Override diff --git a/common/src/main/java/me/confuser/banmanager/common/runnables/NameSync.java b/common/src/main/java/me/confuser/banmanager/common/runnables/NameSync.java new file mode 100644 index 000000000..bed5ba9b4 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/runnables/NameSync.java @@ -0,0 +1,104 @@ +package me.confuser.banmanager.common.runnables; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.CommonPlayer; +import me.confuser.banmanager.common.data.NameBanData; +import me.confuser.banmanager.common.data.NameBanRecord; +import me.confuser.banmanager.common.ormlite.dao.CloseableIterator; +import me.confuser.banmanager.common.storage.NameBanStorage; +import me.confuser.banmanager.common.util.DateUtils; +import me.confuser.banmanager.common.util.Message; + +import java.sql.SQLException; + +public class NameSync extends BmRunnable { + + private NameBanStorage banStorage; + + public NameSync(BanManagerPlugin plugin) { + super(plugin, "nameBans"); + + banStorage = plugin.getNameBanStorage(); + } + + @Override + public void run() { + newBans(); + newUnbans(); + } + + private void newBans() { + + CloseableIterator itr = null; + try { + itr = banStorage.findBans(lastChecked); + + while (itr.hasNext()) { + final NameBanData ban = itr.next(); + + if (banStorage.isBanned(ban.getName()) && ban.getUpdated() < lastChecked) { + continue; + } + + banStorage.addBan(ban); + + plugin.getScheduler().runSync(() -> { + CommonPlayer bukkitPlayer = plugin.getServer().getPlayer(ban.getName()); + + if (bukkitPlayer == null || !bukkitPlayer.isOnline()) return; + + Message kickMessage; + + if (ban.getExpires() == 0) { + kickMessage = Message.get("ban.player.kick"); + } else { + kickMessage = Message.get("tempban.player.kick"); + kickMessage.set("expires", DateUtils.getDifferenceFormat(ban.getExpires())); + } + + kickMessage + .set("displayName", bukkitPlayer.getDisplayName()) + .set("player", ban.getName()) + .set("reason", ban.getReason()) + .set("actor", ban.getActor().getName()); + + bukkitPlayer.kick(kickMessage.toString()); + }); + + } + } catch (SQLException e) { + e.printStackTrace(); + } finally { + if (itr != null) itr.closeQuietly(); + } + + } + + private void newUnbans() { + + CloseableIterator itr = null; + try { + itr = plugin.getNameBanRecordStorage().findUnbans(lastChecked); + + while (itr.hasNext()) { + final NameBanRecord ban = itr.next(); + + if (!banStorage.isBanned(ban.getName())) { + continue; + } + + if (!ban.equalsBan(banStorage.getBan(ban.getName()))) { + continue; + } + + banStorage.removeBan(ban.getName()); + + } + } catch (SQLException e) { + e.printStackTrace(); + } finally { + if (itr != null) itr.closeQuietly(); + } + + } +} diff --git a/src/main/java/me/confuser/banmanager/runnables/Purge.java b/common/src/main/java/me/confuser/banmanager/common/runnables/Purge.java similarity index 68% rename from src/main/java/me/confuser/banmanager/runnables/Purge.java rename to common/src/main/java/me/confuser/banmanager/common/runnables/Purge.java index be3a8e54c..b641be469 100644 --- a/src/main/java/me/confuser/banmanager/runnables/Purge.java +++ b/common/src/main/java/me/confuser/banmanager/common/runnables/Purge.java @@ -1,20 +1,23 @@ -package me.confuser.banmanager.runnables; +package me.confuser.banmanager.common.runnables; -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.configs.CleanUp; -import me.confuser.banmanager.configs.DefaultConfig; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.configs.CleanUp; import java.sql.SQLException; import java.util.HashMap; public class Purge implements Runnable { - private BanManager plugin = BanManager.getPlugin(); - private DefaultConfig config = plugin.getConfiguration(); + private BanManagerPlugin plugin; + + public Purge(BanManagerPlugin plugin) { + this.plugin = plugin; + } @Override public void run() { - HashMap cleanUps = config.getCleanUps(); + HashMap cleanUps = plugin.getConfig().getCleanUps(); try { plugin.getPlayerKickStorage().purge(cleanUps.get("kicks")); @@ -52,5 +55,10 @@ public void run() { e.printStackTrace(); } + try { + plugin.getPlayerHistoryStorage().purge(cleanUps.get("playerHistory")); + } catch (SQLException e) { + e.printStackTrace(); + } } } diff --git a/src/main/java/me/confuser/banmanager/runnables/RollbackSync.java b/common/src/main/java/me/confuser/banmanager/common/runnables/RollbackSync.java similarity index 59% rename from src/main/java/me/confuser/banmanager/runnables/RollbackSync.java rename to common/src/main/java/me/confuser/banmanager/common/runnables/RollbackSync.java index 3a9f69eea..78f02fc44 100644 --- a/src/main/java/me/confuser/banmanager/runnables/RollbackSync.java +++ b/common/src/main/java/me/confuser/banmanager/common/runnables/RollbackSync.java @@ -1,11 +1,8 @@ -package me.confuser.banmanager.runnables; +package me.confuser.banmanager.common.runnables; -import com.j256.ormlite.dao.CloseableIterator; -import me.confuser.banmanager.data.*; -import me.confuser.banmanager.storage.PlayerBanStorage; -import me.confuser.banmanager.util.CommandUtils; -import me.confuser.bukkitutil.Message; -import org.bukkit.entity.Player; +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.data.*; +import me.confuser.banmanager.common.ormlite.dao.CloseableIterator; import java.sql.SQLException; import java.util.Iterator; @@ -14,8 +11,8 @@ public class RollbackSync extends BmRunnable { - public RollbackSync() { - super("rollbacks"); + public RollbackSync(BanManagerPlugin plugin) { + super(plugin, "rollbacks"); } @Override @@ -31,44 +28,52 @@ public void run() { switch (data.getType()) { // @TODO Refactor/Clean up case "bans": - for (Iterator> it = plugin.getPlayerBanStorage().getBans().entrySet().iterator(); it.hasNext(); ) { + for (Iterator> it = plugin.getPlayerBanStorage().getBans().entrySet() + .iterator(); it.hasNext(); ) { Map.Entry entry = it.next(); if (!entry.getValue().getActor().getUUID().equals(data.getPlayer().getUUID())) continue; - if (!(entry.getValue().getCreated() <= data.getCreated() && entry.getValue().getCreated() >= data.getExpires())) continue; + if (!(entry.getValue().getCreated() <= data.getCreated() && entry.getValue().getCreated() >= data + .getExpires())) continue; it.remove(); } break; case "ipbans": - for (Iterator> it = plugin.getIpBanStorage().getBans().entrySet().iterator(); it.hasNext(); ) { - Map.Entry entry = it.next(); + for (Iterator> it = plugin.getIpBanStorage().getBans().entrySet().iterator(); it + .hasNext(); ) { + Map.Entry entry = it.next(); if (!entry.getValue().getActor().getUUID().equals(data.getPlayer().getUUID())) continue; - if (!(entry.getValue().getCreated() <= data.getCreated() && entry.getValue().getCreated() >= data.getExpires())) continue; + if (!(entry.getValue().getCreated() <= data.getCreated() && entry.getValue().getCreated() >= data + .getExpires())) continue; it.remove(); } break; case "ipmutes": - for (Iterator> it = plugin.getIpMuteStorage().getMutes().entrySet().iterator(); it.hasNext(); ) { - Map.Entry entry = it.next(); + for (Iterator> it = plugin.getIpMuteStorage().getMutes().entrySet() + .iterator(); it.hasNext(); ) { + Map.Entry entry = it.next(); if (!entry.getValue().getActor().getUUID().equals(data.getPlayer().getUUID())) continue; - if (!(entry.getValue().getCreated() <= data.getCreated() && entry.getValue().getCreated() >= data.getExpires())) continue; + if (!(entry.getValue().getCreated() <= data.getCreated() && entry.getValue().getCreated() >= data + .getExpires())) continue; it.remove(); } break; case "mutes": - for (Iterator> it = plugin.getPlayerMuteStorage().getMutes().entrySet().iterator(); it .hasNext(); ) { + for (Iterator> it = plugin.getPlayerMuteStorage().getMutes().entrySet() + .iterator(); it.hasNext(); ) { Map.Entry entry = it.next(); if (!entry.getValue().getActor().getUUID().equals(data.getPlayer().getUUID())) continue; - if (!(entry.getValue().getCreated() <= data.getCreated() && entry.getValue().getCreated() >= data.getExpires())) continue; + if (!(entry.getValue().getCreated() <= data.getCreated() && entry.getValue().getCreated() >= data + .getExpires())) continue; it.remove(); } diff --git a/src/main/java/me/confuser/banmanager/runnables/Runner.java b/common/src/main/java/me/confuser/banmanager/common/runnables/Runner.java similarity index 94% rename from src/main/java/me/confuser/banmanager/runnables/Runner.java rename to common/src/main/java/me/confuser/banmanager/common/runnables/Runner.java index 975fdc787..0f6da7c88 100644 --- a/src/main/java/me/confuser/banmanager/runnables/Runner.java +++ b/common/src/main/java/me/confuser/banmanager/common/runnables/Runner.java @@ -1,4 +1,4 @@ -package me.confuser.banmanager.runnables; +package me.confuser.banmanager.common.runnables; import java.util.HashMap; diff --git a/common/src/main/java/me/confuser/banmanager/common/runnables/SaveLastChecked.java b/common/src/main/java/me/confuser/banmanager/common/runnables/SaveLastChecked.java new file mode 100644 index 000000000..90054108e --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/runnables/SaveLastChecked.java @@ -0,0 +1,19 @@ +package me.confuser.banmanager.common.runnables; + + +import me.confuser.banmanager.common.BanManagerPlugin; + +public class SaveLastChecked implements Runnable { + + private BanManagerPlugin plugin; + + public SaveLastChecked(BanManagerPlugin plugin) { + this.plugin = plugin; + } + + @Override + public void run() { + plugin.getSchedulesConfig().save(); + } + +} diff --git a/common/src/main/java/me/confuser/banmanager/common/runnables/WarningSync.java b/common/src/main/java/me/confuser/banmanager/common/runnables/WarningSync.java new file mode 100644 index 000000000..805542304 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/runnables/WarningSync.java @@ -0,0 +1,73 @@ +package me.confuser.banmanager.common.runnables; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.CommonPlayer; +import me.confuser.banmanager.common.data.PlayerWarnData; +import me.confuser.banmanager.common.ormlite.dao.CloseableIterator; +import me.confuser.banmanager.common.storage.PlayerWarnStorage; +import me.confuser.banmanager.common.util.Message; + +import java.sql.SQLException; + +public class WarningSync extends BmRunnable { + + private PlayerWarnStorage warnStorage; + + public WarningSync(BanManagerPlugin plugin) { + super(plugin, "playerWarnings"); + + warnStorage = plugin.getPlayerWarnStorage(); + } + + @Override + public void run() { + newWarnings(); + } + + private void newWarnings() { + + CloseableIterator itr = null; + try { + itr = warnStorage.findWarnings(lastChecked); + + while (itr.hasNext()) { + final PlayerWarnData warn = itr.next(); + + if (warn.isRead()) { + continue; + } + + plugin.getScheduler().runSync(() -> { + CommonPlayer bukkitPlayer = plugin.getServer().getPlayer(warn.getPlayer().getUUID()); + + if (bukkitPlayer == null || !bukkitPlayer.isOnline()) return; + + Message.get("warn.player.warned") + .set("displayName", bukkitPlayer.getDisplayName()) + .set("player", warn.getPlayer().getName()) + .set("reason", warn.getReason()) + .set("actor", warn.getActor().getName()) + .sendTo(bukkitPlayer); + + warn.setRead(true); + + plugin.getScheduler().runAsync(() -> { + try { + plugin.getPlayerWarnStorage().update(warn); + } catch (SQLException e) { + e.printStackTrace(); + } + }); + + }); + + } + } catch (SQLException e) { + e.printStackTrace(); + } finally { + if (itr != null) itr.closeQuietly(); + } + + } + +} diff --git a/common/src/main/java/me/confuser/banmanager/common/storage/ActivityStorage.java b/common/src/main/java/me/confuser/banmanager/common/storage/ActivityStorage.java new file mode 100644 index 000000000..ccab7494a --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/storage/ActivityStorage.java @@ -0,0 +1,331 @@ +package me.confuser.banmanager.common.storage; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.ormlite.field.SqlType; +import me.confuser.banmanager.common.ormlite.stmt.StatementBuilder; +import me.confuser.banmanager.common.ormlite.support.CompiledStatement; +import me.confuser.banmanager.common.ormlite.support.DatabaseConnection; +import me.confuser.banmanager.common.ormlite.support.DatabaseResults; +import me.confuser.banmanager.common.util.IPUtils; + +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class ActivityStorage { + + // Queries + private final String sinceSql; + private final String sincePlayerSql; + private BanManagerPlugin plugin; + + public ActivityStorage(BanManagerPlugin plugin) { + this.plugin = plugin; + + sinceSql = "SELECT type, name, actor, created, name2 FROM" + + " ( SELECT 'Ban' AS type, p.name AS name, actor.name AS actor, created, '' AS name2" + + " FROM " + plugin.getPlayerBanStorage().getTableConfig().getTableName() + + " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig().getTableName() + " p ON player_id = p.id" + + " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig() + .getTableName() + " actor ON actor_id = actor.id" + + " WHERE created >= ?" + + + " UNION ALL" + + + " SELECT 'Ban' AS type, p.name AS name, actor.name AS actor, pastCreated AS created, '' AS name2" + + " FROM " + plugin.getPlayerBanRecordStorage().getTableConfig().getTableName() + + " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig().getTableName() + " p ON player_id = p.id" + + " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig() + .getTableName() + " actor ON actor_id = actor.id" + + " WHERE pastCreated >= ?" + + + " UNION ALL" + + + " SELECT 'Unban' AS type, p.name AS name, actor.name AS actor, created, '' AS name2" + + " FROM " + plugin.getPlayerBanRecordStorage().getTableConfig().getTableName() + + " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig().getTableName() + " p ON player_id = p.id" + + " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig() + .getTableName() + " actor ON actor_id = actor.id" + + " WHERE created >= ?" + + + " UNION ALL" + + + " SELECT 'Warning' AS type, p.name AS name, actor.name AS actor, created, '' AS name2" + + " FROM " + plugin.getPlayerWarnStorage().getTableConfig().getTableName() + + " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig().getTableName() + " p ON player_id = p.id" + + " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig() + .getTableName() + " actor ON actor_id = actor.id" + + " WHERE created >= ?" + + + " UNION ALL" + + + " SELECT 'Mute' AS type, p.name AS name, actor.name AS actor, created, '' AS name2" + + " FROM " + plugin.getPlayerMuteStorage().getTableConfig().getTableName() + + " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig().getTableName() + " p ON player_id = p.id" + + " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig() + .getTableName() + " actor ON actor_id = actor.id" + + " WHERE created >= ?" + + + " UNION ALL" + + + " SELECT 'Mute' AS type, p.name AS name, actor.name AS actor, pastCreated as created, '' AS name2" + + " FROM " + plugin.getPlayerMuteRecordStorage().getTableConfig().getTableName() + + " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig().getTableName() + " p ON player_id = p.id" + + " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig() + .getTableName() + " actor ON actor_id = actor.id" + + " WHERE pastCreated >= ?" + + + " UNION ALL" + + + " SELECT 'Unmute' AS type, p.name AS name, actor.name AS actor, created, '' AS name2" + + " FROM " + plugin.getPlayerMuteRecordStorage().getTableConfig().getTableName() + + " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig().getTableName() + " p ON player_id = p.id" + + " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig() + .getTableName() + " actor ON actor_id = actor.id" + + " WHERE created >= ?" + + + " UNION ALL" + + + " SELECT 'Note' AS type, p.name AS name, actor.name AS actor, created, '' AS name2" + + " FROM " + plugin.getPlayerNoteStorage().getTableConfig().getTableName() + + " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig().getTableName() + " p ON player_id = p.id" + + " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig() + .getTableName() + " actor ON actor_id = actor.id" + + " WHERE created >= ?" + + + " UNION ALL" + + + " SELECT 'IP Ban' AS type, INET6_NTOA(ib.ip) AS name, actor.name AS actor, created, '' AS name2" + + " FROM " + plugin.getIpBanStorage().getTableConfig().getTableName() + " ib" + + " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig() + .getTableName() + " actor ON actor_id = actor.id" + + " WHERE created >= ?" + + + " UNION ALL" + + + " SELECT 'IP Ban' AS type, INET6_NTOA(ibr.ip) AS name, actor.name AS actor, pastCreated AS created, '' AS name2" + + " FROM " + plugin.getIpBanRecordStorage().getTableConfig().getTableName() + " ibr" + + " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig() + .getTableName() + " actor ON actor_id = actor.id" + + " WHERE pastCreated >= ?" + + + " UNION ALL" + + + " SELECT 'IP Unban' AS type, INET6_NTOA(ibr.ip) AS name, actor.name AS actor, created, '' AS name2" + + " FROM " + plugin.getIpBanRecordStorage().getTableConfig().getTableName() + " ibr" + + " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig() + .getTableName() + " actor ON actor_id = actor.id" + + " WHERE created >= ?" + + + " UNION ALL" + + + " SELECT 'IP Ban' AS type, INET6_NTOA(fromIp) AS name, actor.name AS actor, created, INET6_NTOA(toIp) AS name2" + + " FROM " + plugin.getIpRangeBanStorage().getTableConfig().getTableName() + + " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig() + .getTableName() + " actor ON actor_id = actor.id" + + " WHERE created >= ?" + + + " UNION ALL" + + + " SELECT 'IP Ban' AS type, INET6_NTOA(fromIp) AS name, actor.name AS actor, pastCreated AS created, INET6_NTOA(toIp) AS name2" + + " FROM " + plugin.getIpRangeBanRecordStorage().getTableConfig().getTableName() + + " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig() + .getTableName() + " actor ON actor_id = actor.id" + + " WHERE pastCreated >= ?" + + + " UNION ALL" + + + " SELECT 'IP Unban' AS type, INET6_NTOA(fromIp) AS name, actor.name AS actor, created, INET6_NTOA(toIp) AS name2" + + " FROM " + plugin.getIpRangeBanRecordStorage().getTableConfig().getTableName() + + " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig() + .getTableName() + " actor ON actor_id = actor.id" + + " WHERE created >= ?" + + + " ) subquery" + + " ORDER BY created DESC"; + sincePlayerSql = "SELECT type, name, created, name2 FROM" + + " ( SELECT 'Ban' AS type, p.name AS name, created, '' AS name2" + + " FROM " + plugin.getPlayerBanStorage().getTableConfig().getTableName() + + " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig().getTableName() + " p ON player_id = p.id" + + " WHERE created >= ? AND actor_id = ?" + + + " UNION ALL" + + + " SELECT 'Ban' AS type, p.name AS name, pastCreated as created, '' AS name2" + + " FROM " + plugin.getPlayerBanRecordStorage().getTableConfig().getTableName() + + " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig().getTableName() + " p ON player_id = p.id" + + " WHERE pastCreated >= ? AND actor_id = ?" + + + " UNION ALL" + + + " SELECT 'Unban' AS type, p.name AS name, created, '' AS name2" + + " FROM " + plugin.getPlayerBanRecordStorage().getTableConfig().getTableName() + + " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig().getTableName() + " p ON player_id = p.id" + + " WHERE created >= ? AND actor_id = ?" + + + " UNION ALL" + + + " SELECT 'Warning' AS type, p.name AS name, created, '' AS name2" + + " FROM " + plugin.getPlayerWarnStorage().getTableConfig().getTableName() + + " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig().getTableName() + " p ON player_id = p.id" + + " WHERE created >= ? AND actor_id = ?" + + + " UNION ALL" + + + " SELECT 'Mute' AS type, p.name AS name, created, '' AS name2" + + " FROM " + plugin.getPlayerMuteStorage().getTableConfig().getTableName() + + " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig().getTableName() + " p ON player_id = p.id" + + " WHERE created >= ? AND actor_id = ?" + + + " UNION ALL" + + + " SELECT 'Mute' AS type, p.name AS name, pastCreated as created, '' AS name2" + + " FROM " + plugin.getPlayerMuteRecordStorage().getTableConfig().getTableName() + + " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig().getTableName() + " p ON player_id = p.id" + + " WHERE pastCreated >= ? AND actor_id = ?" + + + " UNION ALL" + + + " SELECT 'Unmute' AS type, p.name AS name, created, '' AS name2" + + " FROM " + plugin.getPlayerMuteRecordStorage().getTableConfig().getTableName() + + " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig().getTableName() + " p ON player_id = p.id" + + " WHERE created >= ? AND actor_id = ?" + + + " UNION ALL" + + + " SELECT 'Note' AS type, p.name AS name, created, '' AS name2" + + " FROM " + plugin.getPlayerNoteStorage().getTableConfig().getTableName() + + " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig().getTableName() + " p ON player_id = p.id" + + " WHERE created >= ? AND actor_id = ?" + + + " UNION ALL" + + + " SELECT 'IP Ban' AS type, INET6_NTOA(ib.ip) AS name, created, '' AS name2" + + " FROM " + plugin.getIpBanStorage().getTableConfig().getTableName() + " ib" + + " WHERE created >= ? AND actor_id = ?" + + + " UNION ALL" + + + " SELECT 'IP Ban' AS type, INET6_NTOA(ibr.ip) AS name, pastCreated AS created, '' AS name2" + + " FROM " + plugin.getIpBanRecordStorage().getTableConfig().getTableName() + " ibr" + + " WHERE pastCreated >= ? AND actor_id = ?" + + + " UNION ALL" + + + " SELECT 'IP Unban' AS type, INET6_NTOA(ibr.ip) AS name, created, '' AS name2" + + " FROM " + plugin.getIpBanRecordStorage().getTableConfig().getTableName() + " ibr" + + " WHERE created >= ? AND actor_id = ?" + + + " UNION ALL" + + + " SELECT 'IP Ban' AS type, INET6_NTOA(fromIp) AS name, created, INET6_NTOA(toIp) AS name2" + + " FROM " + plugin.getIpRangeBanStorage().getTableConfig().getTableName() + + " WHERE created >= ? AND actor_id = ?" + + + " UNION ALL" + + + " SELECT 'IP Ban' AS type, INET6_NTOA(fromIp) AS name, pastCreated AS created, INET6_NTOA(toIp) AS name2" + + " FROM " + plugin.getIpRangeBanRecordStorage().getTableConfig().getTableName() + + " WHERE pastCreated >= ? AND actor_id = ?" + + + " UNION ALL" + + + " SELECT 'IP Unban' AS type, INET6_NTOA(fromIp) AS name, created, INET6_NTOA(toIp) AS name2" + + " FROM " + plugin.getIpRangeBanRecordStorage().getTableConfig().getTableName() + + " WHERE created >= ? AND actor_id = ?" + + + " ) subquery" + + " ORDER BY created DESC"; + } + + public List> getSince(long since) { + return getSince(since, null); + } + + public List> getSince(long since, PlayerData actor) { + DatabaseConnection connection; + + try { + connection = plugin.getLocalConn().getReadOnlyConnection(""); + } catch (SQLException e) { + e.printStackTrace(); + + return null; + } + + final DatabaseResults result; + boolean hasActor = actor != null; + + try { + CompiledStatement statement = connection + .compileStatement(hasActor ? sincePlayerSql : sinceSql, StatementBuilder.StatementType.SELECT, null, + DatabaseConnection.DEFAULT_RESULT_FLAGS, false); + + int maxItems = hasActor ? 28 : 14; + + for (int i = 0; i < maxItems; i++) { + statement.setObject(i, since, SqlType.LONG); + if (hasActor) { + i++; + statement.setObject(i, actor.getId(), SqlType.BYTE_ARRAY); + } + } + result = statement.runQuery(null); + } catch (SQLException e) { + e.printStackTrace(); + + try { + plugin.getLocalConn().releaseConnection(connection); + } catch (SQLException e1) { + e1.printStackTrace(); + } + + return null; + } + + List> results = new ArrayList<>(); + + try { + while (result.next()) { + Map map = new HashMap<>(hasActor ? 3 : 4); + + int ipIndex = 3; + map.put("type", result.getString(0)); + + if (hasActor) { + map.put("created", result.getLong(2)); + } else { + map.put("actor", result.getString(2)); + map.put("created", result.getLong(3)); + ipIndex = 4; + } + + // ip or name + String ip = result.getString(1); + + if (!result.getString(ipIndex).isEmpty()) { + ip = ip + " - " + result.getString(ipIndex); + } + + map.put("player", ip); + + results.add(map); + } + } catch (SQLException e) { + e.printStackTrace(); + } finally { + result.closeQuietly(); + } + + try { + plugin.getLocalConn().releaseConnection(connection); + } catch (SQLException e) { + e.printStackTrace(); + } + + return results; + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/storage/HistoryStorage.java b/common/src/main/java/me/confuser/banmanager/common/storage/HistoryStorage.java new file mode 100644 index 000000000..b153fe101 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/storage/HistoryStorage.java @@ -0,0 +1,490 @@ +package me.confuser.banmanager.common.storage; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.ipaddr.IPAddress; +import me.confuser.banmanager.common.ormlite.field.SqlType; +import me.confuser.banmanager.common.ormlite.stmt.StatementBuilder; +import me.confuser.banmanager.common.ormlite.support.CompiledStatement; +import me.confuser.banmanager.common.ormlite.support.DatabaseConnection; +import me.confuser.banmanager.common.ormlite.support.DatabaseResults; +import me.confuser.banmanager.common.util.parsers.InfoCommandParser; + +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.HashMap; + +public class HistoryStorage { + + private final String playerSql = "SELECT id, type, actor, created, reason, meta FROM" + + " ( {QUERIES}" + + " ) subquery" + + " ORDER BY created DESC"; + private BanManagerPlugin plugin; + // Queries + private final String banSql; + private final String muteSql; + private final String kickSql; + private final String warningSql; + private final String noteSql; + private final String reportSql; + + private final String ipBanSql; + private final String ipMuteSql; + private final String ipRangeBanSql; + + + public HistoryStorage(BanManagerPlugin plugin) { + this.plugin = plugin; + + banSql = "SELECT t.id, 'Ban' AS type, actor.name AS actor, pastCreated as created, reason, '' AS meta" + + " FROM " + plugin.getPlayerBanRecordStorage().getTableConfig().getTableName() + " t" + + " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig() + .getTableName() + " actor ON pastActor_id = actor.id" + + " WHERE player_id = ?"; + muteSql = "SELECT t.id, 'Mute' AS type, actor.name AS actor, pastCreated as created, reason, '' AS meta" + + " FROM " + plugin.getPlayerMuteRecordStorage().getTableConfig().getTableName() + " t" + + " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig() + .getTableName() + " actor ON pastActor_id = actor.id" + + " WHERE player_id = ?"; + kickSql = "SELECT t.id, 'Kick' AS type, actor.name AS actor, created, reason, '' AS meta" + + " FROM " + plugin.getPlayerKickStorage().getTableConfig().getTableName() + " t" + + " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig() + .getTableName() + " actor ON actor_id = actor.id" + + " WHERE player_id = ?"; + warningSql = "SELECT t.id, 'Warning' AS type, actor.name AS actor, created, reason, points AS meta" + + " FROM " + plugin.getPlayerWarnStorage().getTableConfig().getTableName() + " t" + + " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig() + .getTableName() + " actor ON actor_id = actor.id" + + " WHERE player_id = ?"; + noteSql = "SELECT t.id, 'Note' AS type, actor.name AS actor, created, message AS reason, '' AS meta" + + " FROM " + plugin.getPlayerNoteStorage().getTableConfig().getTableName() + " t" + + " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig() + .getTableName() + " actor ON actor_id = actor.id" + + " WHERE player_id = ?"; + reportSql = "SELECT t.id, 'Reported' AS type, actor.name AS actor, created, reason, state.name AS meta" + + " FROM " + plugin.getPlayerReportStorage().getTableConfig().getTableName() + " t" + + " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig() + .getTableName() + " actor ON actor_id = actor.id" + + " LEFT JOIN " + plugin.getReportStateStorage().getTableConfig() + .getTableName() + " state ON t.state_id = state.id" + + " WHERE player_id = ?"; + + ipBanSql = "SELECT t.id, 'IP Ban' AS type, actor.name AS actor, pastCreated as created, reason, '' AS meta" + + " FROM " + plugin.getIpBanRecordStorage().getTableConfig().getTableName() + " t" + + " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig() + .getTableName() + " actor ON pastActor_id = actor.id" + + " WHERE t.ip = ?"; + + ipMuteSql = "SELECT t.id, 'IP Mute' AS type, actor.name AS actor, pastCreated as created, reason, '' AS meta" + + " FROM " + plugin.getIpMuteRecordStorage().getTableConfig().getTableName() + " t" + + " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig() + .getTableName() + " actor ON pastActor_id = actor.id" + + " WHERE t.ip = ?"; + + ipRangeBanSql = "SELECT t.id, 'IP Range Ban' AS type, actor.name AS actor, pastCreated as created, reason, CONCAT(INET6_NTOA(fromIp), ' - ', INET6_NTOA(toIp)) AS meta" + + " FROM " + plugin.getIpRangeBanRecordStorage().getTableConfig().getTableName() + " t" + + " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig() + .getTableName() + " actor ON pastActor_id = actor.id" + + " WHERE ? BETWEEN fromIp AND toIp"; + } + + public ArrayList> getSince(PlayerData player, long since, InfoCommandParser parser) { + DatabaseConnection connection; + + try { + connection = plugin.getLocalConn().getReadOnlyConnection(""); + } catch (SQLException e) { + e.printStackTrace(); + + return null; + } + + final DatabaseResults result; + String sql; + StringBuilder unions = new StringBuilder(); + int typeCount = 0; + + // TODO refactor + if (parser.isBans()) { + unions.append(banSql); + unions.append(" AND created >= ").append(since); + unions.append(" UNION ALL "); + typeCount++; + } + + if (parser.isMutes()) { + unions.append(muteSql); + unions.append(" AND created >= ").append(since); + unions.append(" UNION ALL "); + typeCount++; + } + if (parser.isKicks()) { + unions.append(kickSql); + unions.append(" AND created >= ").append(since); + unions.append(" UNION ALL "); + typeCount++; + } + if (parser.isNotes()) { + unions.append(noteSql); + unions.append(" AND created >= ").append(since); + unions.append(" UNION ALL "); + typeCount++; + } + if (parser.isReports()) { + unions.append(reportSql); + unions.append(" AND created >= ").append(since); + unions.append(" UNION ALL "); + typeCount++; + } + if (parser.isWarnings()) { + unions.append(warningSql); + unions.append(" AND created >= ").append(since); + unions.append(" UNION ALL "); + typeCount++; + } + + unions.setLength(unions.length() - 11); + + sql = playerSql.replace("{QUERIES}", unions.toString()); + + try { + CompiledStatement statement = connection + .compileStatement(sql, StatementBuilder.StatementType.SELECT, null, DatabaseConnection + .DEFAULT_RESULT_FLAGS, false); + + for (int i = 0; i < typeCount; i++) { + statement.setObject(i, player.getId(), SqlType.BYTE_ARRAY); + } + + result = statement.runQuery(null); + } catch (SQLException e) { + e.printStackTrace(); + + try { + plugin.getLocalConn().releaseConnection(connection); + } catch (SQLException e1) { + e1.printStackTrace(); + } + + return null; + } + + ArrayList> results = new ArrayList<>(); + + try { + while (result.next()) { + results.add(new HashMap(4) { + + { + put("id", result.getInt(0)); + put("type", result.getString(1)); + put("actor", result.getString(2)); + put("created", result.getLong(3)); + put("reason", result.getString(4)); + put("meta", result.getString(5)); + } + }); + } + } catch (SQLException e) { + e.printStackTrace(); + } finally { + result.closeQuietly(); + } + + try { + plugin.getLocalConn().releaseConnection(connection); + } catch (SQLException e) { + e.printStackTrace(); + } + + return results; + } + + public ArrayList> getAll(PlayerData player, InfoCommandParser parser) { + DatabaseConnection connection; + + try { + connection = plugin.getLocalConn().getReadOnlyConnection(""); + } catch (SQLException e) { + e.printStackTrace(); + + return null; + } + + final DatabaseResults result; + String sql; + StringBuilder unions = new StringBuilder(); + int typeCount = 0; + + // TODO refactor + if (parser.isBans()) { + unions.append(banSql); + unions.append(" UNION ALL "); + typeCount++; + } + + if (parser.isMutes()) { + unions.append(muteSql); + unions.append(" UNION ALL "); + typeCount++; + } + if (parser.isKicks()) { + unions.append(kickSql); + unions.append(" UNION ALL "); + typeCount++; + } + if (parser.isNotes()) { + unions.append(noteSql); + unions.append(" UNION ALL "); + typeCount++; + } + if (parser.isReports()) { + unions.append(reportSql); + unions.append(" UNION ALL "); + typeCount++; + } + if (parser.isWarnings()) { + unions.append(warningSql); + unions.append(" UNION ALL "); + typeCount++; + } + + unions.setLength(unions.length() - 11); + + sql = playerSql.replace("{QUERIES}", unions.toString()); + + try { + CompiledStatement statement = connection + .compileStatement(sql, StatementBuilder.StatementType.SELECT, null, DatabaseConnection + .DEFAULT_RESULT_FLAGS, false); + + for (int i = 0; i < typeCount; i++) { + statement.setObject(i, player.getId(), SqlType.BYTE_ARRAY); + } + + result = statement.runQuery(null); + } catch (SQLException e) { + e.printStackTrace(); + + try { + plugin.getLocalConn().releaseConnection(connection); + } catch (SQLException e1) { + e1.printStackTrace(); + } + + return null; + } + + ArrayList> results = new ArrayList<>(); + + try { + while (result.next()) { + results.add(new HashMap(4) { + + { + put("id", result.getInt(0)); + put("type", result.getString(1)); + put("actor", result.getString(2)); + put("created", result.getLong(3)); + put("reason", result.getString(4)); + put("meta", result.getString(5)); + } + }); + } + } catch (SQLException e) { + e.printStackTrace(); + } finally { + result.closeQuietly(); + } + + try { + plugin.getLocalConn().releaseConnection(connection); + } catch (SQLException e) { + e.printStackTrace(); + } + + return results; + } + + public ArrayList> getSince(IPAddress ip, long since, InfoCommandParser parser) { + DatabaseConnection connection; + + try { + connection = plugin.getLocalConn().getReadOnlyConnection(""); + } catch (SQLException e) { + e.printStackTrace(); + + return null; + } + + final DatabaseResults result; + String sql; + StringBuilder unions = new StringBuilder(); + int typeCount = 0; + + if (parser.isBans()) { + unions.append(ipBanSql); + unions.append(" AND created >= ").append(since); + unions.append(" UNION ALL "); + typeCount++; + + unions.append(ipRangeBanSql); + unions.append(" AND created >= ").append(since); + unions.append(" UNION ALL "); + typeCount++; + } + + if (parser.isMutes()) { + unions.append(ipMuteSql); + unions.append(" AND created >= ").append(since); + unions.append(" UNION ALL "); + typeCount++; + } + + unions.setLength(unions.length() - 11); + + sql = playerSql.replace("{QUERIES}", unions.toString()); + + try { + CompiledStatement statement = connection + .compileStatement(sql, StatementBuilder.StatementType.SELECT, null, DatabaseConnection + .DEFAULT_RESULT_FLAGS, false); + + for (int i = 0; i < typeCount; i++) { + statement.setObject(i, ip.getBytes(), SqlType.BYTE_ARRAY); + } + + result = statement.runQuery(null); + } catch (SQLException e) { + e.printStackTrace(); + + try { + plugin.getLocalConn().releaseConnection(connection); + } catch (SQLException e1) { + e1.printStackTrace(); + } + + return null; + } + + ArrayList> results = new ArrayList<>(); + + try { + while (result.next()) { + results.add(new HashMap(4) { + + { + put("id", result.getInt(0)); + put("type", result.getString(1)); + put("actor", result.getString(2)); + put("created", result.getLong(3)); + put("reason", result.getString(4)); + put("meta", result.getString(5)); + } + }); + } + } catch (SQLException e) { + e.printStackTrace(); + } finally { + result.closeQuietly(); + } + + try { + plugin.getLocalConn().releaseConnection(connection); + } catch (SQLException e) { + e.printStackTrace(); + } + + return results; + } + + public ArrayList> getAll(IPAddress ip, InfoCommandParser parser) { + DatabaseConnection connection; + + try { + connection = plugin.getLocalConn().getReadOnlyConnection(""); + } catch (SQLException e) { + e.printStackTrace(); + + return null; + } + + final DatabaseResults result; + String sql; + StringBuilder unions = new StringBuilder(); + int typeCount = 0; + + if (parser.isBans()) { + unions.append(ipBanSql); + unions.append(" UNION ALL "); + typeCount++; + + unions.append(ipRangeBanSql); + unions.append(" UNION ALL "); + typeCount++; + } + + if (parser.isMutes()) { + unions.append(ipMuteSql); + unions.append(" UNION ALL "); + typeCount++; + } + + unions.setLength(unions.length() - 11); + + sql = playerSql.replace("{QUERIES}", unions.toString()); + + try { + CompiledStatement statement = connection + .compileStatement(sql, StatementBuilder.StatementType.SELECT, null, DatabaseConnection + .DEFAULT_RESULT_FLAGS, false); + + for (int i = 0; i < typeCount; i++) { + statement.setObject(i, ip.getBytes(), SqlType.BYTE_ARRAY); + } + + result = statement.runQuery(null); + } catch (SQLException e) { + e.printStackTrace(); + + try { + plugin.getLocalConn().releaseConnection(connection); + } catch (SQLException e1) { + e1.printStackTrace(); + } + + return null; + } + + ArrayList> results = new ArrayList<>(); + + try { + while (result.next()) { + results.add(new HashMap(4) { + + { + put("id", result.getInt(0)); + put("type", result.getString(1)); + put("actor", result.getString(2)); + put("created", result.getLong(3)); + put("reason", result.getString(4)); + put("meta", result.getString(5)); + } + }); + } + } catch (SQLException e) { + e.printStackTrace(); + } finally { + result.closeQuietly(); + } + + try { + plugin.getLocalConn().releaseConnection(connection); + } catch (SQLException e) { + e.printStackTrace(); + } + + return results; + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/storage/IpBanRecordStorage.java b/common/src/main/java/me/confuser/banmanager/common/storage/IpBanRecordStorage.java new file mode 100644 index 000000000..7e70182a8 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/storage/IpBanRecordStorage.java @@ -0,0 +1,102 @@ +package me.confuser.banmanager.common.storage; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.configs.CleanUp; +import me.confuser.banmanager.common.data.IpBanData; +import me.confuser.banmanager.common.data.IpBanRecord; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.ipaddr.IPAddress; +import me.confuser.banmanager.common.ormlite.dao.BaseDaoImpl; +import me.confuser.banmanager.common.ormlite.dao.CloseableIterator; +import me.confuser.banmanager.common.ormlite.stmt.DeleteBuilder; +import me.confuser.banmanager.common.ormlite.stmt.QueryBuilder; +import me.confuser.banmanager.common.ormlite.stmt.Where; +import me.confuser.banmanager.common.ormlite.support.ConnectionSource; +import me.confuser.banmanager.common.ormlite.table.DatabaseTableConfig; +import me.confuser.banmanager.common.ormlite.table.TableUtils; +import me.confuser.banmanager.common.util.DateUtils; +import me.confuser.banmanager.common.util.StorageUtils; + +import java.sql.SQLException; + +public class IpBanRecordStorage extends BaseDaoImpl { + + public IpBanRecordStorage(BanManagerPlugin plugin) throws SQLException { + super(plugin.getLocalConn(), (DatabaseTableConfig) plugin.getConfig().getLocalDb() + .getTable("ipBanRecords")); + + if (!this.isTableExists()) { + TableUtils.createTable(connectionSource, tableConfig); + } else { + // Attempt to add new columns + try { + String update = "ALTER TABLE " + tableConfig.getTableName() + " ADD COLUMN `createdReason` VARCHAR(255)"; + executeRawNoArgs(update); + } catch (SQLException e) { + } + try { + executeRawNoArgs("ALTER TABLE " + tableConfig.getTableName() + " ADD COLUMN `silent` TINYINT(1)"); + } catch (SQLException e) { + } + + try { + executeRawNoArgs("ALTER TABLE " + tableConfig.getTableName() + + " CHANGE `created` `created` BIGINT UNSIGNED," + + " CHANGE `pastCreated` `pastCreated` BIGINT UNSIGNED," + + " CHANGE `expired` `expired` BIGINT UNSIGNED" + ); + } catch (SQLException e) { + } + + StorageUtils.convertIpColumn(plugin, tableConfig.getTableName(), "ip"); + } + } + + public IpBanRecordStorage(ConnectionSource connection, DatabaseTableConfig table) throws SQLException { + super(connection, (DatabaseTableConfig) table); + } + + public void addRecord(IpBanData ban, PlayerData actor, String reason) throws SQLException { + create(new IpBanRecord(ban, actor, reason)); + } + + public CloseableIterator findUnbans(long fromTime) throws SQLException { + if (fromTime == 0) { + return iterator(); + } + + long checkTime = fromTime + DateUtils.getTimeDiff(); + + QueryBuilder query = queryBuilder(); + Where where = query.where(); + + where.ge("created", checkTime); + + query.setWhere(where); + + return query.iterator(); + + } + + public long getCount(IPAddress ip) throws SQLException { + return queryBuilder().where().eq("ip", ip).countOf(); + } + + public CloseableIterator getRecords(IPAddress ip) throws SQLException { + return queryBuilder().where().eq("ip", ip).iterator(); + } + + public void purge(CleanUp cleanup) throws SQLException { + if (cleanup.getDays() == 0) return; + + updateRaw("DELETE FROM " + getTableInfo().getTableName() + " WHERE created < UNIX_TIMESTAMP(CURRENT_TIMESTAMP - INTERVAL '" + cleanup.getDays() + "' DAY)"); + } + + public int deleteAll(IPAddress ip) throws SQLException { + DeleteBuilder builder = deleteBuilder(); + + builder.where().eq("ip", ip); + + return builder.delete(); + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/storage/IpBanStorage.java b/common/src/main/java/me/confuser/banmanager/common/storage/IpBanStorage.java new file mode 100644 index 000000000..fb94bee41 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/storage/IpBanStorage.java @@ -0,0 +1,245 @@ +package me.confuser.banmanager.common.storage; + +import lombok.Getter; +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.api.events.CommonEvent; +import me.confuser.banmanager.common.data.IpBanData; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.ipaddr.AddressValueException; +import me.confuser.banmanager.common.ipaddr.IPAddress; +import me.confuser.banmanager.common.ormlite.dao.BaseDaoImpl; +import me.confuser.banmanager.common.ormlite.dao.CloseableIterator; +import me.confuser.banmanager.common.ormlite.stmt.QueryBuilder; +import me.confuser.banmanager.common.ormlite.stmt.StatementBuilder; +import me.confuser.banmanager.common.ormlite.stmt.Where; +import me.confuser.banmanager.common.ormlite.support.CompiledStatement; +import me.confuser.banmanager.common.ormlite.support.ConnectionSource; +import me.confuser.banmanager.common.ormlite.support.DatabaseConnection; +import me.confuser.banmanager.common.ormlite.support.DatabaseResults; +import me.confuser.banmanager.common.ormlite.table.DatabaseTableConfig; +import me.confuser.banmanager.common.ormlite.table.TableUtils; +import me.confuser.banmanager.common.util.DateUtils; +import me.confuser.banmanager.common.util.IPUtils; +import me.confuser.banmanager.common.util.StorageUtils; +import me.confuser.banmanager.common.util.UUIDUtils; + +import java.net.InetAddress; +import java.sql.SQLException; +import java.util.List; +import java.util.Objects; +import java.util.concurrent.ConcurrentHashMap; + +public class IpBanStorage extends BaseDaoImpl { + + private BanManagerPlugin plugin; + @Getter + private ConcurrentHashMap bans = new ConcurrentHashMap<>(); + + public IpBanStorage(BanManagerPlugin plugin) throws SQLException { + super(plugin.getLocalConn(), (DatabaseTableConfig) plugin.getConfig().getLocalDb() + .getTable("ipBans")); + + this.plugin = plugin; + + if (!this.isTableExists()) { + TableUtils.createTable(connectionSource, tableConfig); + } else { + StorageUtils.convertIpColumn(plugin, tableConfig.getTableName(), "ip"); + + try { + executeRawNoArgs("ALTER TABLE " + tableConfig.getTableName() + " ADD COLUMN `silent` TINYINT(1)"); + } catch (SQLException e) { + } + + try { + executeRawNoArgs("ALTER TABLE " + tableConfig.getTableName() + + " CHANGE `created` `created` BIGINT UNSIGNED," + + " CHANGE `updated` `updated` BIGINT UNSIGNED," + + " CHANGE `expires` `expires` BIGINT UNSIGNED" + ); + } catch (SQLException e) { + } + } + + loadAll(); + + plugin.getLogger().info("Loaded " + bans.size() + " ip bans into memory"); + } + + public IpBanStorage(ConnectionSource connection, DatabaseTableConfig table) throws SQLException { + super(connection, (DatabaseTableConfig) table); + } + + private void loadAll() throws SQLException { + DatabaseConnection connection; + + try { + connection = this.getConnectionSource().getReadOnlyConnection(getTableName()); + } catch (SQLException e) { + e.printStackTrace(); + plugin.getLogger().warning("Failed to retrieve ip bans into memory"); + return; + } + StringBuilder sql = new StringBuilder(); + + sql.append("SELECT t.id, a.id, a.name, a.ip, a.lastSeen, t.ip, t.reason,"); + sql.append(" t.expires, t.created, t.updated, t.silent"); + sql.append(" FROM "); + sql.append(this.getTableInfo().getTableName()); + sql.append(" t LEFT JOIN "); + sql.append(plugin.getPlayerStorage().getTableInfo().getTableName()); + sql.append(" a ON actor_id = a.id"); + + CompiledStatement statement; + + try { + statement = connection.compileStatement(sql.toString(), StatementBuilder.StatementType.SELECT, null, + DatabaseConnection.DEFAULT_RESULT_FLAGS, false); + } catch (SQLException e) { + e.printStackTrace(); + getConnectionSource().releaseConnection(connection); + + plugin.getLogger().warning("Failed to retrieve ip bans into memory"); + return; + } + + DatabaseResults results = null; + + try { + results = statement.runQuery(null); + + while (results.next()) { + PlayerData actor; + try { + actor = new PlayerData(UUIDUtils.fromBytes(results.getBytes(1)), results.getString(2), + IPUtils.toIPAddress(results.getBytes(3)), + results.getLong(4)); + + } catch (NullPointerException | AddressValueException e) { + plugin.getLogger().warning("Missing or invalid actor for ip ban " + results.getInt(0) + ", ignored"); + continue; + } + + IpBanData ban = new IpBanData(results.getInt(0), IPUtils.toIPAddress(results.getBytes(5)), actor, results.getString(6), + results.getBoolean(10), + results.getLong(7), + results.getLong(8), + results.getLong(9)); + + bans.put(ban.getIp().toString(), ban); + } + } catch (SQLException e) { + e.printStackTrace(); + } finally { + if (results != null) results.closeQuietly(); + + getConnectionSource().releaseConnection(connection); + } + } + + public boolean isBanned(IPAddress ip) { + return bans.get(ip.toString()) != null; + } + + public boolean isBanned(InetAddress address) { + return isBanned(IPUtils.toIPAddress(address)); + } + + public IpBanData retrieveBan(IPAddress ip) throws SQLException { + List bans = queryForEq("ip", ip); + + if (bans.isEmpty()) return null; + + return bans.get(0); + } + + public IpBanData getBan(IPAddress ip) { + return bans.get(ip.toString()); + } + + public IpBanData getBan(InetAddress address) { + return getBan(Objects.requireNonNull(IPUtils.toIPAddress(address))); + } + + public void addBan(IpBanData ban) { + bans.put(ban.getIp().toString(), ban); + + plugin.getServer().callEvent("IpBannedEvent", ban, ban.isSilent() || !plugin.getConfig().isBroadcastOnSync()); + } + + public void removeBan(IpBanData ban) { + removeBan(ban.getIp()); + } + + public void removeBan(IPAddress ip) { + bans.remove(ip.toString()); + } + + public boolean ban(IpBanData ban) throws SQLException { + CommonEvent event = plugin.getServer().callEvent("IpBanEvent", ban, ban.isSilent()); + + if (event.isCancelled()) { + return false; + } + + create(ban); + bans.put(ban.getIp().toString(), ban); + + plugin.getServer().callEvent("IpBannedEvent", ban, event.isSilent()); + + return true; + } + + public boolean unban(IpBanData ban, PlayerData actor) throws SQLException { + return unban(ban, actor, ""); + } + + public boolean unban(IpBanData ban, PlayerData actor, String reason) throws SQLException { + return unban(ban, actor, reason, false); + } + + public boolean unban(IpBanData ban, PlayerData actor, String reason, boolean delete) throws SQLException { + CommonEvent event = plugin.getServer().callEvent("IpUnbanEvent", ban, actor, reason); + + if (event.isCancelled()) { + return false; + } + + delete(ban); + bans.remove(ban.getIp().toString()); + + if (!delete) plugin.getIpBanRecordStorage().addRecord(ban, actor, reason); + + return true; + } + + public CloseableIterator findBans(long fromTime) throws SQLException { + if (fromTime == 0) { + return iterator(); + } + + long checkTime = fromTime + DateUtils.getTimeDiff(); + + QueryBuilder query = queryBuilder(); + Where where = query.where(); + where + .ge("created", checkTime) + .or() + .ge("updated", checkTime); + + query.setWhere(where); + + return query.iterator(); + } + + public boolean isRecentlyBanned(IPAddress ip, long cooldown) throws SQLException { + if (cooldown == 0) { + return false; + } + + return queryBuilder().where() + .eq("ip", ip).and() + .ge("created", (System.currentTimeMillis() / 1000L) - cooldown) + .countOf() > 0; + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/storage/IpMuteRecordStorage.java b/common/src/main/java/me/confuser/banmanager/common/storage/IpMuteRecordStorage.java new file mode 100644 index 000000000..38ef7d55e --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/storage/IpMuteRecordStorage.java @@ -0,0 +1,88 @@ +package me.confuser.banmanager.common.storage; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.configs.CleanUp; +import me.confuser.banmanager.common.data.IpMuteData; +import me.confuser.banmanager.common.data.IpMuteRecord; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.ipaddr.IPAddress; +import me.confuser.banmanager.common.ormlite.dao.BaseDaoImpl; +import me.confuser.banmanager.common.ormlite.dao.CloseableIterator; +import me.confuser.banmanager.common.ormlite.stmt.QueryBuilder; +import me.confuser.banmanager.common.ormlite.stmt.Where; +import me.confuser.banmanager.common.ormlite.support.ConnectionSource; +import me.confuser.banmanager.common.ormlite.table.DatabaseTableConfig; +import me.confuser.banmanager.common.ormlite.table.TableUtils; +import me.confuser.banmanager.common.util.DateUtils; +import me.confuser.banmanager.common.util.StorageUtils; + +import java.sql.SQLException; + +public class IpMuteRecordStorage extends BaseDaoImpl { + + public IpMuteRecordStorage(BanManagerPlugin plugin) throws SQLException { + super(plugin.getLocalConn(), (DatabaseTableConfig) plugin.getConfig().getLocalDb() + .getTable("ipMuteRecords")); + + if (!this.isTableExists()) { + TableUtils.createTable(connectionSource, tableConfig); + } else { + StorageUtils.convertIpColumn(plugin, tableConfig.getTableName(), "ip"); + + try { + executeRawNoArgs("ALTER TABLE " + tableConfig.getTableName() + " ADD COLUMN `silent` TINYINT(1)"); + } catch (SQLException e) { + } + + try { + executeRawNoArgs("ALTER TABLE " + tableConfig.getTableName() + + " CHANGE `created` `created` BIGINT UNSIGNED," + + " CHANGE `pastCreated` `pastCreated` BIGINT UNSIGNED," + + " CHANGE `expired` `expired` BIGINT UNSIGNED" + ); + } catch (SQLException e) { + } + } + } + + public IpMuteRecordStorage(ConnectionSource connection, DatabaseTableConfig table) throws SQLException { + super(connection, (DatabaseTableConfig) table); + } + + public void addRecord(IpMuteData mute, PlayerData actor, String reason) throws SQLException { + create(new IpMuteRecord(mute, actor, reason)); + } + + public CloseableIterator findUnmutes(long fromTime) throws SQLException { + if (fromTime == 0) { + return iterator(); + } + + long checkTime = fromTime + DateUtils.getTimeDiff(); + + QueryBuilder query = queryBuilder(); + Where where = query.where(); + + where.ge("created", checkTime); + + query.setWhere(where); + + return query.iterator(); + + } + + public long getCount(IPAddress ip) throws SQLException { + return queryBuilder().where().eq("ip", ip).countOf(); + } + + public CloseableIterator getRecords(IPAddress ip) throws SQLException { + return queryBuilder().where().eq("ip", ip).iterator(); + } + + public void purge(CleanUp cleanup) throws SQLException { + if (cleanup.getDays() == 0) return; + + updateRaw("DELETE FROM " + getTableInfo().getTableName() + " WHERE created < UNIX_TIMESTAMP(DATE_SUB(NOW(), " + + "INTERVAL " + cleanup.getDays() + " DAY))"); + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/storage/IpMuteStorage.java b/common/src/main/java/me/confuser/banmanager/common/storage/IpMuteStorage.java new file mode 100644 index 000000000..730c841b9 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/storage/IpMuteStorage.java @@ -0,0 +1,233 @@ +package me.confuser.banmanager.common.storage; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.api.events.CommonEvent; +import me.confuser.banmanager.common.data.IpMuteData; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.ipaddr.AddressValueException; +import me.confuser.banmanager.common.ipaddr.IPAddress; +import me.confuser.banmanager.common.ormlite.dao.BaseDaoImpl; +import me.confuser.banmanager.common.ormlite.dao.CloseableIterator; +import me.confuser.banmanager.common.ormlite.stmt.QueryBuilder; +import me.confuser.banmanager.common.ormlite.stmt.StatementBuilder; +import me.confuser.banmanager.common.ormlite.stmt.Where; +import me.confuser.banmanager.common.ormlite.support.CompiledStatement; +import me.confuser.banmanager.common.ormlite.support.ConnectionSource; +import me.confuser.banmanager.common.ormlite.support.DatabaseConnection; +import me.confuser.banmanager.common.ormlite.support.DatabaseResults; +import me.confuser.banmanager.common.ormlite.table.DatabaseTableConfig; +import me.confuser.banmanager.common.ormlite.table.TableUtils; +import me.confuser.banmanager.common.util.DateUtils; +import me.confuser.banmanager.common.util.IPUtils; +import me.confuser.banmanager.common.util.StorageUtils; +import me.confuser.banmanager.common.util.UUIDUtils; + +import java.net.InetAddress; +import java.sql.SQLException; +import java.util.List; +import java.util.concurrent.ConcurrentHashMap; + +public class IpMuteStorage extends BaseDaoImpl { + + private BanManagerPlugin plugin; + private ConcurrentHashMap mutes = new ConcurrentHashMap<>(); + + public IpMuteStorage(BanManagerPlugin plugin) throws SQLException { + super(plugin.getLocalConn(), (DatabaseTableConfig) plugin.getConfig().getLocalDb() + .getTable("ipMutes")); + + this.plugin = plugin; + + if (!this.isTableExists()) { + TableUtils.createTable(connectionSource, tableConfig); + } else { + StorageUtils.convertIpColumn(plugin, tableConfig.getTableName(), "ip"); + + try { + executeRawNoArgs("ALTER TABLE " + tableConfig.getTableName() + " ADD COLUMN `silent` TINYINT(1)"); + } catch (SQLException e) { + } + + try { + executeRawNoArgs("ALTER TABLE " + tableConfig.getTableName() + + " CHANGE `created` `created` BIGINT UNSIGNED," + + " CHANGE `updated` `updated` BIGINT UNSIGNED," + + " CHANGE `expires` `expires` BIGINT UNSIGNED" + ); + } catch (SQLException e) { + } + } + + loadAll(); + + plugin.getLogger().info("Loaded " + mutes.size() + " ip mutes into memory"); + } + + public IpMuteStorage(ConnectionSource connection, DatabaseTableConfig table) throws SQLException { + super(connection, (DatabaseTableConfig) table); + } + + private void loadAll() throws SQLException { + DatabaseConnection connection; + + try { + connection = this.getConnectionSource().getReadOnlyConnection(""); + } catch (SQLException e) { + e.printStackTrace(); + plugin.getLogger().warning("Failed to retrieve ip mutes into memory"); + return; + } + StringBuilder sql = new StringBuilder(); + + sql.append("SELECT t.id, a.id, a.name, a.ip, a.lastSeen, t.ip, t.reason,"); + sql.append(" t.soft, t.expires, t.created, t.updated, t.silent"); + sql.append(" FROM "); + sql.append(this.getTableInfo().getTableName()); + sql.append(" t LEFT JOIN "); + sql.append(plugin.getPlayerStorage().getTableInfo().getTableName()); + sql.append(" a ON actor_id = a.id"); + + CompiledStatement statement; + + try { + statement = connection.compileStatement(sql.toString(), StatementBuilder.StatementType.SELECT, null, + DatabaseConnection.DEFAULT_RESULT_FLAGS, false); + } catch (SQLException e) { + e.printStackTrace(); + getConnectionSource().releaseConnection(connection); + + plugin.getLogger().warning("Failed to retrieve ip mutes into memory"); + return; + } + + DatabaseResults results = null; + + try { + results = statement.runQuery(null); + + while (results.next()) { + PlayerData actor; + try { + actor = new PlayerData(UUIDUtils.fromBytes(results.getBytes(1)), results.getString(2), + IPUtils.toIPAddress(results.getBytes(3)), + results.getLong(4)); + } catch (NullPointerException | AddressValueException e) { + plugin.getLogger().warning("Missing or invalid player for ip mute " + results.getInt(0) + ", ignored"); + continue; + } + + IpMuteData mute = new IpMuteData(results.getInt(0), IPUtils.toIPAddress(results.getBytes(5)), actor, results.getString(6), + results.getBoolean(11), + results.getBoolean(7), + results.getLong(8), + results.getLong(9), + results.getLong(10)); + + mutes.put(mute.getIp().toString(), mute); + } + } catch (SQLException e) { + e.printStackTrace(); + } finally { + if (results != null) results.closeQuietly(); + + getConnectionSource().releaseConnection(connection); + } + } + + public ConcurrentHashMap getMutes() { + return mutes; + } + + public boolean isMuted(IPAddress ip) { + return mutes.get(ip.toString()) != null; + } + + public boolean isMuted(InetAddress address) { + return isMuted(IPUtils.toIPAddress(address)); + } + + public IpMuteData retrieveMute(IPAddress ip) throws SQLException { + List mutes = queryForEq("ip", ip); + + if (mutes.isEmpty()) return null; + + return mutes.get(0); + } + + public IpMuteData getMute(IPAddress ip) { + return mutes.get(ip.toString()); + } + + public IpMuteData getMute(InetAddress address) { + return getMute(IPUtils.toIPAddress(address)); + } + + public void addMute(IpMuteData mute) { + mutes.put(mute.getIp().toString(), mute); + + plugin.getServer().callEvent("IpMutedEvent", mute, mute.isSilent() || !plugin.getConfig().isBroadcastOnSync()); + } + + public void removeMute(IpMuteData mute) { + removeMute(mute.getIp()); + } + + public void removeMute(IPAddress ip) { + mutes.remove(ip); + } + + public boolean mute(IpMuteData mute) throws SQLException { + CommonEvent event = plugin.getServer().callEvent("IpMuteEvent", mute, mute.isSilent()); + + if (event.isCancelled()) { + return false; + } + + create(mute); + mutes.put(mute.getIp().toString(), mute); + + plugin.getServer().callEvent("IpMutedEvent", mute, event.isSilent()); + + return true; + } + + public boolean unmute(IpMuteData mute, PlayerData actor) throws SQLException { + return unmute(mute, actor, ""); + } + + public boolean unmute(IpMuteData mute, PlayerData actor, String reason) throws SQLException { + CommonEvent event = plugin.getServer().callEvent("IpUnmutedEvent", mute, actor, reason); + + if (event.isCancelled()) { + return false; + } + + delete(mute); + mutes.remove(mute.getIp().toString()); + + plugin.getIpMuteRecordStorage().addRecord(mute, actor, reason); + + return true; + } + + public CloseableIterator findMutes(long fromTime) throws SQLException { + if (fromTime == 0) { + return iterator(); + } + + long checkTime = fromTime + DateUtils.getTimeDiff(); + + QueryBuilder query = queryBuilder(); + Where where = query.where(); + where + .ge("created", checkTime) + .or() + .ge("updated", checkTime); + + query.setWhere(where); + + return query.iterator(); + + } + +} diff --git a/common/src/main/java/me/confuser/banmanager/common/storage/IpRangeBanRecordStorage.java b/common/src/main/java/me/confuser/banmanager/common/storage/IpRangeBanRecordStorage.java new file mode 100644 index 000000000..648bd8563 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/storage/IpRangeBanRecordStorage.java @@ -0,0 +1,90 @@ +package me.confuser.banmanager.common.storage; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.data.IpRangeBanData; +import me.confuser.banmanager.common.data.IpRangeBanRecord; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.ipaddr.IPAddress; +import me.confuser.banmanager.common.ormlite.dao.BaseDaoImpl; +import me.confuser.banmanager.common.ormlite.dao.CloseableIterator; +import me.confuser.banmanager.common.ormlite.field.SqlType; +import me.confuser.banmanager.common.ormlite.stmt.QueryBuilder; +import me.confuser.banmanager.common.ormlite.stmt.SelectArg; +import me.confuser.banmanager.common.ormlite.stmt.Where; +import me.confuser.banmanager.common.ormlite.support.ConnectionSource; +import me.confuser.banmanager.common.ormlite.table.DatabaseTableConfig; +import me.confuser.banmanager.common.ormlite.table.TableUtils; +import me.confuser.banmanager.common.util.DateUtils; +import me.confuser.banmanager.common.util.StorageUtils; + +import java.sql.SQLException; + +public class IpRangeBanRecordStorage extends BaseDaoImpl { + + public IpRangeBanRecordStorage(BanManagerPlugin plugin) throws SQLException { + super(plugin.getLocalConn(), (DatabaseTableConfig) plugin.getConfig().getLocalDb() + .getTable("ipRangeBanRecords")); + + if (!this.isTableExists()) { + TableUtils.createTable(connectionSource, tableConfig); + } else { + // Attempt to add new columns + try { + String update = "ALTER TABLE " + tableConfig.getTableName() + " ADD COLUMN `createdReason` VARCHAR(255)"; + executeRawNoArgs(update); + } catch (SQLException e) { + } + + StorageUtils.convertIpColumn(plugin, tableConfig.getTableName(), "fromIp"); + StorageUtils.convertIpColumn(plugin, tableConfig.getTableName(), "toIp"); + + try { + executeRawNoArgs("ALTER TABLE " + tableConfig.getTableName() + " ADD COLUMN `silent` TINYINT(1)"); + } catch (SQLException e) { + } + + try { + executeRawNoArgs("ALTER TABLE " + tableConfig.getTableName() + + " CHANGE `created` `created` BIGINT UNSIGNED," + + " CHANGE `pastCreated` `pastCreated` BIGINT UNSIGNED," + + " CHANGE `expired` `expired` BIGINT UNSIGNED" + ); + } catch (SQLException e) { + } + } + } + + public IpRangeBanRecordStorage(ConnectionSource connection, DatabaseTableConfig table) throws SQLException { + super(connection, (DatabaseTableConfig) table); + } + + public void addRecord(IpRangeBanData ban, PlayerData actor, String reason) throws SQLException { + create(new IpRangeBanRecord(ban, actor, reason)); + } + + public CloseableIterator findUnbans(long fromTime) throws SQLException { + if (fromTime == 0) { + return iterator(); + } + + long checkTime = fromTime + DateUtils.getTimeDiff(); + + QueryBuilder query = queryBuilder(); + Where where = query.where(); + + where.ge("created", checkTime); + + query.setWhere(where); + + return query.iterator(); + + } + + public long getCount(IPAddress ip) throws SQLException { + return queryBuilder().where().raw("? BETWEEN fromIp AND toIp", new SelectArg(SqlType.BYTE_ARRAY, ip.getBytes())).countOf(); + } + + public CloseableIterator getRecords(IPAddress ip) throws SQLException { + return queryBuilder().where().raw("? BETWEEN fromIp AND toIp", new SelectArg(SqlType.BYTE_ARRAY, ip.getBytes())).iterator(); + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/storage/IpRangeBanStorage.java b/common/src/main/java/me/confuser/banmanager/common/storage/IpRangeBanStorage.java new file mode 100644 index 000000000..8dd3df66f --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/storage/IpRangeBanStorage.java @@ -0,0 +1,276 @@ +package me.confuser.banmanager.common.storage; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.api.events.CommonEvent; +import me.confuser.banmanager.common.data.IpRangeBanData; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.google.guava.collect.Range; +import me.confuser.banmanager.common.google.guava.collect.TreeRangeSet; +import me.confuser.banmanager.common.ipaddr.AddressValueException; +import me.confuser.banmanager.common.ipaddr.IPAddress; +import me.confuser.banmanager.common.ormlite.dao.BaseDaoImpl; +import me.confuser.banmanager.common.ormlite.dao.CloseableIterator; +import me.confuser.banmanager.common.ormlite.stmt.QueryBuilder; +import me.confuser.banmanager.common.ormlite.stmt.StatementBuilder; +import me.confuser.banmanager.common.ormlite.stmt.Where; +import me.confuser.banmanager.common.ormlite.support.CompiledStatement; +import me.confuser.banmanager.common.ormlite.support.ConnectionSource; +import me.confuser.banmanager.common.ormlite.support.DatabaseConnection; +import me.confuser.banmanager.common.ormlite.support.DatabaseResults; +import me.confuser.banmanager.common.ormlite.table.DatabaseTableConfig; +import me.confuser.banmanager.common.ormlite.table.TableUtils; +import me.confuser.banmanager.common.util.DateUtils; +import me.confuser.banmanager.common.util.IPUtils; +import me.confuser.banmanager.common.util.StorageUtils; +import me.confuser.banmanager.common.util.UUIDUtils; + +import java.net.InetAddress; +import java.sql.SQLException; +import java.util.concurrent.ConcurrentHashMap; + +public class IpRangeBanStorage extends BaseDaoImpl { + + private BanManagerPlugin plugin; + private TreeRangeSet ranges = TreeRangeSet.create(); + private ConcurrentHashMap, IpRangeBanData> bans = new ConcurrentHashMap<>(); + + public IpRangeBanStorage(BanManagerPlugin plugin) throws SQLException { + super(plugin.getLocalConn(), (DatabaseTableConfig) plugin.getConfig().getLocalDb() + .getTable("ipRangeBans")); + + this.plugin = plugin; + + if (!this.isTableExists()) { + TableUtils.createTable(connectionSource, tableConfig); + return; + } else { + StorageUtils.convertIpColumn(plugin, tableConfig.getTableName(), "fromIp"); + StorageUtils.convertIpColumn(plugin, tableConfig.getTableName(), "toIp"); + + try { + executeRawNoArgs("ALTER TABLE " + tableConfig.getTableName() + " ADD COLUMN `silent` TINYINT(1)"); + } catch (SQLException e) { + } + + try { + executeRawNoArgs("ALTER TABLE " + tableConfig.getTableName() + + " CHANGE `created` `created` BIGINT UNSIGNED," + + " CHANGE `updated` `updated` BIGINT UNSIGNED," + + " CHANGE `expires` `expires` BIGINT UNSIGNED" + ); + } catch (SQLException e) { + } + } + + loadAll(); + + plugin.getLogger().info("Loaded " + bans.size() + " ip range bans into memory"); + } + + public IpRangeBanStorage(ConnectionSource connection, DatabaseTableConfig ipRangeBans) throws SQLException { + super(connection, (DatabaseTableConfig) ipRangeBans); + } + + private void loadAll() throws SQLException { + DatabaseConnection connection; + + try { + connection = this.getConnectionSource().getReadOnlyConnection(getTableName()); + } catch (SQLException e) { + e.printStackTrace(); + plugin.getLogger().warning("Failed to retrieve ip range bans into memory"); + return; + } + StringBuilder sql = new StringBuilder(); + + sql.append("SELECT t.id, a.id, a.name, a.ip, a.lastSeen, t.fromIp, t.toIp, t.reason,"); + sql.append(" t.expires, t.created, t.updated, t.silent"); + sql.append(" FROM "); + sql.append(this.getTableInfo().getTableName()); + sql.append(" t LEFT JOIN "); + sql.append(plugin.getPlayerStorage().getTableInfo().getTableName()); + sql.append(" a ON actor_id = a.id"); + + CompiledStatement statement; + + try { + statement = connection.compileStatement(sql.toString(), StatementBuilder.StatementType.SELECT, null, + DatabaseConnection.DEFAULT_RESULT_FLAGS, false); + } catch (SQLException e) { + e.printStackTrace(); + getConnectionSource().releaseConnection(connection); + + plugin.getLogger().warning("Failed to retrieve ip range bans into memory"); + return; + } + + DatabaseResults results = null; + + try { + results = statement.runQuery(null); + + while (results.next()) { + PlayerData actor; + try { + actor = new PlayerData(UUIDUtils.fromBytes(results.getBytes(1)), results.getString(2), + IPUtils.toIPAddress(results.getBytes(3)), + results.getLong(4)); + + } catch (NullPointerException | AddressValueException e) { + plugin.getLogger().warning("Missing or invalid actor for ip ban " + results.getInt(0) + ", ignored"); + continue; + } + + IpRangeBanData ban = new IpRangeBanData(results.getInt(0), + IPUtils.toIPAddress(results.getBytes(5)), + IPUtils.toIPAddress(results.getBytes(6)), + actor, + results.getString(7), + results.getBoolean(11), + results.getLong(8), + results.getLong(9), + results.getLong(10)); + + Range range = Range.closed(ban.getFromIp(), ban.getToIp()); + + bans.put(range, ban); + ranges.add(range); + } + } catch (SQLException e) { + e.printStackTrace(); + } finally { + if (results != null) results.closeQuietly(); + + getConnectionSource().releaseConnection(connection); + } + } + + public ConcurrentHashMap, IpRangeBanData> getBans() { + return bans; + } + + public boolean isBanned(IPAddress ip) { + return ranges.contains(ip); + } + + private Range getRange(IPAddress ip) { + return ranges.rangeContaining(ip); + } + + public boolean isBanned(Range range) { + return bans.get(range) != null; + } + + public boolean isBanned(IpRangeBanData ban) { + return isBanned(ban.getRange()); + } + + public boolean isBanned(InetAddress address) { + return isBanned(IPUtils.toIPAddress(address)); + } + + public IpRangeBanData retrieveBan(IPAddress fromIp, IPAddress toIp) throws SQLException { + QueryBuilder query = this.queryBuilder(); + Where where = queryBuilder().where(); + + where.eq("fromIp", fromIp).eq("toIp", toIp); + + query.setWhere(where); + + return query.queryForFirst(); + } + + public IpRangeBanData getBan(IPAddress ip) { + Range range = getRange(ip); + + if (range == null) return null; + + return bans.get(range); + } + + public IpRangeBanData getBan(Range range) { + return bans.get(range); + } + + public IpRangeBanData getBan(InetAddress address) { + return getBan(IPUtils.toIPAddress(address)); + } + + public void addBan(IpRangeBanData ban) { + Range range = Range.closed(ban.getFromIp(), ban.getToIp()); + + ranges.add(range); + bans.put(range, ban); + + plugin.getServer().callEvent("IpRangeBannedEvent", ban, ban.isSilent() || !plugin.getConfig().isBroadcastOnSync()); + } + + public void removeBan(IpRangeBanData ban) { + removeBan(ban.getRange()); + } + + public void removeBan(Range range) { + ranges.remove(range); + bans.remove(range); + } + + public boolean ban(IpRangeBanData ban) throws SQLException { + CommonEvent event = plugin.getServer().callEvent("IpRangeBanEvent", ban, ban.isSilent()); + + if (event.isCancelled()) { + return false; + } + + create(ban); + Range range = Range.closed(ban.getFromIp(), ban.getToIp()); + + bans.put(range, ban); + ranges.add(range); + + plugin.getServer().callEvent("IpRangeBannedEvent", ban, event.isSilent()); + + return true; + } + + public boolean unban(IpRangeBanData ban, PlayerData actor) throws SQLException { + return unban(ban, actor, ""); + } + + public boolean unban(IpRangeBanData ban, PlayerData actor, String reason) throws SQLException { + CommonEvent event = plugin.getServer().callEvent("IpRangeUnbanEvent", ban, actor, reason); + + if (event.isCancelled()) { + return false; + } + + delete(ban); + Range range = Range.closed(ban.getFromIp(), ban.getToIp()); + + bans.remove(range); + ranges.remove(range); + + plugin.getIpRangeBanRecordStorage().addRecord(ban, actor, reason); + + return true; + } + + public CloseableIterator findBans(long fromTime) throws SQLException { + if (fromTime == 0) { + return iterator(); + } + + long checkTime = fromTime + DateUtils.getTimeDiff(); + + QueryBuilder query = queryBuilder(); + Where where = query.where(); + where + .ge("created", checkTime) + .or() + .ge("updated", checkTime); + + query.setWhere(where); + + return query.iterator(); + + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/storage/NameBanRecordStorage.java b/common/src/main/java/me/confuser/banmanager/common/storage/NameBanRecordStorage.java new file mode 100644 index 000000000..2ed955215 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/storage/NameBanRecordStorage.java @@ -0,0 +1,65 @@ +package me.confuser.banmanager.common.storage; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.data.NameBanData; +import me.confuser.banmanager.common.data.NameBanRecord; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.ormlite.dao.BaseDaoImpl; +import me.confuser.banmanager.common.ormlite.dao.CloseableIterator; +import me.confuser.banmanager.common.ormlite.stmt.QueryBuilder; +import me.confuser.banmanager.common.ormlite.stmt.Where; +import me.confuser.banmanager.common.ormlite.support.ConnectionSource; +import me.confuser.banmanager.common.ormlite.table.DatabaseTableConfig; +import me.confuser.banmanager.common.ormlite.table.TableUtils; +import me.confuser.banmanager.common.util.DateUtils; + +import java.sql.SQLException; + +public class NameBanRecordStorage extends BaseDaoImpl { + + public NameBanRecordStorage(BanManagerPlugin plugin) throws SQLException { + super(plugin.getLocalConn(), (DatabaseTableConfig) plugin.getConfig() + .getLocalDb().getTable("nameBanRecords")); + + if (!this.isTableExists()) { + TableUtils.createTable(connectionSource, tableConfig); + return; + } else { + try { + executeRawNoArgs("ALTER TABLE " + tableConfig.getTableName() + + " CHANGE `created` `created` BIGINT UNSIGNED," + + " CHANGE `pastCreated` `pastCreated` BIGINT UNSIGNED," + + " CHANGE `expired` `expired` BIGINT UNSIGNED" + ); + } catch (SQLException e) { + } + } + } + + public NameBanRecordStorage(ConnectionSource connection, DatabaseTableConfig table) throws SQLException { + super(connection, (DatabaseTableConfig) table); + } + + public void addRecord(NameBanData ban, PlayerData actor, String reason) throws SQLException { + create(new NameBanRecord(ban, actor, reason)); + } + + public CloseableIterator findUnbans(long fromTime) throws SQLException { + if (fromTime == 0) { + return iterator(); + } + + long checkTime = fromTime + DateUtils.getTimeDiff(); + + QueryBuilder query = queryBuilder(); + Where where = query.where(); + + where.ge("created", checkTime); + + query.setWhere(where); + + + return query.iterator(); + + } +} diff --git a/src/main/java/me/confuser/banmanager/storage/NameBanStorage.java b/common/src/main/java/me/confuser/banmanager/common/storage/NameBanStorage.java similarity index 50% rename from src/main/java/me/confuser/banmanager/storage/NameBanStorage.java rename to common/src/main/java/me/confuser/banmanager/common/storage/NameBanStorage.java index 9eddb3ec4..922964bef 100644 --- a/src/main/java/me/confuser/banmanager/storage/NameBanStorage.java +++ b/common/src/main/java/me/confuser/banmanager/common/storage/NameBanStorage.java @@ -1,41 +1,56 @@ -package me.confuser.banmanager.storage; - -import com.j256.ormlite.dao.BaseDaoImpl; -import com.j256.ormlite.dao.CloseableIterator; -import com.j256.ormlite.stmt.QueryBuilder; -import com.j256.ormlite.stmt.StatementBuilder; -import com.j256.ormlite.stmt.Where; -import com.j256.ormlite.support.CompiledStatement; -import com.j256.ormlite.support.ConnectionSource; -import com.j256.ormlite.support.DatabaseConnection; -import com.j256.ormlite.support.DatabaseResults; -import com.j256.ormlite.table.DatabaseTableConfig; -import com.j256.ormlite.table.TableUtils; -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.NameBanData; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.events.NameBanEvent; -import me.confuser.banmanager.events.NameBannedEvent; -import me.confuser.banmanager.events.NameUnbanEvent; -import me.confuser.banmanager.util.DateUtils; -import me.confuser.banmanager.util.UUIDUtils; -import org.bukkit.Bukkit; +package me.confuser.banmanager.common.storage; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.api.events.CommonEvent; +import me.confuser.banmanager.common.data.NameBanData; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.ipaddr.AddressValueException; +import me.confuser.banmanager.common.ormlite.dao.BaseDaoImpl; +import me.confuser.banmanager.common.ormlite.dao.CloseableIterator; +import me.confuser.banmanager.common.ormlite.stmt.QueryBuilder; +import me.confuser.banmanager.common.ormlite.stmt.StatementBuilder; +import me.confuser.banmanager.common.ormlite.stmt.Where; +import me.confuser.banmanager.common.ormlite.support.CompiledStatement; +import me.confuser.banmanager.common.ormlite.support.ConnectionSource; +import me.confuser.banmanager.common.ormlite.support.DatabaseConnection; +import me.confuser.banmanager.common.ormlite.support.DatabaseResults; +import me.confuser.banmanager.common.ormlite.table.DatabaseTableConfig; +import me.confuser.banmanager.common.ormlite.table.TableUtils; +import me.confuser.banmanager.common.util.DateUtils; +import me.confuser.banmanager.common.util.IPUtils; +import me.confuser.banmanager.common.util.UUIDUtils; import java.sql.SQLException; import java.util.concurrent.ConcurrentHashMap; public class NameBanStorage extends BaseDaoImpl { - private BanManager plugin = BanManager.getPlugin(); + private BanManagerPlugin plugin; private ConcurrentHashMap bans = new ConcurrentHashMap<>(); - public NameBanStorage(ConnectionSource connection) throws SQLException { - super(connection, (DatabaseTableConfig) BanManager.getPlugin().getConfiguration().getLocalDb() - .getTable("nameBans")); + public NameBanStorage(BanManagerPlugin plugin) throws SQLException { + super(plugin.getLocalConn(), (DatabaseTableConfig) plugin.getConfig().getLocalDb() + .getTable("nameBans")); + + this.plugin = plugin; if (!this.isTableExists()) { - TableUtils.createTable(connection, tableConfig); + TableUtils.createTable(connectionSource, tableConfig); return; + } else { + try { + executeRawNoArgs("ALTER TABLE " + tableConfig.getTableName() + " ADD COLUMN `silent` TINYINT(1)"); + } catch (SQLException e) { + } + + try { + executeRawNoArgs("ALTER TABLE " + tableConfig.getTableName() + + " CHANGE `created` `created` BIGINT UNSIGNED," + + " CHANGE `updated` `updated` BIGINT UNSIGNED," + + " CHANGE `expires` `expires` BIGINT UNSIGNED" + ); + } catch (SQLException e) { + } } loadAll(); @@ -43,11 +58,15 @@ public NameBanStorage(ConnectionSource connection) throws SQLException { plugin.getLogger().info("Loaded " + bans.size() + " name bans into memory"); } - private void loadAll() { + public NameBanStorage(ConnectionSource connection, DatabaseTableConfig table) throws SQLException { + super(connection, (DatabaseTableConfig) table); + } + + private void loadAll() throws SQLException { DatabaseConnection connection; try { - connection = this.getConnectionSource().getReadOnlyConnection(); + connection = this.getConnectionSource().getReadOnlyConnection(getTableName()); } catch (SQLException e) { e.printStackTrace(); plugin.getLogger().warning("Failed to retrieve name bans into memory"); @@ -56,7 +75,7 @@ private void loadAll() { StringBuilder sql = new StringBuilder(); sql.append("SELECT t.id, t.name, a.id, a.name, a.ip, a.lastSeen, t.reason,"); - sql.append(" t.expires, t.created, t.updated"); + sql.append(" t.expires, t.created, t.updated, t.silent"); sql.append(" FROM "); sql.append(this.getTableInfo().getTableName()); sql.append(" t LEFT JOIN "); @@ -67,10 +86,10 @@ private void loadAll() { try { statement = connection.compileStatement(sql.toString(), StatementBuilder.StatementType.SELECT, null, - DatabaseConnection.DEFAULT_RESULT_FLAGS); + DatabaseConnection.DEFAULT_RESULT_FLAGS, false); } catch (SQLException e) { e.printStackTrace(); - connection.closeQuietly(); + getConnectionSource().releaseConnection(connection); plugin.getLogger().warning("Failed to retrieve name bans into memory"); return; @@ -86,15 +105,21 @@ private void loadAll() { try { actor = new PlayerData(UUIDUtils.fromBytes(results.getBytes(2)), results.getString(3), - results.getLong(4), - results.getLong(5)); - } catch (NullPointerException e) { - plugin.getLogger().warning("Missing actor for ban " + results.getInt(0) + ", ignored"); + IPUtils.toIPAddress(results.getBytes(4)), + results.getLong(5)); + } catch (NullPointerException | AddressValueException e) { + plugin.getLogger().warning("Missing or invalid actor for ban " + results.getInt(0) + ", ignored"); continue; } - NameBanData ban = new NameBanData(results.getInt(0), results.getString(1), actor, results.getString(6), results - .getLong(7), results.getLong(8), results.getLong(9)); + NameBanData ban = new NameBanData(results.getInt(0), + results.getString(1), + actor, + results.getString(6), + results.getBoolean(10), + results.getLong(7), + results.getLong(8), + results.getLong(9)); bans.put(ban.getName().toLowerCase(), ban); } @@ -103,7 +128,7 @@ private void loadAll() { } finally { if (results != null) results.closeQuietly(); - connection.closeQuietly(); + getConnectionSource().releaseConnection(connection); } } @@ -131,9 +156,8 @@ public NameBanData getBan(String playerName) { return bans.get(playerName.toLowerCase()); } - public boolean ban(NameBanData ban, boolean isSilent) throws SQLException { - NameBanEvent event = new NameBanEvent(ban, isSilent); - Bukkit.getServer().getPluginManager().callEvent(event); + public boolean ban(NameBanData ban) throws SQLException { + CommonEvent event = plugin.getServer().callEvent("NameBanEvent", ban, ban.isSilent()); if (event.isCancelled()) { return false; @@ -142,7 +166,7 @@ public boolean ban(NameBanData ban, boolean isSilent) throws SQLException { create(ban); bans.put(ban.getName().toLowerCase(), ban); - Bukkit.getServer().getPluginManager().callEvent(new NameBannedEvent(ban, event.isSilent())); + plugin.getServer().callEvent("NameBannedEvent", ban, event.isSilent()); return true; } @@ -156,8 +180,7 @@ public boolean unban(NameBanData ban, PlayerData actor, String reason) throws SQ } public boolean unban(NameBanData ban, PlayerData actor, String reason, boolean delete) throws SQLException { - NameUnbanEvent event = new NameUnbanEvent(ban, actor, reason); - Bukkit.getServer().getPluginManager().callEvent(event); + CommonEvent event = plugin.getServer().callEvent("NameUnbanEvent", ban, actor, reason); if (event.isCancelled()) { return false; @@ -181,9 +204,9 @@ public CloseableIterator findBans(long fromTime) throws SQLExceptio QueryBuilder query = queryBuilder(); Where where = query.where(); where - .ge("created", checkTime) - .or() - .ge("updated", checkTime); + .ge("created", checkTime) + .or() + .ge("updated", checkTime); query.setWhere(where); diff --git a/common/src/main/java/me/confuser/banmanager/common/storage/PlayerBanRecordStorage.java b/common/src/main/java/me/confuser/banmanager/common/storage/PlayerBanRecordStorage.java new file mode 100644 index 000000000..7938e51d8 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/storage/PlayerBanRecordStorage.java @@ -0,0 +1,100 @@ +package me.confuser.banmanager.common.storage; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.configs.CleanUp; +import me.confuser.banmanager.common.data.PlayerBanData; +import me.confuser.banmanager.common.data.PlayerBanRecord; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.ormlite.dao.BaseDaoImpl; +import me.confuser.banmanager.common.ormlite.dao.CloseableIterator; +import me.confuser.banmanager.common.ormlite.stmt.DeleteBuilder; +import me.confuser.banmanager.common.ormlite.stmt.QueryBuilder; +import me.confuser.banmanager.common.ormlite.stmt.Where; +import me.confuser.banmanager.common.ormlite.support.ConnectionSource; +import me.confuser.banmanager.common.ormlite.table.DatabaseTableConfig; +import me.confuser.banmanager.common.ormlite.table.TableUtils; +import me.confuser.banmanager.common.util.DateUtils; + +import java.sql.SQLException; + +public class PlayerBanRecordStorage extends BaseDaoImpl { + + public PlayerBanRecordStorage(BanManagerPlugin plugin) throws SQLException { + super(plugin.getLocalConn(), (DatabaseTableConfig) plugin.getConfig() + .getLocalDb() + .getTable("playerBanRecords")); + + if (!this.isTableExists()) { + TableUtils.createTable(connectionSource, tableConfig); + return; + } else { + // Attempt to add new columns + try { + executeRawNoArgs("ALTER TABLE " + tableConfig.getTableName() + " ADD COLUMN `createdReason` VARCHAR(255)"); + } catch (SQLException e) { + } + try { + executeRawNoArgs("ALTER TABLE " + tableConfig.getTableName() + " ADD COLUMN `silent` TINYINT(1)"); + } catch (SQLException e) { + } + + try { + executeRawNoArgs("ALTER TABLE " + tableConfig.getTableName() + + " CHANGE `created` `created` BIGINT UNSIGNED," + + " CHANGE `pastCreated` `pastCreated` BIGINT UNSIGNED," + + " CHANGE `expired` `expired` BIGINT UNSIGNED" + ); + } catch (SQLException e) { + } + } + } + + public PlayerBanRecordStorage(ConnectionSource connection, DatabaseTableConfig table) throws SQLException { + super(connection, (DatabaseTableConfig) table); + } + + public void addRecord(PlayerBanData ban, PlayerData actor, String reason) throws SQLException { + create(new PlayerBanRecord(ban, actor, reason)); + } + + public CloseableIterator findUnbans(long fromTime) throws SQLException { + if (fromTime == 0) { + return iterator(); + } + + long checkTime = fromTime + DateUtils.getTimeDiff(); + + QueryBuilder query = queryBuilder(); + Where where = query.where(); + + where.ge("created", checkTime); + + query.setWhere(where); + + + return query.iterator(); + + } + + public long getCount(PlayerData player) throws SQLException { + return queryBuilder().where().eq("player_id", player).countOf(); + } + + public CloseableIterator getRecords(PlayerData player) throws SQLException { + return queryBuilder().where().eq("player_id", player).iterator(); + } + + public void purge(CleanUp cleanup) throws SQLException { + if (cleanup.getDays() == 0) return; + + updateRaw("DELETE FROM " + getTableInfo().getTableName() + " WHERE created < UNIX_TIMESTAMP(CURRENT_TIMESTAMP - INTERVAL '" + cleanup.getDays() + "' DAY)"); + } + + public int deleteAll(PlayerData player) throws SQLException { + DeleteBuilder builder = deleteBuilder(); + + builder.where().eq("player_id", player); + + return builder.delete(); + } +} diff --git a/src/main/java/me/confuser/banmanager/storage/PlayerBanStorage.java b/common/src/main/java/me/confuser/banmanager/common/storage/PlayerBanStorage.java similarity index 55% rename from src/main/java/me/confuser/banmanager/storage/PlayerBanStorage.java rename to common/src/main/java/me/confuser/banmanager/common/storage/PlayerBanStorage.java index 8bdf16ce3..b29198898 100644 --- a/src/main/java/me/confuser/banmanager/storage/PlayerBanStorage.java +++ b/common/src/main/java/me/confuser/banmanager/common/storage/PlayerBanStorage.java @@ -1,25 +1,25 @@ -package me.confuser.banmanager.storage; - -import com.j256.ormlite.dao.BaseDaoImpl; -import com.j256.ormlite.dao.CloseableIterator; -import com.j256.ormlite.stmt.QueryBuilder; -import com.j256.ormlite.stmt.StatementBuilder; -import com.j256.ormlite.stmt.Where; -import com.j256.ormlite.support.CompiledStatement; -import com.j256.ormlite.support.ConnectionSource; -import com.j256.ormlite.support.DatabaseConnection; -import com.j256.ormlite.support.DatabaseResults; -import com.j256.ormlite.table.DatabaseTableConfig; -import com.j256.ormlite.table.TableUtils; -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.PlayerBanData; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.events.PlayerBanEvent; -import me.confuser.banmanager.events.PlayerBannedEvent; -import me.confuser.banmanager.events.PlayerUnbanEvent; -import me.confuser.banmanager.util.DateUtils; -import me.confuser.banmanager.util.UUIDUtils; -import org.bukkit.Bukkit; +package me.confuser.banmanager.common.storage; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.api.events.CommonEvent; +import me.confuser.banmanager.common.data.PlayerBanData; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.ipaddr.AddressValueException; +import me.confuser.banmanager.common.ipaddr.IPAddress; +import me.confuser.banmanager.common.ormlite.dao.BaseDaoImpl; +import me.confuser.banmanager.common.ormlite.dao.CloseableIterator; +import me.confuser.banmanager.common.ormlite.stmt.QueryBuilder; +import me.confuser.banmanager.common.ormlite.stmt.StatementBuilder; +import me.confuser.banmanager.common.ormlite.stmt.Where; +import me.confuser.banmanager.common.ormlite.support.CompiledStatement; +import me.confuser.banmanager.common.ormlite.support.ConnectionSource; +import me.confuser.banmanager.common.ormlite.support.DatabaseConnection; +import me.confuser.banmanager.common.ormlite.support.DatabaseResults; +import me.confuser.banmanager.common.ormlite.table.DatabaseTableConfig; +import me.confuser.banmanager.common.ormlite.table.TableUtils; +import me.confuser.banmanager.common.util.DateUtils; +import me.confuser.banmanager.common.util.IPUtils; +import me.confuser.banmanager.common.util.UUIDUtils; import java.sql.SQLException; import java.util.ArrayList; @@ -29,16 +29,32 @@ public class PlayerBanStorage extends BaseDaoImpl { - private BanManager plugin = BanManager.getPlugin(); + private BanManagerPlugin plugin; private ConcurrentHashMap bans = new ConcurrentHashMap<>(); - public PlayerBanStorage(ConnectionSource connection) throws SQLException { - super(connection, (DatabaseTableConfig) BanManager.getPlugin().getConfiguration().getLocalDb() - .getTable("playerBans")); + public PlayerBanStorage(BanManagerPlugin plugin) throws SQLException { + super(plugin.getLocalConn(), (DatabaseTableConfig) plugin.getConfig().getLocalDb() + .getTable("playerBans")); + + this.plugin = plugin; if (!this.isTableExists()) { - TableUtils.createTable(connection, tableConfig); + TableUtils.createTable(connectionSource, tableConfig); return; + } else { + try { + executeRawNoArgs("ALTER TABLE " + tableConfig.getTableName() + " ADD COLUMN `silent` TINYINT(1)"); + } catch (SQLException e) { + } + + try { + executeRawNoArgs("ALTER TABLE " + tableConfig.getTableName() + + " CHANGE `created` `created` BIGINT UNSIGNED," + + " CHANGE `updated` `updated` BIGINT UNSIGNED," + + " CHANGE `expires` `expires` BIGINT UNSIGNED" + ); + } catch (SQLException e) { + } } loadAll(); @@ -46,11 +62,15 @@ public PlayerBanStorage(ConnectionSource connection) throws SQLException { plugin.getLogger().info("Loaded " + bans.size() + " bans into memory"); } - private void loadAll(){ + public PlayerBanStorage(ConnectionSource connection, DatabaseTableConfig table) throws SQLException { + super(connection, (DatabaseTableConfig) table); + } + + private void loadAll() throws SQLException { DatabaseConnection connection; try { - connection = this.getConnectionSource().getReadOnlyConnection(); + connection = this.getConnectionSource().getReadOnlyConnection(getTableName()); } catch (SQLException e) { e.printStackTrace(); plugin.getLogger().warning("Failed to retrieve bans into memory"); @@ -59,7 +79,7 @@ private void loadAll(){ StringBuilder sql = new StringBuilder(); sql.append("SELECT t.id, p.id, p.name, p.ip, p.lastSeen, a.id, a.name, a.ip, a.lastSeen, t.reason,"); - sql.append(" t.expires, t.created, t.updated"); + sql.append(" t.expires, t.created, t.updated, t.silent"); sql.append(" FROM "); sql.append(this.getTableInfo().getTableName()); sql.append(" t LEFT JOIN "); @@ -73,10 +93,10 @@ private void loadAll(){ try { statement = connection.compileStatement(sql.toString(), StatementBuilder.StatementType.SELECT, null, - DatabaseConnection.DEFAULT_RESULT_FLAGS); + DatabaseConnection.DEFAULT_RESULT_FLAGS, false); } catch (SQLException e) { e.printStackTrace(); - connection.closeQuietly(); + this.getConnectionSource().releaseConnection(connection); plugin.getLogger().warning("Failed to retrieve bans into memory"); return; @@ -92,10 +112,10 @@ private void loadAll(){ try { player = new PlayerData(UUIDUtils.fromBytes(results.getBytes(1)), results.getString(2), - results.getLong(3), - results.getLong(4)); - } catch (NullPointerException e) { - plugin.getLogger().warning("Missing player for ban " + results.getInt(0) + ", ignored"); + IPUtils.toIPAddress(results.getBytes(3)), + results.getLong(4)); + } catch (NullPointerException | AddressValueException e) { + plugin.getLogger().warning("Missing or invalid player for ban " + results.getInt(0) + ", ignored"); continue; } @@ -103,15 +123,19 @@ private void loadAll(){ try { actor = new PlayerData(UUIDUtils.fromBytes(results.getBytes(5)), results.getString(6), - results.getLong(7), - results.getLong(8)); - } catch (NullPointerException e) { - plugin.getLogger().warning("Missing actor for ban " + results.getInt(0) + ", ignored"); + IPUtils.toIPAddress(results.getBytes(7)), + results.getLong(8)); + } catch (NullPointerException | AddressValueException e) { + plugin.getLogger().warning("Missing or invalid actor for ban " + results.getInt(0) + ", ignored"); continue; } - PlayerBanData ban = new PlayerBanData(results.getInt(0), player, actor, results.getString(9), results.getLong(10), - results.getLong(11), results.getLong(12)); + PlayerBanData ban = new PlayerBanData(results.getInt(0), player, actor, + results.getString(9), + results.getBoolean(13), + results.getLong(10), + results.getLong(11), + results.getLong(12)); bans.put(ban.getPlayer().getUUID(), ban); } @@ -120,7 +144,7 @@ private void loadAll(){ } finally { if (results != null) results.closeQuietly(); - connection.closeQuietly(); + this.getConnectionSource().releaseConnection(connection); } } @@ -151,9 +175,7 @@ public PlayerBanData getBan(UUID uuid) { public void addBan(PlayerBanData ban) { bans.put(ban.getPlayer().getUUID(), ban); - if (plugin.getConfiguration().isBroadcastOnSync()) { - Bukkit.getServer().getPluginManager().callEvent(new PlayerBannedEvent(ban, false)); - } + plugin.getServer().callEvent("PlayerBannedEvent", ban, ban.isSilent() || !plugin.getConfig().isBroadcastOnSync()); } public void removeBan(PlayerBanData ban) { @@ -174,9 +196,8 @@ public PlayerBanData getBan(String playerName) { return null; } - public boolean ban(PlayerBanData ban, boolean isSilent) throws SQLException { - PlayerBanEvent event = new PlayerBanEvent(ban, isSilent); - Bukkit.getServer().getPluginManager().callEvent(event); + public boolean ban(PlayerBanData ban) throws SQLException { + CommonEvent event = plugin.getServer().callEvent("PlayerBanEvent", ban, ban.isSilent()); if (event.isCancelled()) { return false; @@ -185,10 +206,11 @@ public boolean ban(PlayerBanData ban, boolean isSilent) throws SQLException { create(ban); bans.put(ban.getPlayer().getUUID(), ban); - Bukkit.getServer().getPluginManager().callEvent(new PlayerBannedEvent(ban, event.isSilent())); + plugin.getServer().callEvent("PlayerBannedEvent", ban, event.isSilent()); return true; } + public boolean unban(PlayerBanData ban, PlayerData actor) throws SQLException { return unban(ban, actor, ""); } @@ -198,8 +220,7 @@ public boolean unban(PlayerBanData ban, PlayerData actor, String reason) throws } public boolean unban(PlayerBanData ban, PlayerData actor, String reason, boolean delete) throws SQLException { - PlayerUnbanEvent event = new PlayerUnbanEvent(ban, actor, reason); - Bukkit.getServer().getPluginManager().callEvent(event); + CommonEvent event = plugin.getServer().callEvent("PlayerUnbanEvent", ban, actor, reason); if (event.isCancelled()) { return false; @@ -223,9 +244,9 @@ public CloseableIterator findBans(long fromTime) throws SQLExcept QueryBuilder query = queryBuilder(); Where where = query.where(); where - .ge("created", checkTime) - .or() - .ge("updated", checkTime); + .ge("created", checkTime) + .or() + .ge("updated", checkTime); query.setWhere(where); @@ -233,10 +254,10 @@ public CloseableIterator findBans(long fromTime) throws SQLExcept } - public List getDuplicates(long ip) { + public List getDuplicates(IPAddress ip) { ArrayList players = new ArrayList<>(); - if (plugin.getConfiguration().getBypassPlayerIps().contains(ip)) { + if (plugin.getConfig().getBypassPlayerIps().contains(ip.toString())) { return players; } @@ -266,7 +287,18 @@ public List getDuplicates(long ip) { } finally { if (itr != null) itr.closeQuietly(); } - + return players; } + + public boolean isRecentlyBanned(PlayerData player, long cooldown) throws SQLException { + if (cooldown == 0) { + return false; + } + + return queryBuilder().where() + .eq("player_id", player).and() + .ge("created", (System.currentTimeMillis() / 1000L) - cooldown) + .countOf() > 0; + } } diff --git a/common/src/main/java/me/confuser/banmanager/common/storage/PlayerHistoryStorage.java b/common/src/main/java/me/confuser/banmanager/common/storage/PlayerHistoryStorage.java new file mode 100644 index 000000000..fcfda99c0 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/storage/PlayerHistoryStorage.java @@ -0,0 +1,94 @@ +package me.confuser.banmanager.common.storage; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.configs.CleanUp; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.data.PlayerHistoryData; +import me.confuser.banmanager.common.ormlite.dao.BaseDaoImpl; +import me.confuser.banmanager.common.ormlite.dao.CloseableIterator; +import me.confuser.banmanager.common.ormlite.support.ConnectionSource; +import me.confuser.banmanager.common.ormlite.table.DatabaseTableConfig; +import me.confuser.banmanager.common.ormlite.table.TableUtils; +import me.confuser.banmanager.common.util.StorageUtils; + +import java.sql.SQLException; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; + +public class PlayerHistoryStorage extends BaseDaoImpl { + + private ConcurrentHashMap players = new ConcurrentHashMap<>(); + + public PlayerHistoryStorage(BanManagerPlugin plugin) throws SQLException { + super(plugin.getLocalConn(), (DatabaseTableConfig) plugin.getConfig() + .getLocalDb() + .getTable("playerHistory")); + + if (!this.isTableExists()) { + TableUtils.createTable(connectionSource, tableConfig); + } else { + try { + executeRawNoArgs("ALTER TABLE " + tableConfig.getTableName() + + " CHANGE `join` `join` BIGINT UNSIGNED," + + " CHANGE `leave` `leave` BIGINT UNSIGNED" + ); + } catch (SQLException e) { + } + + StorageUtils.convertIpColumn(plugin, tableConfig.getTableName(), "ip"); + } + } + + public PlayerHistoryStorage(ConnectionSource connection, DatabaseTableConfig table) throws SQLException { + super(connection, (DatabaseTableConfig) table); + } + + public void create(PlayerData player) { + players.put(player.getUUID(), new PlayerHistoryData(player)); + } + + public PlayerHistoryData remove(UUID uuid) { + return players.remove(uuid); + } + + public CloseableIterator getSince(PlayerData player, long since, int page) throws SQLException { + return queryBuilder().limit(10L).offset(10L * page) + .orderBy("join", false) + .where().ge("join", since).and().eq("player_id", player) + .iterator(); + } + + public void save() { + for (PlayerHistoryData data : players.values()) { + data.setLeave(System.currentTimeMillis() / 1000L); + + try { + create(data); + } catch (SQLException e) { + e.printStackTrace(); + break; // Don't slow down shut down if problems with the connection + } + } + } + + public void purge(CleanUp cleanup) throws SQLException { + if (cleanup.getDays() == 0) return; + + String banTable = BanManagerPlugin.getInstance().getIpBanStorage() + .getTableInfo() + .getTableName(); + + // H2 does not support DELETE FROM joins sadly + CloseableIterator results = queryRaw("SELECT ph.id FROM " + getTableInfo() + .getTableName() + " AS ph LEFT JOIN " + banTable + " b ON ph.ip = b.ip WHERE b.ip IS NULL AND ph.leave < " + + "UNIX_TIMESTAMP(CURRENT_TIMESTAMP - INTERVAL '" + cleanup.getDays() + "' DAY)").closeableIterator(); + + while (results.hasNext()) { + int id = Integer.parseInt(results.next()[0]); + + deleteById(id); + } + + results.closeQuietly(); + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/storage/PlayerKickStorage.java b/common/src/main/java/me/confuser/banmanager/common/storage/PlayerKickStorage.java new file mode 100644 index 000000000..2d1ed0bdf --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/storage/PlayerKickStorage.java @@ -0,0 +1,63 @@ +package me.confuser.banmanager.common.storage; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.configs.CleanUp; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.data.PlayerKickData; +import me.confuser.banmanager.common.ormlite.dao.BaseDaoImpl; +import me.confuser.banmanager.common.ormlite.stmt.DeleteBuilder; +import me.confuser.banmanager.common.ormlite.support.ConnectionSource; +import me.confuser.banmanager.common.ormlite.table.DatabaseTableConfig; +import me.confuser.banmanager.common.ormlite.table.TableUtils; + +import java.sql.SQLException; + +public class PlayerKickStorage extends BaseDaoImpl { + private BanManagerPlugin plugin; + + public PlayerKickStorage(BanManagerPlugin plugin) throws SQLException { + super(plugin.getLocalConn(), (DatabaseTableConfig) plugin.getConfig() + .getLocalDb().getTable("playerKicks")); + + this.plugin = plugin; + + if (!this.isTableExists()) { + TableUtils.createTable(connectionSource, tableConfig); + } else { + try { + executeRawNoArgs("ALTER TABLE " + tableConfig.getTableName() + " CHANGE `created` `created` BIGINT UNSIGNED"); + } catch (SQLException e) { + } + } + } + + public PlayerKickStorage(ConnectionSource connection, DatabaseTableConfig table) throws SQLException { + super(connection, (DatabaseTableConfig) table); + } + + public boolean addKick(PlayerKickData data, boolean isSilent) throws SQLException { + if (create(data) != 1) return false; + + plugin.getServer().callEvent("PlayerKickedEvent", data, isSilent); + + return true; + } + + public void purge(CleanUp cleanup) throws SQLException { + if (cleanup.getDays() == 0) return; + + updateRaw("DELETE FROM " + getTableInfo().getTableName() + " WHERE created < UNIX_TIMESTAMP(CURRENT_TIMESTAMP - INTERVAL '" + cleanup.getDays() + "' DAY)"); + } + + public long getCount(PlayerData player) throws SQLException { + return queryBuilder().where().eq("player_id", player).countOf(); + } + + public int deleteAll(PlayerData player) throws SQLException { + DeleteBuilder builder = deleteBuilder(); + + builder.where().eq("player_id", player); + + return builder.delete(); + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/storage/PlayerMuteRecordStorage.java b/common/src/main/java/me/confuser/banmanager/common/storage/PlayerMuteRecordStorage.java new file mode 100644 index 000000000..312a4c3b9 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/storage/PlayerMuteRecordStorage.java @@ -0,0 +1,101 @@ +package me.confuser.banmanager.common.storage; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.configs.CleanUp; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.data.PlayerMuteData; +import me.confuser.banmanager.common.data.PlayerMuteRecord; +import me.confuser.banmanager.common.ormlite.dao.BaseDaoImpl; +import me.confuser.banmanager.common.ormlite.dao.CloseableIterator; +import me.confuser.banmanager.common.ormlite.stmt.DeleteBuilder; +import me.confuser.banmanager.common.ormlite.stmt.QueryBuilder; +import me.confuser.banmanager.common.ormlite.stmt.Where; +import me.confuser.banmanager.common.ormlite.support.ConnectionSource; +import me.confuser.banmanager.common.ormlite.table.DatabaseTableConfig; +import me.confuser.banmanager.common.ormlite.table.TableUtils; +import me.confuser.banmanager.common.util.DateUtils; + +import java.sql.SQLException; + +public class PlayerMuteRecordStorage extends BaseDaoImpl { + + public PlayerMuteRecordStorage(BanManagerPlugin plugin) throws SQLException { + super(plugin.getLocalConn(), (DatabaseTableConfig) plugin.getConfig() + .getLocalDb() + .getTable("playerMuteRecords")); + + if (!this.isTableExists()) { + TableUtils.createTable(connectionSource, tableConfig); + } else { + // Attempt to add new columns + try { + String update = "ALTER TABLE " + tableConfig.getTableName() + " ADD COLUMN `createdReason` VARCHAR(255), " + + " ADD COLUMN `soft` TINYINT(1)," + + " ADD KEY `" + tableConfig.getTableName() + "_soft_idx` (`soft`)"; + executeRawNoArgs(update); + } catch (SQLException e) { + } + try { + executeRawNoArgs("ALTER TABLE " + tableConfig.getTableName() + " ADD COLUMN `silent` TINYINT(1)"); + } catch (SQLException e) { + } + + try { + executeRawNoArgs("ALTER TABLE " + tableConfig.getTableName() + + " CHANGE `created` `created` BIGINT UNSIGNED," + + " CHANGE `pastCreated` `pastCreated` BIGINT UNSIGNED," + + " CHANGE `expired` `expired` BIGINT UNSIGNED" + ); + } catch (SQLException e) { + } + } + } + + public PlayerMuteRecordStorage(ConnectionSource connection, DatabaseTableConfig table) throws SQLException { + super(connection, (DatabaseTableConfig) table); + } + + public void addRecord(PlayerMuteData mute, PlayerData actor, String reason) throws SQLException { + create(new PlayerMuteRecord(mute, actor, reason)); + } + + public CloseableIterator findUnmutes(long fromTime) throws SQLException { + if (fromTime == 0) { + return iterator(); + } + + long checkTime = fromTime + DateUtils.getTimeDiff(); + + QueryBuilder query = queryBuilder(); + Where where = query.where(); + + where.ge("created", checkTime); + + query.setWhere(where); + + return query.iterator(); + + } + + public long getCount(PlayerData player) throws SQLException { + return queryBuilder().where().eq("player_id", player).countOf(); + } + + public CloseableIterator getRecords(PlayerData player) throws SQLException { + return queryBuilder().where().eq("player_id", player).iterator(); + } + + public void purge(CleanUp cleanup) throws SQLException { + if (cleanup.getDays() == 0) return; + + updateRaw("DELETE FROM " + getTableInfo().getTableName() + " WHERE created < UNIX_TIMESTAMP(CURRENT_TIMESTAMP - INTERVAL '" + cleanup.getDays() + "' DAY)"); + } + + public int deleteAll(PlayerData player) throws SQLException { + DeleteBuilder builder = deleteBuilder(); + + builder.where().eq("player_id", player); + + return builder.delete(); + } +} diff --git a/src/main/java/me/confuser/banmanager/storage/PlayerMuteStorage.java b/common/src/main/java/me/confuser/banmanager/common/storage/PlayerMuteStorage.java similarity index 52% rename from src/main/java/me/confuser/banmanager/storage/PlayerMuteStorage.java rename to common/src/main/java/me/confuser/banmanager/common/storage/PlayerMuteStorage.java index 5e1a27573..0f0f07a39 100644 --- a/src/main/java/me/confuser/banmanager/storage/PlayerMuteStorage.java +++ b/common/src/main/java/me/confuser/banmanager/common/storage/PlayerMuteStorage.java @@ -1,26 +1,24 @@ -package me.confuser.banmanager.storage; - -import com.j256.ormlite.dao.BaseDaoImpl; -import com.j256.ormlite.dao.CloseableIterator; -import com.j256.ormlite.stmt.QueryBuilder; -import com.j256.ormlite.stmt.StatementBuilder; -import com.j256.ormlite.stmt.Where; -import com.j256.ormlite.support.CompiledStatement; -import com.j256.ormlite.support.ConnectionSource; -import com.j256.ormlite.support.DatabaseConnection; -import com.j256.ormlite.support.DatabaseResults; -import com.j256.ormlite.table.DatabaseTableConfig; -import com.j256.ormlite.table.TableUtils; -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.PlayerBanData; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.data.PlayerMuteData; -import me.confuser.banmanager.events.PlayerMuteEvent; -import me.confuser.banmanager.events.PlayerMutedEvent; -import me.confuser.banmanager.events.PlayerUnmuteEvent; -import me.confuser.banmanager.util.DateUtils; -import me.confuser.banmanager.util.UUIDUtils; -import org.bukkit.Bukkit; +package me.confuser.banmanager.common.storage; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.api.events.CommonEvent; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.data.PlayerMuteData; +import me.confuser.banmanager.common.ipaddr.AddressValueException; +import me.confuser.banmanager.common.ormlite.dao.BaseDaoImpl; +import me.confuser.banmanager.common.ormlite.dao.CloseableIterator; +import me.confuser.banmanager.common.ormlite.stmt.QueryBuilder; +import me.confuser.banmanager.common.ormlite.stmt.StatementBuilder; +import me.confuser.banmanager.common.ormlite.stmt.Where; +import me.confuser.banmanager.common.ormlite.support.CompiledStatement; +import me.confuser.banmanager.common.ormlite.support.ConnectionSource; +import me.confuser.banmanager.common.ormlite.support.DatabaseConnection; +import me.confuser.banmanager.common.ormlite.support.DatabaseResults; +import me.confuser.banmanager.common.ormlite.table.DatabaseTableConfig; +import me.confuser.banmanager.common.ormlite.table.TableUtils; +import me.confuser.banmanager.common.util.DateUtils; +import me.confuser.banmanager.common.util.IPUtils; +import me.confuser.banmanager.common.util.UUIDUtils; import java.sql.SQLException; import java.util.List; @@ -29,30 +27,44 @@ public class PlayerMuteStorage extends BaseDaoImpl { - private BanManager plugin = BanManager.getPlugin(); + private BanManagerPlugin plugin; private ConcurrentHashMap mutes = new ConcurrentHashMap<>(); - public PlayerMuteStorage(ConnectionSource connection) throws SQLException { - super(connection, (DatabaseTableConfig) BanManager.getPlugin().getConfiguration() - .getLocalDb().getTable("playerMutes")); + public PlayerMuteStorage(BanManagerPlugin plugin) throws SQLException { + super(plugin.getLocalConn(), (DatabaseTableConfig) plugin.getConfig() + .getLocalDb().getTable("playerMutes")); + this.plugin = plugin; if (!this.isTableExists()) { - TableUtils.createTable(connection, tableConfig); + TableUtils.createTable(connectionSource, tableConfig); } else { // Attempt to add new columns try { String update = "ALTER TABLE " + tableConfig - .getTableName() + " ADD COLUMN `soft` TINYINT(1)," + - " ADD KEY `" + tableConfig.getTableName() + "_soft_idx` (`soft`)"; + .getTableName() + " ADD COLUMN `soft` TINYINT(1)," + + " ADD KEY `" + tableConfig.getTableName() + "_soft_idx` (`soft`)"; executeRawNoArgs(update); } catch (SQLException e) { } try { String update = "ALTER TABLE " + tableConfig - .getTableName() + " ADD UNIQUE KEY `" + tableConfig.getTableName() + "_player_idx` (`player_id`)"; + .getTableName() + " ADD UNIQUE KEY `" + tableConfig.getTableName() + "_player_idx` (`player_id`)"; executeRawNoArgs(update); } catch (SQLException e) { } + try { + executeRawNoArgs("ALTER TABLE " + tableConfig.getTableName() + " ADD COLUMN `silent` TINYINT(1)"); + } catch (SQLException e) { + } + + try { + executeRawNoArgs("ALTER TABLE " + tableConfig.getTableName() + + " CHANGE `created` `created` BIGINT UNSIGNED," + + " CHANGE `updated` `updated` BIGINT UNSIGNED," + + " CHANGE `expires` `expires` BIGINT UNSIGNED" + ); + } catch (SQLException e) { + } } loadAll(); @@ -60,11 +72,15 @@ public PlayerMuteStorage(ConnectionSource connection) throws SQLException { plugin.getLogger().info("Loaded " + mutes.size() + " mutes into memory"); } - private void loadAll() { + public PlayerMuteStorage(ConnectionSource connection, DatabaseTableConfig table) throws SQLException { + super(connection, (DatabaseTableConfig) table); + } + + private void loadAll() throws SQLException { DatabaseConnection connection; try { - connection = this.getConnectionSource().getReadOnlyConnection(); + connection = this.getConnectionSource().getReadOnlyConnection(getTableName()); } catch (SQLException e) { e.printStackTrace(); plugin.getLogger().warning("Failed to retrieve mutes into memory"); @@ -73,7 +89,7 @@ private void loadAll() { StringBuilder sql = new StringBuilder(); sql.append("SELECT t.id, p.id, p.name, p.ip, p.lastSeen, a.id, a.name, a.ip, a.lastSeen, t.reason,"); - sql.append(" t.soft, t.expires, t.created, t.updated"); + sql.append(" t.soft, t.expires, t.created, t.updated, t.silent"); sql.append(" FROM "); sql.append(this.getTableInfo().getTableName()); sql.append(" t LEFT JOIN "); @@ -87,10 +103,10 @@ private void loadAll() { try { statement = connection.compileStatement(sql.toString(), StatementBuilder.StatementType.SELECT, null, - DatabaseConnection.DEFAULT_RESULT_FLAGS); + DatabaseConnection.DEFAULT_RESULT_FLAGS, false); } catch (SQLException e) { e.printStackTrace(); - connection.closeQuietly(); + getConnectionSource().releaseConnection(connection); plugin.getLogger().warning("Failed to retrieve mutes into memory"); return; @@ -106,10 +122,10 @@ private void loadAll() { try { player = new PlayerData(UUIDUtils.fromBytes(results.getBytes(1)), results.getString(2), - results.getLong(3), - results.getLong(4)); - } catch (NullPointerException e) { - plugin.getLogger().warning("Missing player for mute " + results.getInt(0) + ", ignored"); + IPUtils.toIPAddress(results.getBytes(3)), + results.getLong(4)); + } catch (NullPointerException | AddressValueException e) { + plugin.getLogger().warning("Missing or invalid player for mute " + results.getInt(0) + ", ignored"); continue; } @@ -117,15 +133,20 @@ private void loadAll() { try { actor = new PlayerData(UUIDUtils.fromBytes(results.getBytes(5)), results.getString(6), - results.getLong(7), - results.getLong(8)); - } catch (NullPointerException e) { - plugin.getLogger().warning("Missing actor for mute " + results.getInt(0) + ", ignored"); + IPUtils.toIPAddress(results.getBytes(7)), + results.getLong(8)); + } catch (NullPointerException | AddressValueException e) { + plugin.getLogger().warning("Missing or invalid actor for mute " + results.getInt(0) + ", ignored"); continue; } - PlayerMuteData mute = new PlayerMuteData(results.getInt(0), player, actor, results.getString(9), results.getBoolean(10), results.getLong(11), - results.getLong(12), results.getLong(13)); + PlayerMuteData mute = new PlayerMuteData(results.getInt(0), player, actor, + results.getString(9), + results.getBoolean(14), + results.getBoolean(10), + results.getLong(11), + results.getLong(12), + results.getLong(13)); mutes.put(mute.getPlayer().getUUID(), mute); } @@ -134,7 +155,7 @@ private void loadAll() { } finally { if (results != null) results.closeQuietly(); - connection.closeQuietly(); + getConnectionSource().releaseConnection(connection); } } @@ -181,14 +202,11 @@ public PlayerMuteData getMute(String playerName) { public void addMute(PlayerMuteData mute) { mutes.put(mute.getPlayer().getUUID(), mute); - if (plugin.getConfiguration().isBroadcastOnSync()) { - Bukkit.getServer().getPluginManager().callEvent(new PlayerMutedEvent(mute, false)); - } + plugin.getServer().callEvent("PlayerMutedEvent", mute, mute.isSilent() || !plugin.getConfig().isBroadcastOnSync()); } - public boolean mute(PlayerMuteData mute, boolean silent) throws SQLException { - PlayerMuteEvent event = new PlayerMuteEvent(mute, silent); - Bukkit.getServer().getPluginManager().callEvent(event); + public boolean mute(PlayerMuteData mute) throws SQLException { + CommonEvent event = plugin.getServer().callEvent("PlayerMuteEvent", mute, mute.isSilent()); if (event.isCancelled()) { return false; @@ -197,7 +215,7 @@ public boolean mute(PlayerMuteData mute, boolean silent) throws SQLException { create(mute); mutes.put(mute.getPlayer().getUUID(), mute); - Bukkit.getServer().getPluginManager().callEvent(new PlayerMutedEvent(mute, event.isSilent())); + plugin.getServer().callEvent("PlayerMutedEvent", mute, event.isSilent()); return true; } @@ -219,8 +237,7 @@ public boolean unmute(PlayerMuteData mute, PlayerData actor, String reason) thro } public boolean unmute(PlayerMuteData mute, PlayerData actor, String reason, boolean delete) throws SQLException { - PlayerUnmuteEvent event = new PlayerUnmuteEvent(mute, actor, reason); - Bukkit.getServer().getPluginManager().callEvent(event); + CommonEvent event = plugin.getServer().callEvent("PlayerUnmuteEvent", mute, actor, reason); if (event.isCancelled()) { return false; @@ -244,12 +261,23 @@ public CloseableIterator findMutes(long fromTime) throws SQLExce QueryBuilder query = queryBuilder(); Where where = query.where(); where - .ge("created", checkTime) - .or() - .ge("updated", checkTime); + .ge("created", checkTime) + .or() + .ge("updated", checkTime); query.setWhere(where); return query.iterator(); } + + public boolean isRecentlyMuted(PlayerData player, long cooldown) throws SQLException { + if (cooldown == 0) { + return false; + } + + return queryBuilder().where() + .eq("player_id", player).and() + .ge("created", (System.currentTimeMillis() / 1000L) - cooldown) + .countOf() > 0; + } } diff --git a/common/src/main/java/me/confuser/banmanager/common/storage/PlayerNoteStorage.java b/common/src/main/java/me/confuser/banmanager/common/storage/PlayerNoteStorage.java new file mode 100644 index 000000000..c504492b9 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/storage/PlayerNoteStorage.java @@ -0,0 +1,63 @@ +package me.confuser.banmanager.common.storage; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.api.events.CommonEvent; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.data.PlayerNoteData; +import me.confuser.banmanager.common.ormlite.dao.BaseDaoImpl; +import me.confuser.banmanager.common.ormlite.dao.CloseableIterator; +import me.confuser.banmanager.common.ormlite.stmt.DeleteBuilder; +import me.confuser.banmanager.common.ormlite.support.ConnectionSource; +import me.confuser.banmanager.common.ormlite.table.DatabaseTableConfig; +import me.confuser.banmanager.common.ormlite.table.TableUtils; +import me.confuser.banmanager.common.util.UUIDUtils; + +import java.sql.SQLException; +import java.util.UUID; + +public class PlayerNoteStorage extends BaseDaoImpl { + + private BanManagerPlugin plugin; + + public PlayerNoteStorage(BanManagerPlugin plugin) throws SQLException { + super(plugin.getLocalConn(), (DatabaseTableConfig) plugin.getConfig() + .getLocalDb().getTable("playerNotes")); + + this.plugin = plugin; + + if (!this.isTableExists()) { + TableUtils.createTable(connectionSource, tableConfig); + } else { + try { + executeRawNoArgs("ALTER TABLE " + tableConfig.getTableName() + " CHANGE `created` `created` BIGINT UNSIGNED"); + } catch (SQLException e) { + } + } + } + + public PlayerNoteStorage(ConnectionSource connection, DatabaseTableConfig playerNotes) throws SQLException { + super(connection, (DatabaseTableConfig) playerNotes); + } + + public boolean addNote(PlayerNoteData data) throws SQLException { + CommonEvent event = plugin.getServer().callEvent("PlayerNoteCreatedEvent", data); + + return !event.isCancelled() && create(data) == 1; + } + + public CloseableIterator getNotes(UUID uniqueId) throws SQLException { + return queryBuilder().where().eq("player_id", UUIDUtils.toBytes(uniqueId)).iterator(); + } + + public int deleteAll(PlayerData player) throws SQLException { + DeleteBuilder builder = deleteBuilder(); + + builder.where().eq("player_id", player); + + return builder.delete(); + } + + public long getCount(PlayerData player) throws SQLException { + return queryBuilder().where().eq("player_id", player).countOf(); + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/storage/PlayerReportCommandStorage.java b/common/src/main/java/me/confuser/banmanager/common/storage/PlayerReportCommandStorage.java new file mode 100644 index 000000000..9a133df7b --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/storage/PlayerReportCommandStorage.java @@ -0,0 +1,40 @@ +package me.confuser.banmanager.common.storage; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.data.PlayerReportCommandData; +import me.confuser.banmanager.common.ormlite.dao.BaseDaoImpl; +import me.confuser.banmanager.common.ormlite.support.ConnectionSource; +import me.confuser.banmanager.common.ormlite.table.DatabaseTableConfig; +import me.confuser.banmanager.common.ormlite.table.TableUtils; + +import java.sql.SQLException; + +public class PlayerReportCommandStorage extends BaseDaoImpl { + + public PlayerReportCommandStorage(BanManagerPlugin plugin) throws SQLException { + super(plugin.getLocalConn(), (DatabaseTableConfig) plugin.getConfig() + .getLocalDb() + .getTable("playerReportCommands")); + + if (!this.isTableExists()) { + TableUtils.createTable(connectionSource, tableConfig); + } else { + try { + executeRawNoArgs("ALTER TABLE " + tableConfig.getTableName() + + " CHANGE `created` `created` BIGINT UNSIGNED," + + " CHANGE `updated` `updated` BIGINT UNSIGNED" + ); + } catch (SQLException e) { + } + } + } + + public PlayerReportCommandStorage(ConnectionSource connection, DatabaseTableConfig table) throws SQLException { + super(connection, (DatabaseTableConfig) table); + } + + public PlayerReportCommandData getByReportId(int id) throws SQLException { + return queryBuilder().where().eq("report_id", id).queryForFirst(); + } + +} diff --git a/common/src/main/java/me/confuser/banmanager/common/storage/PlayerReportCommentStorage.java b/common/src/main/java/me/confuser/banmanager/common/storage/PlayerReportCommentStorage.java new file mode 100644 index 000000000..165650f0f --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/storage/PlayerReportCommentStorage.java @@ -0,0 +1,40 @@ +package me.confuser.banmanager.common.storage; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.data.PlayerReportCommentData; +import me.confuser.banmanager.common.ormlite.dao.BaseDaoImpl; +import me.confuser.banmanager.common.ormlite.support.ConnectionSource; +import me.confuser.banmanager.common.ormlite.table.DatabaseTableConfig; +import me.confuser.banmanager.common.ormlite.table.TableUtils; + +import java.sql.SQLException; + +public class PlayerReportCommentStorage extends BaseDaoImpl { + + public PlayerReportCommentStorage(BanManagerPlugin plugin) throws SQLException { + super(plugin.getLocalConn(), (DatabaseTableConfig) plugin.getConfig() + .getLocalDb() + .getTable("playerReportComments")); + + if (!this.isTableExists()) { + TableUtils.createTable(connectionSource, tableConfig); + } else { + try { + executeRawNoArgs("ALTER TABLE " + tableConfig.getTableName() + + " CHANGE `created` `created` BIGINT UNSIGNED," + + " CHANGE `updated` `updated` BIGINT UNSIGNED" + ); + } catch (SQLException e) { + } + } + } + + public PlayerReportCommentStorage(ConnectionSource connection, DatabaseTableConfig table) throws SQLException { + super(connection, (DatabaseTableConfig) table); + } + + public PlayerReportCommentData getByReportId(int id) throws SQLException { + return queryBuilder().where().eq("report_id", id).queryForFirst(); + } + +} diff --git a/common/src/main/java/me/confuser/banmanager/common/storage/PlayerReportLocationStorage.java b/common/src/main/java/me/confuser/banmanager/common/storage/PlayerReportLocationStorage.java new file mode 100644 index 000000000..4eae06396 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/storage/PlayerReportLocationStorage.java @@ -0,0 +1,38 @@ +package me.confuser.banmanager.common.storage; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.data.PlayerReportData; +import me.confuser.banmanager.common.data.PlayerReportLocationData; +import me.confuser.banmanager.common.ormlite.dao.BaseDaoImpl; +import me.confuser.banmanager.common.ormlite.support.ConnectionSource; +import me.confuser.banmanager.common.ormlite.table.DatabaseTableConfig; +import me.confuser.banmanager.common.ormlite.table.TableUtils; + +import java.sql.SQLException; +import java.util.List; + +public class PlayerReportLocationStorage extends BaseDaoImpl { + + public PlayerReportLocationStorage(BanManagerPlugin plugin) throws SQLException { + super(plugin.getLocalConn(), (DatabaseTableConfig) plugin.getConfig() + .getLocalDb() + .getTable("playerReportLocations")); + + if (!this.isTableExists()) { + TableUtils.createTable(connectionSource, tableConfig); + } + } + + public PlayerReportLocationStorage(ConnectionSource connection, DatabaseTableConfig table) throws SQLException { + super(connection, (DatabaseTableConfig) table); + } + + public PlayerReportLocationData getByReportId(int id) throws SQLException { + return queryBuilder().where().eq("report_id", id).queryForFirst(); + } + + public List getByReport(PlayerReportData data) throws SQLException { + return queryBuilder().where().eq("report_id", data.getId()).query(); + } + +} diff --git a/common/src/main/java/me/confuser/banmanager/common/storage/PlayerReportStorage.java b/common/src/main/java/me/confuser/banmanager/common/storage/PlayerReportStorage.java new file mode 100644 index 000000000..ec09548cf --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/storage/PlayerReportStorage.java @@ -0,0 +1,157 @@ +package me.confuser.banmanager.common.storage; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.api.events.CommonEvent; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.data.PlayerReportData; +import me.confuser.banmanager.common.ormlite.dao.BaseDaoImpl; +import me.confuser.banmanager.common.ormlite.stmt.QueryBuilder; +import me.confuser.banmanager.common.ormlite.stmt.Where; +import me.confuser.banmanager.common.ormlite.support.ConnectionSource; +import me.confuser.banmanager.common.ormlite.table.DatabaseTableConfig; +import me.confuser.banmanager.common.ormlite.table.TableUtils; +import me.confuser.banmanager.common.util.ReportList; +import me.confuser.banmanager.common.util.UUIDUtils; + +import java.sql.SQLException; +import java.util.Collection; +import java.util.List; +import java.util.UUID; + +public class PlayerReportStorage extends BaseDaoImpl { + + private BanManagerPlugin plugin; + + public PlayerReportStorage(BanManagerPlugin plugin) throws SQLException { + super(plugin.getLocalConn(), (DatabaseTableConfig) plugin.getConfig() + .getLocalDb().getTable("playerReports")); + + this.plugin = plugin; + + if (!this.isTableExists()) { + TableUtils.createTable(connectionSource, tableConfig); + } else { + try { + String update = "ALTER TABLE " + tableConfig + .getTableName() + " ADD COLUMN `state_id` INT(11) NOT NULL DEFAULT 1," + + " ADD COLUMN `assignee_id` BINARY(16)," + + " ADD KEY `" + tableConfig.getTableName() + "_state_id_idx` (`state_id`)," + + " ADD KEY `" + tableConfig.getTableName() + "_assignee_id_idx` (`assignee_id`)"; + executeRawNoArgs(update); + } catch (SQLException e) { + } + try { + String update = "ALTER TABLE " + tableConfig.getTableName() + " MODIFY assignee_id BINARY(16) NULL"; + executeRawNoArgs(update); + } catch (SQLException e) { + } + + try { + executeRawNoArgs("ALTER TABLE " + tableConfig.getTableName() + + " CHANGE `created` `created` BIGINT UNSIGNED," + + " CHANGE `updated` `updated` BIGINT UNSIGNED" + ); + } catch (SQLException e) { + } + } + } + + public PlayerReportStorage(ConnectionSource connection, DatabaseTableConfig table) throws SQLException { + super(connection, (DatabaseTableConfig) table); + } + + public boolean report(PlayerReportData data, boolean isSilent) throws SQLException { + CommonEvent event = plugin.getServer().callEvent("PlayerReportEvent", data, isSilent); + + if (event.isCancelled()) { + return false; + } + + if (create(data) != 1) return false; + + plugin.getServer().callEvent("PlayerReportedEvent", data, isSilent); + + return true; + } + + public ReportList getReports(long page, Integer state, UUID uniqueId) throws SQLException { + QueryBuilder query = queryBuilder(); + Where where = null; + + if (state != null || uniqueId != null) { + where = query.where(); + + if (state != null) where.eq("state_id", state); + if (state != null && uniqueId != null) where.and(); + if (uniqueId != null) where.eq("actor_id", UUIDUtils.toBytes(uniqueId)); + } + + long pageSize = 5L; + long count = query.countOf(); + long maxPage = count == 0 ? 1 : (int) Math.ceil((double) count / pageSize); + + if (maxPage == 0) maxPage = 1; + + long offset = (page - 1) * pageSize; + + query.reset(); + query.orderBy("created", false).offset(offset).limit(pageSize); + + if (where != null) query.setWhere(where); + + return new ReportList(query.query(), count, maxPage); + } + + public ReportList getReports(long page, int state) throws SQLException { + return getReports(page, state, null); + } + + public int deleteAll(PlayerData player) throws SQLException { + List reports = queryForEq("player_id", player); + + for (PlayerReportData report : reports) { + deleteById(report.getId()); + } + + return reports.size(); + } + + public boolean isRecentlyReported(PlayerData player, long cooldown) throws SQLException { + if (cooldown == 0) { + return false; + } + + return queryBuilder().where() + .eq("player_id", player).and() + .ge("created", (System.currentTimeMillis() / 1000L) - cooldown) + .countOf() > 0; + } + + public int deleteById(Integer id) throws SQLException { + PlayerReportData report = queryForId(id); + + if (report == null) return 0; + + plugin.getServer().callEvent("PlayerReportDeletedEvent", report); + + super.deleteById(id); + + return 1; + } + + public int deleteIds(Collection ids) throws SQLException { + if (ids == null || ids.isEmpty()) return 0; + + int count = 0; + + for (Integer id : ids) { + if (deleteById(id) != 0) count++; + } + + return count; + } + + public long getCount(PlayerData player) throws SQLException { + return queryBuilder().where().eq("player_id", player).countOf(); + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/storage/PlayerStorage.java b/common/src/main/java/me/confuser/banmanager/common/storage/PlayerStorage.java new file mode 100644 index 000000000..a699652db --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/storage/PlayerStorage.java @@ -0,0 +1,298 @@ +package me.confuser.banmanager.common.storage; + +import lombok.Getter; +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.google.concurrenttrees.radix.ConcurrentRadixTree; +import me.confuser.banmanager.common.google.concurrenttrees.radix.RadixTree; +import me.confuser.banmanager.common.google.concurrenttrees.radix.node.concrete.SmartArrayBasedNodeFactory; +import me.confuser.banmanager.common.google.concurrenttrees.radix.node.concrete.voidvalue.VoidValue; +import me.confuser.banmanager.common.ipaddr.IPAddress; +import me.confuser.banmanager.common.ormlite.dao.BaseDaoImpl; +import me.confuser.banmanager.common.ormlite.dao.CloseableIterator; +import me.confuser.banmanager.common.ormlite.stmt.QueryBuilder; +import me.confuser.banmanager.common.ormlite.stmt.SelectArg; +import me.confuser.banmanager.common.ormlite.stmt.Where; +import me.confuser.banmanager.common.ormlite.support.ConnectionSource; +import me.confuser.banmanager.common.ormlite.table.DatabaseTableConfig; +import me.confuser.banmanager.common.ormlite.table.TableUtils; +import me.confuser.banmanager.common.util.StorageUtils; +import me.confuser.banmanager.common.util.UUIDProfile; +import me.confuser.banmanager.common.util.UUIDUtils; + +import java.sql.SQLException; +import java.util.*; + +public class PlayerStorage extends BaseDaoImpl { + + @Getter + private BanManagerPlugin plugin; + + @Getter + private RadixTree autoCompleteTree; + + @Getter + private PlayerData console; + + public PlayerStorage(BanManagerPlugin plugin) throws SQLException { + super(plugin.getLocalConn(), (DatabaseTableConfig) plugin.getConfig().getLocalDb() + .getTable("players")); + + this.plugin = plugin; + + if (!isTableExists()) { + TableUtils.createTable(connectionSource, tableConfig); + } else { + try { + executeRawNoArgs("ALTER TABLE " + tableConfig.getTableName() + " CHANGE `lastSeen` `lastSeen` BIGINT UNSIGNED"); + } catch (SQLException e) { + } + + StorageUtils.convertIpColumn(plugin, tableConfig.getTableName(), "ip", "bytes"); + } + + setupConsole(); + + if (plugin.getConfig().isOfflineAutoComplete()) { + // @TODO run in a separate thread to speed up start up + setupAutoComplete(); + } + } + + public PlayerStorage(ConnectionSource connection, DatabaseTableConfig table) throws SQLException { + super(connection, (DatabaseTableConfig) table); + } + + public void setupConsole() throws SQLException { + // Get the console + String name = plugin.getConsoleConfig().getName(); + UUID uuid = plugin.getConsoleConfig().getUuid(); + + console = queryForId(UUIDUtils.toBytes(uuid)); + + if (console == null) { + // Create it + console = new PlayerData(uuid, name); + create(console); + } else if (!console.getName().equals(name)) { + console.setName(name); + plugin.getLogger().info("Console name change detected, updating database"); + + // Confirm player with name does not already exist + PlayerData data = retrieve(name, false); + + if (data != null && data.getName().equals(name)) { + plugin.getLogger().severe("Unable to update Console name as a player already exists with this name"); + } else { + update(console); + } + } + } + + public void setupAutoComplete() { + autoCompleteTree = new ConcurrentRadixTree<>(new SmartArrayBasedNodeFactory()); + CloseableIterator itr = null; + + try { + itr = this.queryBuilder().selectColumns("name").iterator(); + + while (itr.hasNext()) { + autoCompleteTree.put(itr.next().getName(), VoidValue.SINGLETON); + } + } catch (SQLException e) { + e.printStackTrace(); + } finally { + if (itr != null) itr.closeQuietly(); + } + + } + + public CreateOrUpdateStatus upsert(PlayerData data) throws SQLException { + if(data == null) return new CreateOrUpdateStatus(false, false, 0); + + PlayerData existingData = queryForSameId(data); + if(existingData == null) { + int rows = create(data); + + if(plugin.getConfig().isOfflineAutoComplete()) { + autoCompleteTree.put(data.getName(), VoidValue.SINGLETON); + } + + return new CreateOrUpdateStatus(true, false, rows); + } + + int rows = update(data); + + if(plugin.getConfig().isOfflineAutoComplete()) { + autoCompleteTree.remove(existingData.getName()); + autoCompleteTree.put(data.getName(), VoidValue.SINGLETON); + } + + return new CreateOrUpdateStatus(false, true, rows); + } + + @Override + public CreateOrUpdateStatus createOrUpdate(PlayerData data) throws SQLException { + CreateOrUpdateStatus status = upsert(data); + + // Check for duplicates + List results = queryForEq("name", new SelectArg(data.getName())); + if (results.size() == 1) return status; + + if (!plugin.getConfig().isOnlineMode()) { + plugin.getLogger() + .warning("Duplicates found for " + data.getName() + ", as you are in offline mode, please fix manually https://banmanagement.com/faq#duplicate-issues"); + return status; + } + + // Duplicates found! + for (PlayerData player : results) { + if (player.getUUID().equals(data.getUUID())) continue; + + String newName; + + try { + newName = UUIDUtils.getCurrentName(plugin, player.getUUID()); + } catch (Exception e) { + plugin.getLogger() + .warning("Duplicates found for " + data.getName() + ", unable to contact Mojang for updated names https://banmanagement.com/faq#duplicate-issues"); + continue; + } + + if (newName == null || newName.isEmpty() || player.getName().equals(newName)) continue; + + player.setName(newName); + update(player); + } + + return status; + } + + public PlayerData createIfNotExists(UUID uuid, String name) throws SQLException { + PlayerData player = queryForId(UUIDUtils.toBytes(uuid)); + + if (player != null) return player; + + player = new PlayerData(uuid, name); + create(player); + + if (plugin.getConfig().isOfflineAutoComplete()) autoCompleteTree.put(name, VoidValue.SINGLETON); + + return player; + } + + public PlayerData retrieve(String name, boolean mojangLookup) { + + try { + List results = queryForEq("name", new SelectArg(name)); + if (results.size() == 1) { + return results.get(0); + } + } catch (SQLException e) { + e.printStackTrace(); + } + + if (!mojangLookup) { + return null; + } + + // UUID Lookup :( + try { + UUIDProfile player = UUIDUtils.getUUIDOf(plugin, name); + if (player == null) { + return null; + } + + // Lets store for caching + PlayerData data = new PlayerData(player.getUuid(), player.getName()); + + upsert(data); + + return data; + } catch (Exception e) { + e.printStackTrace(); + } + + return null; + } + + public List retrieve(String name) { + try { + return queryForEq("name", new SelectArg(name)); + } catch (SQLException e) { + e.printStackTrace(); + } + + return null; + } + + public HashMap>> getDuplicateNames() { + HashMap>> duplicates = new HashMap<>(); + CloseableIterator itr = null; + + try { + itr = queryRaw("SELECT name, COUNT(name) FROM " + getTableName() + " GROUP BY name HAVING COUNT(name) > 1 ORDER BY name ASC LIMIT 10").closeableIterator(); + + while (itr.hasNext()) { + String[] values = itr.next(); + + List results = queryForEq("name", new SelectArg(values[0])); + + duplicates.put(values[0], new AbstractMap.SimpleEntry(Integer.parseInt(values[1]), results)); + } + } catch (SQLException e) { + e.printStackTrace(); + } finally { + if (itr != null) itr.closeQuietly(); + } + + return duplicates; + } + + public List getDuplicatesInTime(IPAddress ip, long timeDiff) { + ArrayList players = new ArrayList<>(); + + if (plugin.getConfig().getBypassPlayerIps().contains(ip.toString())) { + return players; + } + + QueryBuilder query = queryBuilder(); + try { + query.leftJoin(plugin.getPlayerBanStorage().queryBuilder()); + + Where where = query.where(); + + where.eq("ip", ip); + + if (timeDiff != 0) { + long currentTime = System.currentTimeMillis() / 1000L; + + where.and().ge("lastSeen", (currentTime - timeDiff)); + } + + query.setWhere(where); + } catch (SQLException e) { + e.printStackTrace(); + return players; + } + + + CloseableIterator itr = null; + try { + itr = query.limit(300L).iterator(); + + while (itr.hasNext()) { + PlayerData player = itr.next(); + + if (!plugin.getExemptionsConfig().isExempt(player, "alts")) players.add(player); + } + + } catch (SQLException e) { + e.printStackTrace(); + } finally { + if (itr != null) itr.closeQuietly(); + } + + return players; + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/storage/PlayerWarnStorage.java b/common/src/main/java/me/confuser/banmanager/common/storage/PlayerWarnStorage.java new file mode 100644 index 000000000..4e2bc760f --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/storage/PlayerWarnStorage.java @@ -0,0 +1,215 @@ +package me.confuser.banmanager.common.storage; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.api.events.CommonEvent; +import me.confuser.banmanager.common.configs.CleanUp; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.data.PlayerWarnData; +import me.confuser.banmanager.common.google.guava.cache.Cache; +import me.confuser.banmanager.common.google.guava.cache.CacheBuilder; +import me.confuser.banmanager.common.ormlite.dao.BaseDaoImpl; +import me.confuser.banmanager.common.ormlite.dao.CloseableIterator; +import me.confuser.banmanager.common.ormlite.field.SqlType; +import me.confuser.banmanager.common.ormlite.stmt.DeleteBuilder; +import me.confuser.banmanager.common.ormlite.stmt.QueryBuilder; +import me.confuser.banmanager.common.ormlite.stmt.StatementBuilder; +import me.confuser.banmanager.common.ormlite.stmt.Where; +import me.confuser.banmanager.common.ormlite.support.CompiledStatement; +import me.confuser.banmanager.common.ormlite.support.ConnectionSource; +import me.confuser.banmanager.common.ormlite.support.DatabaseConnection; +import me.confuser.banmanager.common.ormlite.support.DatabaseResults; +import me.confuser.banmanager.common.ormlite.table.DatabaseTableConfig; +import me.confuser.banmanager.common.ormlite.table.TableUtils; +import me.confuser.banmanager.common.util.DateUtils; +import me.confuser.banmanager.common.util.UUIDUtils; + +import java.io.IOException; +import java.sql.SQLException; +import java.util.UUID; +import java.util.concurrent.TimeUnit; + +public class PlayerWarnStorage extends BaseDaoImpl { + + private BanManagerPlugin plugin; + private Cache muteWarnings = CacheBuilder.newBuilder() + .expireAfterWrite(1, TimeUnit.DAYS) + .concurrencyLevel(2) + .maximumSize(200) + .build(); + + public PlayerWarnStorage(BanManagerPlugin plugin) throws SQLException { + super(plugin.getLocalConn(), (DatabaseTableConfig) plugin.getConfig() + .getLocalDb().getTable("playerWarnings")); + + this.plugin = plugin; + + if (!this.isTableExists()) { + TableUtils.createTable(connectionSource, tableConfig); + } else { + // Attempt to add new columns + try { + String update = "ALTER TABLE " + tableConfig + .getTableName() + " ADD COLUMN `expires` INT(10) NOT NULL DEFAULT 0," + + " ADD KEY `" + tableConfig.getTableName() + "_expires_idx` (`expires`)"; + executeRawNoArgs(update); + } catch (SQLException e) { + } + try { + String update = "ALTER TABLE " + tableConfig + .getTableName() + " ADD COLUMN `points` INT(10) NOT NULL DEFAULT 1," + + " ADD KEY `" + tableConfig.getTableName() + "_points_idx` (`points`)"; + executeRawNoArgs(update); + } catch (SQLException e) { + } + try { + String update = "ALTER TABLE " + tableConfig + .getTableName() + " MODIFY COLUMN `points` DECIMAL(60,2) NOT NULL DEFAULT 1"; + executeRawNoArgs(update); + } catch (SQLException e) { + } + try { + executeRawNoArgs("ALTER TABLE " + tableConfig.getTableName() + + " CHANGE `created` `created` BIGINT UNSIGNED," + + " CHANGE `expires` `expires` BIGINT UNSIGNED" + ); + } catch (SQLException e) { + } + } + } + + public PlayerWarnStorage(ConnectionSource connection, DatabaseTableConfig table) throws SQLException { + super(connection, (DatabaseTableConfig) table); + } + + public boolean isMuted(UUID uuid) { + return getMute(uuid) != null; + } + + public PlayerWarnData getMute(UUID uuid) { + return muteWarnings.getIfPresent(uuid); + } + + public PlayerWarnData removeMute(UUID uuid) { + PlayerWarnData warning = muteWarnings.getIfPresent(uuid); + + muteWarnings.invalidate(uuid); + + return warning; + } + + public boolean addWarning(PlayerWarnData data, boolean silent) throws SQLException { + CommonEvent event = plugin.getServer().callEvent("PlayerWarnEvent", data, silent); + + if (event.isCancelled()) { + return false; + } + + if (plugin.getConfig().isWarningMutesEnabled()) muteWarnings.put(data.getPlayer().getUUID(), data); + + boolean created = create(data) == 1; + + if (created) plugin.getServer().callEvent("PlayerWarnedEvent", data, event.isSilent()); + + return created; + } + + public CloseableIterator getUnreadWarnings(UUID uniqueId) throws SQLException { + return queryBuilder().where().eq("player_id", UUIDUtils.toBytes(uniqueId)).and().eq("read", false).iterator(); + } + + public CloseableIterator getWarnings(PlayerData player) throws SQLException { + return queryBuilder().where().eq("player_id", player).iterator(); + } + + public long getCount(PlayerData player) throws SQLException { + return queryBuilder().where().eq("player_id", player).countOf(); + } + + public double getPointsCount(PlayerData player) throws SQLException { + try (DatabaseConnection connection = connectionSource.getReadOnlyConnection(getTableName())) { + CompiledStatement statement = connection + .compileStatement("SELECT SUM(points) AS points FROM " + getTableName() + " WHERE player_id = ?", StatementBuilder.StatementType.SELECT, null, DatabaseConnection + .DEFAULT_RESULT_FLAGS, false); + + statement.setObject(0, player.getId(), SqlType.BYTE_ARRAY); + + DatabaseResults results = statement.runQuery(null); + + if (results.next()) return results.getDouble(0); + } catch (IOException e) { + e.printStackTrace(); + } + + return 0; + } + + public double getPointsCount(PlayerData player, long timeframe) throws SQLException { + try (DatabaseConnection connection = connectionSource.getReadOnlyConnection(getTableName())) { + CompiledStatement statement = connection + .compileStatement("SELECT SUM(points) AS points FROM " + getTableName() + " WHERE player_id = ? AND created >= ?", StatementBuilder.StatementType.SELECT, null, DatabaseConnection + .DEFAULT_RESULT_FLAGS, false); + + statement.setObject(0, player.getId(), SqlType.BYTE_ARRAY); + statement.setObject(1, timeframe, SqlType.LONG); + + DatabaseResults results = statement.runQuery(null); + + if (results.next()) return results.getDouble(0); + } catch (IOException e) { + e.printStackTrace(); + } + + return 0; + } + + public boolean isRecentlyWarned(PlayerData player, long cooldown) throws SQLException { + if (cooldown == 0) { + return false; + } + + return queryBuilder().where() + .eq("player_id", player).and() + .ge("created", (System.currentTimeMillis() / 1000L) - cooldown) + .countOf() > 0; + } + + public int deleteRecent(PlayerData player) throws SQLException { + // TODO use a raw DELETE query to reduce to one query + PlayerWarnData warning = queryBuilder().limit(1L).orderBy("created", false).where().eq("player_id", player) + .queryForFirst(); + + return delete(warning); + } + + public void purge(CleanUp cleanup, boolean read) throws SQLException { + if (cleanup.getDays() == 0) return; + + updateRaw("DELETE FROM " + getTableInfo().getTableName() + " WHERE created < UNIX_TIMESTAMP(CURRENT_TIMESTAMP - INTERVAL '" + cleanup.getDays() + "' DAY)"); + } + + + public CloseableIterator findWarnings(long fromTime) throws SQLException { + if (fromTime == 0) { + return iterator(); + } + + long checkTime = fromTime + DateUtils.getTimeDiff(); + + QueryBuilder query = queryBuilder(); + Where where = query.where(); + where.ge("created", checkTime); + + query.setWhere(where); + + return query.iterator(); + + } + + public int deleteAll(PlayerData player) throws SQLException { + DeleteBuilder builder = deleteBuilder(); + + builder.where().eq("player_id", player); + + return builder.delete(); + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/storage/ReportStateStorage.java b/common/src/main/java/me/confuser/banmanager/common/storage/ReportStateStorage.java new file mode 100644 index 000000000..18170af39 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/storage/ReportStateStorage.java @@ -0,0 +1,32 @@ +package me.confuser.banmanager.common.storage; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.data.ReportState; +import me.confuser.banmanager.common.ormlite.dao.BaseDaoImpl; +import me.confuser.banmanager.common.ormlite.support.ConnectionSource; +import me.confuser.banmanager.common.ormlite.table.DatabaseTableConfig; +import me.confuser.banmanager.common.ormlite.table.TableUtils; + +import java.sql.SQLException; + +public class ReportStateStorage extends BaseDaoImpl { + + public ReportStateStorage(BanManagerPlugin plugin) throws SQLException { + super(plugin.getLocalConn(), (DatabaseTableConfig) plugin.getConfig() + .getLocalDb() + .getTable("playerReportStates")); + + if (!this.isTableExists()) { + TableUtils.createTable(connectionSource, tableConfig); + + create(new ReportState("Open")); + create(new ReportState("Assigned")); + create(new ReportState("Resolved")); + create(new ReportState("Closed")); + } + } + + public ReportStateStorage(ConnectionSource connection, DatabaseTableConfig table) throws SQLException { + super(connection, (DatabaseTableConfig) table); + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/storage/RollbackStorage.java b/common/src/main/java/me/confuser/banmanager/common/storage/RollbackStorage.java new file mode 100644 index 000000000..b805ef8ba --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/storage/RollbackStorage.java @@ -0,0 +1,55 @@ +package me.confuser.banmanager.common.storage; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.data.RollbackData; +import me.confuser.banmanager.common.ormlite.dao.BaseDaoImpl; +import me.confuser.banmanager.common.ormlite.dao.CloseableIterator; +import me.confuser.banmanager.common.ormlite.stmt.QueryBuilder; +import me.confuser.banmanager.common.ormlite.stmt.Where; +import me.confuser.banmanager.common.ormlite.table.DatabaseTableConfig; +import me.confuser.banmanager.common.ormlite.table.TableUtils; +import me.confuser.banmanager.common.util.DateUtils; + +import java.sql.SQLException; + +public class RollbackStorage extends BaseDaoImpl { + + private BanManagerPlugin plugin; + + public RollbackStorage(BanManagerPlugin plugin) throws SQLException { + super(plugin.getLocalConn(), (DatabaseTableConfig) plugin.getConfig().getLocalDb() + .getTable("rollbacks")); + + this.plugin = plugin; + + if (!this.isTableExists()) { + TableUtils.createTable(connectionSource, tableConfig); + } else { + try { + executeRawNoArgs("ALTER TABLE " + tableConfig.getTableName() + + " CHANGE `created` `created` BIGINT UNSIGNED," + + " CHANGE `expires` `expires` BIGINT UNSIGNED" + ); + } catch (SQLException e) { + } + } + } + + public CloseableIterator findRollbacks(long fromTime) throws SQLException { + if (fromTime == 0) { + return iterator(); + } + + long checkTime = fromTime + DateUtils.getTimeDiff(); + + QueryBuilder query = queryBuilder(); + Where where = query.where(); + where.ge("created", checkTime); + + query.setWhere(where); + + return query.iterator(); + + } + +} diff --git a/common/src/main/java/me/confuser/banmanager/common/storage/conversion/AdvancedBan.java b/common/src/main/java/me/confuser/banmanager/common/storage/conversion/AdvancedBan.java new file mode 100644 index 000000000..5a6d053e0 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/storage/conversion/AdvancedBan.java @@ -0,0 +1,192 @@ +package me.confuser.banmanager.common.storage.conversion; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.commands.BanIpCommand; +import me.confuser.banmanager.common.data.*; +import me.confuser.banmanager.common.ipaddr.IPAddress; +import me.confuser.banmanager.common.ormlite.dao.CloseableIterator; +import me.confuser.banmanager.common.ormlite.jdbc.JdbcPooledConnectionSource; +import me.confuser.banmanager.common.ormlite.stmt.StatementBuilder; +import me.confuser.banmanager.common.ormlite.support.DatabaseConnection; +import me.confuser.banmanager.common.ormlite.support.DatabaseResults; + +import java.sql.SQLException; + +public class AdvancedBan implements IConverter { + private JdbcPooledConnectionSource connection; + private BanManagerPlugin plugin; + private String host; + private String port; + private String database; + private String username; + private String password; + + public AdvancedBan(BanManagerPlugin plugin, String[] args) { + this.plugin = plugin; + this.host = args[1]; + this.port = args[2]; + this.database = args[3]; + this.username = args[4]; + + if (args.length == 6) this.password = args[5]; + + try { + connection = new JdbcPooledConnectionSource("jdbc:mysql://" + host + ":" + port + "/" + database, username, password); + } catch (SQLException e) { + e.printStackTrace(); + plugin.getLogger().severe("Failed to connect to AdvancedBan database"); + return; + } + + connection.setMaxConnectionsFree(1); + try { + connection.initialize(); + } catch (SQLException e) { + e.printStackTrace(); + plugin.getLogger().severe("Failed to connect to AdvancedBan database"); + return; + } + + importPunishments(); + + connection.closeQuietly(); + } + + public void importPunishments() { + DatabaseConnection read; + int count = 0; + + try { + read = connection.getReadOnlyConnection(""); + } catch (SQLException e) { + e.printStackTrace(); + plugin.getLogger().severe("Failed to connect to AdvancedBan database"); + return; + } + + DatabaseResults results; + + try { + results = read + .compileStatement("SELECT `name`, `uuid`, `reason`, `operator`, `punishmentType`, `start`, `end` FROM `Punishments`", StatementBuilder + .StatementType.SELECT, null, DatabaseConnection.DEFAULT_RESULT_FLAGS, false) + .runQuery(null); + } catch (SQLException e) { + e.printStackTrace(); + return; + } + + try { + while (results.next()) { + String name = results.getString(0); + String uuid = results.getString(1); + String reason = results.getString(2); + String actorName = results.getString(3); + String type = results.getString(4); + long created = Long.parseLong(results.getString(5)) / 1000L; + String end = results.getString(6); + + PlayerData actor = plugin.getPlayerStorage().retrieve(actorName, false); + + if (actor == null) { + actor = plugin.getPlayerStorage().getConsole(); + } + + long expires = 0; + + if (!end.equals("-1")) expires = Long.parseLong(end) / 1000L; + + if (type.equalsIgnoreCase("BAN") || type.equalsIgnoreCase("TEMP_BAN")) { + PlayerData playerData = plugin.getPlayerStorage().retrieve(name, true); + + if (playerData == null) { + plugin.getLogger().severe(name + " ban creation failed, unable to lookup UUID"); + continue; + } + + PlayerBanData data = new PlayerBanData(playerData, actor, reason, true, expires, created); + + if (!plugin.getPlayerBanStorage().isBanned(playerData.getUUID())) { + plugin.getPlayerBanStorage().ban(data); + } + } else if (type.equalsIgnoreCase("MUTE") || type.equalsIgnoreCase("TEMP_MUTE")) { + PlayerData playerData = plugin.getPlayerStorage().retrieve(name, true); + + if (playerData == null) { + plugin.getLogger().severe(name + " mute creation failed, unable to lookup UUID"); + continue; + } + + PlayerMuteData data = new PlayerMuteData(playerData, actor, reason, true, false, expires, created); + + if (!plugin.getPlayerMuteStorage().isMuted(playerData.getUUID())) { + plugin.getPlayerMuteStorage().mute(data); + } + } else if (type.equalsIgnoreCase("IP_BAN") || type.equalsIgnoreCase("TEMP_IP_BAN")) { + IPAddress ip = BanIpCommand.getIp(uuid); + + if (ip == null) { + plugin.getLogger().severe(name + " ip ban creation failed, invalid ip"); + continue; + } + + IpBanData data = new IpBanData(ip, actor, reason, true, expires, created); + + if (!plugin.getIpBanStorage().isBanned(ip)) { + plugin.getIpBanStorage().ban(data); + } + } else if (type.equalsIgnoreCase("WARNING") || type.equalsIgnoreCase("TEMP_WARNING")) { + PlayerData playerData = plugin.getPlayerStorage().retrieve(name, true); + + if (playerData == null) { + plugin.getLogger().severe(name + " warning creation failed, unable to lookup UUID"); + continue; + } + + PlayerWarnData data = new PlayerWarnData(playerData, actor, reason, true, expires, created); + + CloseableIterator warnings = plugin.getPlayerWarnStorage().getWarnings(playerData); + + while (warnings.hasNext()) { + PlayerWarnData warn = warnings.next(); + + if (warn.getReason().equalsIgnoreCase(reason) && warn.getActor().getUUID().equals(actor.getUUID())) { + continue; + } + + plugin.getPlayerWarnStorage().addWarning(data, true); + } + } + + count++; + } + } catch (SQLException e) { + e.printStackTrace(); + } finally { + results.closeQuietly(); + } + + read.closeQuietly(); + plugin.getLogger().info("Imported " + count + " punishments from AdvancedBan"); + } + + @Override + public void importPlayerBans() { + } + + @Override + public void importPlayerMutes() { + } + + @Override + public void importPlayerWarnings() { + } + + @Override + public void importIpBans() { + } + + @Override + public void importIpRangeBans() { + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/storage/conversion/H2.java b/common/src/main/java/me/confuser/banmanager/common/storage/conversion/H2.java new file mode 100644 index 000000000..4cba64dfa --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/storage/conversion/H2.java @@ -0,0 +1,565 @@ +package me.confuser.banmanager.common.storage.conversion; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.configs.DatabaseConfig; +import me.confuser.banmanager.common.configs.LocalDatabaseConfig; +import me.confuser.banmanager.common.data.*; +import me.confuser.banmanager.common.ormlite.dao.CloseableIterator; +import me.confuser.banmanager.common.ormlite.support.ConnectionSource; +import me.confuser.banmanager.common.ormlite.table.DatabaseTableConfig; +import me.confuser.banmanager.common.storage.*; + +import java.io.File; +import java.io.IOException; +import java.sql.SQLException; +import java.util.HashMap; +import java.util.Map; + +public class H2 implements IConverter { + private BanManagerPlugin plugin; + private PlayerBanStorage playerBanStorage; + private PlayerBanRecordStorage playerBanRecordStorage; + private PlayerKickStorage playerKickStorage; + private PlayerMuteStorage playerMuteStorage; + private PlayerMuteRecordStorage playerMuteRecordStorage; + private PlayerStorage playerStorage; + private PlayerWarnStorage playerWarnStorage; + private PlayerNoteStorage playerNoteStorage; + private PlayerHistoryStorage playerHistoryStorage; + private PlayerReportStorage playerReportStorage; + private PlayerReportLocationStorage playerReportLocationStorage; + private ReportStateStorage reportStateStorage; + private PlayerReportCommandStorage playerReportCommandStorage; + private PlayerReportCommentStorage playerReportCommentStorage; + + private NameBanStorage nameBanStorage; + private NameBanRecordStorage nameBanRecordStorage; + + private IpBanStorage ipBanStorage; + private IpBanRecordStorage ipBanRecordStorage; + private IpMuteStorage ipMuteStorage; + private IpMuteRecordStorage ipMuteRecordStorage; + private IpRangeBanStorage ipRangeBanStorage; + private IpRangeBanRecordStorage ipRangeBanRecordStorage; + + public H2(BanManagerPlugin plugin, String fileName) { + this.plugin = plugin; + + File file = new File(plugin.getDataFolder(), fileName + ".mv.db"); + + if (!file.exists()) { + plugin.getLogger().severe("Failed to find H2 database"); + return; + } + + HashMap> tables = new HashMap<>(); + + for (Map.Entry entry : LocalDatabaseConfig.types.entrySet()) { + tables.put(entry.getKey(), new DatabaseTableConfig<>(entry.getValue(), plugin.getConfig().getLocalDb().getTable(entry.getKey()).getTableName(), null)); + } + + H2Config config = new H2Config("h2", "", 0, fileName, "", "", false, false, false, true, 5, 0, 1800000, 30000, tables, plugin.getDataFolder()); + + ConnectionSource connection; + try { + connection = plugin.createConnection(config, "h2import"); + + // Setup data storage + playerStorage = new PlayerStorage(connection, config.getTable("players")); + playerBanStorage = new PlayerBanStorage(connection, config.getTable("playerBans")); + playerBanRecordStorage = new PlayerBanRecordStorage(connection, config.getTable("playerBanRecords")); + playerMuteStorage = new PlayerMuteStorage(connection, config.getTable("playerMutes")); + playerMuteRecordStorage = new PlayerMuteRecordStorage(connection, config.getTable("playerMuteRecords")); + playerWarnStorage = new PlayerWarnStorage(connection, config.getTable("playerWarnings")); + playerKickStorage = new PlayerKickStorage(connection, config.getTable("playerKicks")); + playerNoteStorage = new PlayerNoteStorage(connection, config.getTable("playerNotes")); + playerHistoryStorage = new PlayerHistoryStorage(connection, config.getTable("playerHistory")); + reportStateStorage = new ReportStateStorage(connection, config.getTable("playerReportStates")); + playerReportCommandStorage = new PlayerReportCommandStorage(connection, config.getTable("playerReportCommands")); + playerReportCommentStorage = new PlayerReportCommentStorage(connection, config.getTable("playerReportComments")); + playerReportStorage = new PlayerReportStorage(connection, config.getTable("playerReports")); + playerReportLocationStorage = new PlayerReportLocationStorage(connection, config.getTable("playerReportLocations")); + + ipBanStorage = new IpBanStorage(connection, config.getTable("ipBans")); + ipBanRecordStorage = new IpBanRecordStorage(connection, config.getTable("ipBanRecords")); + ipMuteStorage = new IpMuteStorage(connection, config.getTable("ipMutes")); + ipMuteRecordStorage = new IpMuteRecordStorage(connection, config.getTable("ipMuteRecords")); + ipRangeBanStorage = new IpRangeBanStorage(connection, config.getTable("ipRangeBans")); + ipRangeBanRecordStorage = new IpRangeBanRecordStorage(connection, config.getTable("ipRangeBanRecords")); + + nameBanStorage = new NameBanStorage(connection, config.getTable("nameBans")); + nameBanRecordStorage = new NameBanRecordStorage(connection, config.getTable("nameBanRecords")); + } catch (SQLException e) { + e.printStackTrace(); + return; + } + + importPlayers(); + importPlayerBans(); + importPlayerMutes(); + importPlayerWarnings(); + importPlayerKicks(); + importPlayerNotes(); + importPlayerHistory(); + importPlayerReports(); + importIpBans(); + importIpMutes(); + importIpRangeBans(); + importNameBans(); + + connection.closeQuietly(); + } + + public void importPlayers() { + plugin.getLogger().info("Importing players"); + + try (CloseableIterator itr = playerStorage.closeableIterator()) { + while (itr.hasNext()) { + PlayerData data = itr.next(); + + try { + plugin.getPlayerStorage().createIfNotExists(data); + } catch (SQLException e) { + e.printStackTrace(); + plugin.getLogger().severe("Failed to import player " + data.getUUID()); + } + } + } catch (IOException e) { + e.printStackTrace(); + } + + plugin.getLogger().info("Finished importing players"); + } + + @Override + public void importPlayerBans() { + plugin.getLogger().info("Importing player bans"); + + try (CloseableIterator itr = playerBanStorage.closeableIterator()) { + while (itr.hasNext()) { + PlayerBanData data = itr.next(); + + try { + plugin.getPlayerBanStorage().createIfNotExists(data); + } catch (SQLException e) { + e.printStackTrace(); + plugin.getLogger().severe("Failed to import player ban " + data.getPlayer().getUUID()); + } + } + } catch (IOException e) { + e.printStackTrace(); + } + + plugin.getLogger().info("Finished importing player bans"); + + plugin.getLogger().info("Importing player ban records"); + + try (CloseableIterator itr = playerBanRecordStorage.closeableIterator()) { + while (itr.hasNext()) { + PlayerBanRecord data = itr.next(); + + try { + plugin.getPlayerBanRecordStorage().createIfNotExists(data); + } catch (SQLException e) { + e.printStackTrace(); + plugin.getLogger().severe("Failed to import player ban record " + data.getId()); + } + } + } catch (IOException e) { + e.printStackTrace(); + } + + plugin.getLogger().info("Finished importing player ban records"); + } + + @Override + public void importPlayerMutes() { + plugin.getLogger().info("Importing player mutes"); + + try (CloseableIterator itr = playerMuteStorage.closeableIterator()) { + while (itr.hasNext()) { + PlayerMuteData data = itr.next(); + + try { + plugin.getPlayerMuteStorage().createIfNotExists(data); + } catch (SQLException e) { + e.printStackTrace(); + plugin.getLogger().severe("Failed to import player mute " + data.getPlayer().getUUID()); + } + } + } catch (IOException e) { + e.printStackTrace(); + } + + plugin.getLogger().info("Finished importing player mutes"); + + plugin.getLogger().info("Importing player mute records"); + + try (CloseableIterator itr = playerMuteRecordStorage.closeableIterator()) { + while (itr.hasNext()) { + PlayerMuteRecord data = itr.next(); + + try { + plugin.getPlayerMuteRecordStorage().createIfNotExists(data); + } catch (SQLException e) { + e.printStackTrace(); + plugin.getLogger().severe("Failed to import player mute record " + data.getId()); + } + } + } catch (IOException e) { + e.printStackTrace(); + } + + plugin.getLogger().info("Finished importing player mute records"); + } + + @Override + public void importPlayerWarnings() { + plugin.getLogger().info("Importing player warnings"); + + try (CloseableIterator itr = playerWarnStorage.closeableIterator()) { + while (itr.hasNext()) { + PlayerWarnData data = itr.next(); + + try { + plugin.getPlayerWarnStorage().createIfNotExists(data); + } catch (SQLException e) { + e.printStackTrace(); + plugin.getLogger().severe("Failed to import player warning " + data.getId()); + } + } + } catch (IOException e) { + e.printStackTrace(); + } + + plugin.getLogger().info("Finished importing player warnings"); + } + + public void importPlayerKicks() { + plugin.getLogger().info("Importing player kicks"); + + try (CloseableIterator itr = playerKickStorage.closeableIterator()) { + while (itr.hasNext()) { + PlayerKickData data = itr.next(); + + try { + plugin.getPlayerKickStorage().createIfNotExists(data); + } catch (SQLException e) { + e.printStackTrace(); + plugin.getLogger().severe("Failed to import player kick " + data.getId()); + } + } + } catch (IOException e) { + e.printStackTrace(); + } + + plugin.getLogger().info("Finished importing player kicks"); + } + + public void importPlayerNotes() { + plugin.getLogger().info("Importing player notes"); + + try (CloseableIterator itr = playerNoteStorage.closeableIterator()) { + while (itr.hasNext()) { + PlayerNoteData data = itr.next(); + + try { + plugin.getPlayerNoteStorage().createIfNotExists(data); + } catch (SQLException e) { + e.printStackTrace(); + plugin.getLogger().severe("Failed to import player note " + data.getId()); + } + } + } catch (IOException e) { + e.printStackTrace(); + } + + plugin.getLogger().info("Finished importing player notes"); + } + + public void importPlayerHistory() { + plugin.getLogger().info("Importing player history"); + + try (CloseableIterator itr = playerHistoryStorage.closeableIterator()) { + while (itr.hasNext()) { + PlayerHistoryData data = itr.next(); + + try { + plugin.getPlayerHistoryStorage().createIfNotExists(data); + } catch (SQLException e) { + e.printStackTrace(); + plugin.getLogger().severe("Failed to import player note " + data.getId()); + } + } + } catch (IOException e) { + e.printStackTrace(); + } + + plugin.getLogger().info("Finished importing player history"); + } + + public void importPlayerReports() { + plugin.getLogger().info("Importing player report states"); + + try (CloseableIterator itr = reportStateStorage.closeableIterator()) { + while (itr.hasNext()) { + ReportState data = itr.next(); + + try { + plugin.getReportStateStorage().createIfNotExists(data); + } catch (SQLException e) { + e.printStackTrace(); + plugin.getLogger().severe("Failed to import player report state " + data.getId()); + } + } + } catch (IOException e) { + e.printStackTrace(); + } + + plugin.getLogger().info("Finished importing player report states"); + + plugin.getLogger().info("Importing player report commands"); + + try (CloseableIterator itr = playerReportCommandStorage.closeableIterator()) { + while (itr.hasNext()) { + PlayerReportCommandData data = itr.next(); + + try { + plugin.getPlayerReportCommandStorage().createIfNotExists(data); + } catch (SQLException e) { + e.printStackTrace(); + plugin.getLogger().severe("Failed to import player report state " + data.getId()); + } + } + } catch (IOException e) { + e.printStackTrace(); + } + + plugin.getLogger().info("Finished importing player report commands"); + + plugin.getLogger().info("Importing player report comments"); + + try (CloseableIterator itr = playerReportCommentStorage.closeableIterator()) { + while (itr.hasNext()) { + PlayerReportCommentData data = itr.next(); + + try { + plugin.getPlayerReportCommentStorage().createIfNotExists(data); + } catch (SQLException e) { + e.printStackTrace(); + plugin.getLogger().severe("Failed to import player report comment " + data.getId()); + } + } + } catch (IOException e) { + e.printStackTrace(); + } + + plugin.getLogger().info("Finished importing player report comments"); + + plugin.getLogger().info("Importing player reports"); + + try (CloseableIterator itr = playerReportStorage.closeableIterator()) { + while (itr.hasNext()) { + PlayerReportData data = itr.next(); + + try { + plugin.getPlayerReportStorage().createIfNotExists(data); + } catch (SQLException e) { + e.printStackTrace(); + plugin.getLogger().severe("Failed to import player report " + data.getId()); + } + } + } catch (IOException e) { + e.printStackTrace(); + } + + plugin.getLogger().info("Finished importing player report"); + + plugin.getLogger().info("Importing player report locations"); + + try (CloseableIterator itr = playerReportLocationStorage.closeableIterator()) { + while (itr.hasNext()) { + PlayerReportLocationData data = itr.next(); + + try { + plugin.getPlayerReportLocationStorage().createIfNotExists(data); + } catch (SQLException e) { + e.printStackTrace(); + plugin.getLogger().severe("Failed to import player report location " + data.getId()); + } + } + } catch (IOException e) { + e.printStackTrace(); + } + + plugin.getLogger().info("Finished importing player report locations"); + } + + @Override + public void importIpBans() { + plugin.getLogger().info("Importing ip bans"); + + try (CloseableIterator itr = ipBanStorage.closeableIterator()) { + while (itr.hasNext()) { + IpBanData data = itr.next(); + + try { + plugin.getIpBanStorage().createIfNotExists(data); + } catch (SQLException e) { + e.printStackTrace(); + plugin.getLogger().severe("Failed to import ip ban " + data.getIp()); + } + } + } catch (IOException e) { + e.printStackTrace(); + } + + plugin.getLogger().info("Finished importing ip bans"); + + plugin.getLogger().info("Importing ip ban records"); + + try (CloseableIterator itr = ipBanRecordStorage.closeableIterator()) { + while (itr.hasNext()) { + IpBanRecord data = itr.next(); + + try { + plugin.getIpBanRecordStorage().createIfNotExists(data); + } catch (SQLException e) { + e.printStackTrace(); + plugin.getLogger().severe("Failed to import ip ban record " + data.getId()); + } + } + } catch (IOException e) { + e.printStackTrace(); + } + + plugin.getLogger().info("Finished importing ip ban records"); + } + + public void importIpMutes() { + plugin.getLogger().info("Importing ip mutes"); + + try (CloseableIterator itr = ipMuteStorage.closeableIterator()) { + while (itr.hasNext()) { + IpMuteData data = itr.next(); + + try { + plugin.getIpMuteStorage().createIfNotExists(data); + } catch (SQLException e) { + e.printStackTrace(); + plugin.getLogger().severe("Failed to import ip mute " + data.getIp()); + } + } + } catch (IOException e) { + e.printStackTrace(); + } + + plugin.getLogger().info("Finished importing ip mutes"); + + plugin.getLogger().info("Importing ip mute records"); + + try (CloseableIterator itr = ipMuteRecordStorage.closeableIterator()) { + while (itr.hasNext()) { + IpMuteRecord data = itr.next(); + + try { + plugin.getIpMuteRecordStorage().createIfNotExists(data); + } catch (SQLException e) { + e.printStackTrace(); + plugin.getLogger().severe("Failed to import ip mute record " + data.getId()); + } + } + } catch (IOException e) { + e.printStackTrace(); + } + + plugin.getLogger().info("Finished importing ip mute records"); + } + + @Override + public void importIpRangeBans() { + plugin.getLogger().info("Importing ip range bans"); + + try (CloseableIterator itr = ipRangeBanStorage.closeableIterator()) { + while (itr.hasNext()) { + IpRangeBanData data = itr.next(); + + try { + plugin.getIpRangeBanStorage().createIfNotExists(data); + } catch (SQLException e) { + e.printStackTrace(); + plugin.getLogger().severe("Failed to import ip range ban " + data.getFromIp() + " - " + data.getToIp()); + } + } + } catch (IOException e) { + e.printStackTrace(); + } + + plugin.getLogger().info("Finished importing ip range bans"); + + plugin.getLogger().info("Importing ip range ban records"); + + try (CloseableIterator itr = ipRangeBanRecordStorage.closeableIterator()) { + while (itr.hasNext()) { + IpRangeBanRecord data = itr.next(); + + try { + plugin.getIpRangeBanRecordStorage().createIfNotExists(data); + } catch (SQLException e) { + e.printStackTrace(); + plugin.getLogger().severe("Failed to import ip range ban record " + data.getId()); + } + } + } catch (IOException e) { + e.printStackTrace(); + } + + plugin.getLogger().info("Finished importing ip range ban records"); + } + + public void importNameBans() { + plugin.getLogger().info("Importing name bans"); + + try (CloseableIterator itr = nameBanStorage.closeableIterator()) { + while (itr.hasNext()) { + NameBanData data = itr.next(); + + try { + plugin.getNameBanStorage().createIfNotExists(data); + } catch (SQLException e) { + e.printStackTrace(); + plugin.getLogger().severe("Failed to import name ban " + data.getName()); + } + } + } catch (IOException e) { + e.printStackTrace(); + } + + plugin.getLogger().info("Finished importing name bans"); + + plugin.getLogger().info("Importing name ban records"); + + try (CloseableIterator itr = nameBanRecordStorage.closeableIterator()) { + while (itr.hasNext()) { + NameBanRecord data = itr.next(); + + try { + plugin.getNameBanRecordStorage().createIfNotExists(data); + } catch (SQLException e) { + e.printStackTrace(); + plugin.getLogger().severe("Failed to import name ban record " + data.getId()); + } + } + } catch (IOException e) { + e.printStackTrace(); + } + + plugin.getLogger().info("Finished importing name ban records"); + } + + class H2Config extends DatabaseConfig { + public H2Config(String storageType, String host, int port, String name, String user, String password, boolean useSSL, boolean verifyServerCertificate, boolean allowPublicKeyRetrieval, boolean isEnabled, int maxConnections, int leakDetection, int maxLifetime, int connectionTimeout, HashMap> tables, File dataFolder) { + super(storageType, host, port, name, user, password, useSSL, verifyServerCertificate, allowPublicKeyRetrieval, isEnabled, maxConnections, leakDetection, maxLifetime, connectionTimeout, tables, dataFolder); + } + } +} diff --git a/src/main/java/me/confuser/banmanager/storage/conversion/IConverter.java b/common/src/main/java/me/confuser/banmanager/common/storage/conversion/IConverter.java similarity index 75% rename from src/main/java/me/confuser/banmanager/storage/conversion/IConverter.java rename to common/src/main/java/me/confuser/banmanager/common/storage/conversion/IConverter.java index f3a15f03e..f89b79b1f 100644 --- a/src/main/java/me/confuser/banmanager/storage/conversion/IConverter.java +++ b/common/src/main/java/me/confuser/banmanager/common/storage/conversion/IConverter.java @@ -1,4 +1,4 @@ -package me.confuser.banmanager.storage.conversion; +package me.confuser.banmanager.common.storage.conversion; public interface IConverter { diff --git a/src/main/java/me/confuser/banmanager/storage/conversion/SimpleWarnings.java b/common/src/main/java/me/confuser/banmanager/common/storage/conversion/SimpleWarnings.java similarity index 79% rename from src/main/java/me/confuser/banmanager/storage/conversion/SimpleWarnings.java rename to common/src/main/java/me/confuser/banmanager/common/storage/conversion/SimpleWarnings.java index 44a562365..4f3d0a482 100644 --- a/src/main/java/me/confuser/banmanager/storage/conversion/SimpleWarnings.java +++ b/common/src/main/java/me/confuser/banmanager/common/storage/conversion/SimpleWarnings.java @@ -1,12 +1,12 @@ -package me.confuser.banmanager.storage.conversion; +package me.confuser.banmanager.common.storage.conversion; -import com.j256.ormlite.jdbc.JdbcPooledConnectionSource; -import com.j256.ormlite.stmt.StatementBuilder; -import com.j256.ormlite.support.DatabaseConnection; -import com.j256.ormlite.support.DatabaseResults; -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.data.PlayerWarnData; +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.data.PlayerWarnData; +import me.confuser.banmanager.common.ormlite.jdbc.JdbcPooledConnectionSource; +import me.confuser.banmanager.common.ormlite.stmt.StatementBuilder; +import me.confuser.banmanager.common.ormlite.support.DatabaseConnection; +import me.confuser.banmanager.common.ormlite.support.DatabaseResults; import java.io.File; import java.sql.SQLException; @@ -14,10 +14,12 @@ public class SimpleWarnings implements IConverter { - private BanManager plugin = BanManager.getPlugin(); + private BanManagerPlugin plugin; private JdbcPooledConnectionSource connection; - public SimpleWarnings() { + public SimpleWarnings(BanManagerPlugin plugin) { + this.plugin = plugin; + try { connection = new JdbcPooledConnectionSource("jdbc:sqlite:" + new File(plugin.getDataFolder().getParent(), "SimpleWarnings/Warnings.db").getAbsolutePath()); @@ -48,7 +50,7 @@ public void importPlayerWarnings() { int count = 0; try { - read = connection.getReadOnlyConnection(); + read = connection.getReadOnlyConnection(""); } catch (SQLException e) { e.printStackTrace(); plugin.getLogger().severe("Failed to connect to SimpleWarnings database"); @@ -60,7 +62,7 @@ public void importPlayerWarnings() { try { results = read .compileStatement("SELECT `name`, `warning`, `placedby`, `date` FROM SimpleWarnings", StatementBuilder - .StatementType.SELECT, null, DatabaseConnection.DEFAULT_RESULT_FLAGS) + .StatementType.SELECT, null, DatabaseConnection.DEFAULT_RESULT_FLAGS, false) .runQuery(null); } catch (SQLException e) { e.printStackTrace(); diff --git a/common/src/main/java/me/confuser/banmanager/common/storage/global/GlobalIpBanRecordStorage.java b/common/src/main/java/me/confuser/banmanager/common/storage/global/GlobalIpBanRecordStorage.java new file mode 100644 index 000000000..648d45a43 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/storage/global/GlobalIpBanRecordStorage.java @@ -0,0 +1,44 @@ +package me.confuser.banmanager.common.storage.global; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.data.global.GlobalIpBanRecordData; +import me.confuser.banmanager.common.ormlite.dao.BaseDaoImpl; +import me.confuser.banmanager.common.ormlite.dao.CloseableIterator; +import me.confuser.banmanager.common.ormlite.stmt.QueryBuilder; +import me.confuser.banmanager.common.ormlite.table.DatabaseTableConfig; +import me.confuser.banmanager.common.ormlite.table.TableUtils; +import me.confuser.banmanager.common.util.DateUtils; + +import java.sql.SQLException; + +public class GlobalIpBanRecordStorage extends BaseDaoImpl { + + public GlobalIpBanRecordStorage(BanManagerPlugin plugin) throws SQLException { + super(plugin.getGlobalConn(), (DatabaseTableConfig) plugin.getConfig() + .getGlobalDb() + .getTable("ipUnbans")); + + if (!this.isTableExists()) { + TableUtils.createTable(connectionSource, tableConfig); + } else { + try { + executeRawNoArgs("ALTER TABLE " + tableConfig.getTableName() + " CHANGE `created` `created` BIGINT UNSIGNED"); + } catch (SQLException e) { + } + } + } + + public CloseableIterator findUnbans(long fromTime) throws SQLException { + if (fromTime == 0) { + return iterator(); + } + + long checkTime = fromTime + DateUtils.getTimeDiff(); + + QueryBuilder query = queryBuilder(); + query.setWhere(query.where().ge("created", checkTime)); + + return query.iterator(); + + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/storage/global/GlobalIpBanStorage.java b/common/src/main/java/me/confuser/banmanager/common/storage/global/GlobalIpBanStorage.java new file mode 100644 index 000000000..68a5c0355 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/storage/global/GlobalIpBanStorage.java @@ -0,0 +1,46 @@ +package me.confuser.banmanager.common.storage.global; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.data.global.GlobalIpBanData; +import me.confuser.banmanager.common.ormlite.dao.BaseDaoImpl; +import me.confuser.banmanager.common.ormlite.dao.CloseableIterator; +import me.confuser.banmanager.common.ormlite.stmt.QueryBuilder; +import me.confuser.banmanager.common.ormlite.table.DatabaseTableConfig; +import me.confuser.banmanager.common.ormlite.table.TableUtils; +import me.confuser.banmanager.common.util.DateUtils; + +import java.sql.SQLException; + +public class GlobalIpBanStorage extends BaseDaoImpl { + + public GlobalIpBanStorage(BanManagerPlugin plugin) throws SQLException { + super(plugin.getGlobalConn(), (DatabaseTableConfig) plugin.getConfig().getGlobalDb() + .getTable("ipBans")); + + if (!this.isTableExists()) { + TableUtils.createTable(connectionSource, tableConfig); + } else { + try { + executeRawNoArgs("ALTER TABLE " + tableConfig.getTableName() + + " CHANGE `created` `created` BIGINT UNSIGNED," + + " CHANGE `expires` `expires` BIGINT UNSIGNED" + ); + } catch (SQLException e) { + } + } + } + + public CloseableIterator findBans(long fromTime) throws SQLException { + if (fromTime == 0) { + return iterator(); + } + + long checkTime = fromTime + DateUtils.getTimeDiff(); + + QueryBuilder query = queryBuilder(); + query.setWhere(query.where().ge("created", checkTime)); + + return query.iterator(); + + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/storage/global/GlobalPlayerBanRecordStorage.java b/common/src/main/java/me/confuser/banmanager/common/storage/global/GlobalPlayerBanRecordStorage.java new file mode 100644 index 000000000..8f2642d4d --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/storage/global/GlobalPlayerBanRecordStorage.java @@ -0,0 +1,44 @@ +package me.confuser.banmanager.common.storage.global; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.data.global.GlobalPlayerBanRecordData; +import me.confuser.banmanager.common.ormlite.dao.BaseDaoImpl; +import me.confuser.banmanager.common.ormlite.dao.CloseableIterator; +import me.confuser.banmanager.common.ormlite.stmt.QueryBuilder; +import me.confuser.banmanager.common.ormlite.table.DatabaseTableConfig; +import me.confuser.banmanager.common.ormlite.table.TableUtils; +import me.confuser.banmanager.common.util.DateUtils; + +import java.sql.SQLException; + +public class GlobalPlayerBanRecordStorage extends BaseDaoImpl { + + public GlobalPlayerBanRecordStorage(BanManagerPlugin plugin) throws SQLException { + super(plugin.getGlobalConn(), (DatabaseTableConfig) plugin.getConfig() + .getGlobalDb() + .getTable("playerUnbans")); + + if (!this.isTableExists()) { + TableUtils.createTable(connectionSource, tableConfig); + } else { + try { + executeRawNoArgs("ALTER TABLE " + tableConfig.getTableName() + " CHANGE `created` `created` BIGINT UNSIGNED"); + } catch (SQLException e) { + } + } + } + + public CloseableIterator findUnbans(long fromTime) throws SQLException { + if (fromTime == 0) { + return iterator(); + } + + long checkTime = fromTime + DateUtils.getTimeDiff(); + + QueryBuilder query = queryBuilder(); + query.setWhere(query.where().ge("created", checkTime)); + + return query.iterator(); + + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/storage/global/GlobalPlayerBanStorage.java b/common/src/main/java/me/confuser/banmanager/common/storage/global/GlobalPlayerBanStorage.java new file mode 100644 index 000000000..2ed3675a8 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/storage/global/GlobalPlayerBanStorage.java @@ -0,0 +1,47 @@ +package me.confuser.banmanager.common.storage.global; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.data.global.GlobalPlayerBanData; +import me.confuser.banmanager.common.ormlite.dao.BaseDaoImpl; +import me.confuser.banmanager.common.ormlite.dao.CloseableIterator; +import me.confuser.banmanager.common.ormlite.stmt.QueryBuilder; +import me.confuser.banmanager.common.ormlite.table.DatabaseTableConfig; +import me.confuser.banmanager.common.ormlite.table.TableUtils; +import me.confuser.banmanager.common.util.DateUtils; + +import java.sql.SQLException; + +public class GlobalPlayerBanStorage extends BaseDaoImpl { + + public GlobalPlayerBanStorage(BanManagerPlugin plugin) throws SQLException { + super(plugin.getGlobalConn(), (DatabaseTableConfig) plugin.getConfig() + .getGlobalDb() + .getTable("playerBans")); + + if (!this.isTableExists()) { + TableUtils.createTable(connectionSource, tableConfig); + } else { + try { + executeRawNoArgs("ALTER TABLE " + tableConfig.getTableName() + + " CHANGE `created` `created` BIGINT UNSIGNED," + + " CHANGE `expires` `expires` BIGINT UNSIGNED" + ); + } catch (SQLException e) { + } + } + } + + public CloseableIterator findBans(long fromTime) throws SQLException { + if (fromTime == 0) { + return iterator(); + } + + long checkTime = fromTime + DateUtils.getTimeDiff(); + + QueryBuilder query = queryBuilder(); + query.setWhere(queryBuilder().where().ge("created", checkTime)); + + return query.iterator(); + + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/storage/global/GlobalPlayerMuteRecordStorage.java b/common/src/main/java/me/confuser/banmanager/common/storage/global/GlobalPlayerMuteRecordStorage.java new file mode 100644 index 000000000..eb154addf --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/storage/global/GlobalPlayerMuteRecordStorage.java @@ -0,0 +1,44 @@ +package me.confuser.banmanager.common.storage.global; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.data.global.GlobalPlayerMuteRecordData; +import me.confuser.banmanager.common.ormlite.dao.BaseDaoImpl; +import me.confuser.banmanager.common.ormlite.dao.CloseableIterator; +import me.confuser.banmanager.common.ormlite.stmt.QueryBuilder; +import me.confuser.banmanager.common.ormlite.table.DatabaseTableConfig; +import me.confuser.banmanager.common.ormlite.table.TableUtils; +import me.confuser.banmanager.common.util.DateUtils; + +import java.sql.SQLException; + +public class GlobalPlayerMuteRecordStorage extends BaseDaoImpl { + + public GlobalPlayerMuteRecordStorage(BanManagerPlugin plugin) throws SQLException { + super(plugin.getGlobalConn(), (DatabaseTableConfig) plugin.getConfig() + .getGlobalDb() + .getTable("playerUnmutes")); + + if (!this.isTableExists()) { + TableUtils.createTable(connectionSource, tableConfig); + } else { + try { + executeRawNoArgs("ALTER TABLE " + tableConfig.getTableName() + " CHANGE `created` `created` BIGINT UNSIGNED"); + } catch (SQLException e) { + } + } + } + + public CloseableIterator findUnmutes(long fromTime) throws SQLException { + if (fromTime == 0) { + return iterator(); + } + + long checkTime = fromTime + DateUtils.getTimeDiff(); + + QueryBuilder query = queryBuilder(); + query.setWhere(query.where().ge("created", checkTime)); + + return query.iterator(); + + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/storage/global/GlobalPlayerMuteStorage.java b/common/src/main/java/me/confuser/banmanager/common/storage/global/GlobalPlayerMuteStorage.java new file mode 100644 index 000000000..4950d1af0 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/storage/global/GlobalPlayerMuteStorage.java @@ -0,0 +1,56 @@ +package me.confuser.banmanager.common.storage.global; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.data.global.GlobalPlayerMuteData; +import me.confuser.banmanager.common.ormlite.dao.BaseDaoImpl; +import me.confuser.banmanager.common.ormlite.dao.CloseableIterator; +import me.confuser.banmanager.common.ormlite.stmt.QueryBuilder; +import me.confuser.banmanager.common.ormlite.table.DatabaseTableConfig; +import me.confuser.banmanager.common.ormlite.table.TableUtils; +import me.confuser.banmanager.common.util.DateUtils; + +import java.sql.SQLException; + +public class GlobalPlayerMuteStorage extends BaseDaoImpl { + + public GlobalPlayerMuteStorage(BanManagerPlugin plugin) throws SQLException { + super(plugin.getGlobalConn(), (DatabaseTableConfig) plugin.getConfig() + .getGlobalDb() + .getTable("playerMutes")); + + if (!this.isTableExists()) { + TableUtils.createTable(connectionSource, tableConfig); + } else { + // Attempt to add new columns + try { + String update = "ALTER TABLE " + tableConfig + .getTableName() + " ADD COLUMN `soft` TINYINT(1)," + + " ADD KEY `" + tableConfig.getTableName() + "_soft_idx` (`soft`)"; + executeRawNoArgs(update); + } catch (SQLException e) { + } + + try { + executeRawNoArgs("ALTER TABLE " + tableConfig.getTableName() + + " CHANGE `created` `created` BIGINT UNSIGNED," + + " CHANGE `expires` `expires` BIGINT UNSIGNED" + ); + } catch (SQLException e) { + } + } + } + + public CloseableIterator findMutes(long fromTime) throws SQLException { + if (fromTime == 0) { + return iterator(); + } + + long checkTime = fromTime + DateUtils.getTimeDiff(); + + QueryBuilder query = queryBuilder(); + query.setWhere(query.where().ge("created", checkTime)); + + return query.iterator(); + + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/storage/global/GlobalPlayerNoteStorage.java b/common/src/main/java/me/confuser/banmanager/common/storage/global/GlobalPlayerNoteStorage.java new file mode 100644 index 000000000..0e987694f --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/storage/global/GlobalPlayerNoteStorage.java @@ -0,0 +1,44 @@ +package me.confuser.banmanager.common.storage.global; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.data.global.GlobalPlayerNoteData; +import me.confuser.banmanager.common.ormlite.dao.BaseDaoImpl; +import me.confuser.banmanager.common.ormlite.dao.CloseableIterator; +import me.confuser.banmanager.common.ormlite.stmt.QueryBuilder; +import me.confuser.banmanager.common.ormlite.table.DatabaseTableConfig; +import me.confuser.banmanager.common.ormlite.table.TableUtils; +import me.confuser.banmanager.common.util.DateUtils; + +import java.sql.SQLException; + +public class GlobalPlayerNoteStorage extends BaseDaoImpl { + + public GlobalPlayerNoteStorage(BanManagerPlugin plugin) throws SQLException { + super(plugin.getGlobalConn(), (DatabaseTableConfig) plugin.getConfig() + .getGlobalDb() + .getTable("playerNotes")); + + if (!this.isTableExists()) { + TableUtils.createTable(connectionSource, tableConfig); + } else { + try { + executeRawNoArgs("ALTER TABLE " + tableConfig.getTableName() + " CHANGE `created` `created` BIGINT UNSIGNED"); + } catch (SQLException e) { + } + } + } + + public CloseableIterator findNotes(long fromTime) throws SQLException { + if (fromTime == 0) { + return iterator(); + } + + long checkTime = fromTime + DateUtils.getTimeDiff(); + + QueryBuilder query = queryBuilder(); + query.setWhere(queryBuilder().where().ge("created", checkTime)); + + return query.iterator(); + + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/storage/mariadb/MariaDBDatabase.java b/common/src/main/java/me/confuser/banmanager/common/storage/mariadb/MariaDBDatabase.java new file mode 100644 index 000000000..afe75ccca --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/storage/mariadb/MariaDBDatabase.java @@ -0,0 +1,10 @@ +package me.confuser.banmanager.common.storage.mariadb; + +import me.confuser.banmanager.common.ormlite.db.MariaDbDatabaseType; + +public class MariaDBDatabase extends MariaDbDatabaseType { + + public MariaDBDatabase() { + setCreateTableSuffix("ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci"); + } +} diff --git a/src/main/java/me/confuser/banmanager/storage/mysql/ByteArray.java b/common/src/main/java/me/confuser/banmanager/common/storage/mysql/ByteArray.java similarity index 69% rename from src/main/java/me/confuser/banmanager/storage/mysql/ByteArray.java rename to common/src/main/java/me/confuser/banmanager/common/storage/mysql/ByteArray.java index 00542a334..3cf8c3cca 100644 --- a/src/main/java/me/confuser/banmanager/storage/mysql/ByteArray.java +++ b/common/src/main/java/me/confuser/banmanager/common/storage/mysql/ByteArray.java @@ -1,7 +1,8 @@ -package me.confuser.banmanager.storage.mysql; +package me.confuser.banmanager.common.storage.mysql; -import com.j256.ormlite.field.SqlType; -import com.j256.ormlite.field.types.ByteArrayType; + +import me.confuser.banmanager.common.ormlite.field.SqlType; +import me.confuser.banmanager.common.ormlite.field.types.ByteArrayType; public class ByteArray extends ByteArrayType { diff --git a/common/src/main/java/me/confuser/banmanager/common/storage/mysql/IpAddress.java b/common/src/main/java/me/confuser/banmanager/common/storage/mysql/IpAddress.java new file mode 100644 index 000000000..07230a2ec --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/storage/mysql/IpAddress.java @@ -0,0 +1,49 @@ +package me.confuser.banmanager.common.storage.mysql; + +import lombok.SneakyThrows; +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.ipaddr.AddressValueException; +import me.confuser.banmanager.common.ipaddr.IPAddress; +import me.confuser.banmanager.common.ipaddr.IPAddressNetwork; +import me.confuser.banmanager.common.ormlite.field.FieldType; +import me.confuser.banmanager.common.ormlite.field.SqlType; +import me.confuser.banmanager.common.ormlite.field.types.ByteArrayType; +import me.confuser.banmanager.common.util.IPUtils; + +public class IpAddress extends ByteArrayType { + + private static final IpAddress singleTon = new IpAddress(); + + protected IpAddress() { + super(SqlType.BYTE_ARRAY, new Class[0]); + } + + @Override + public Object javaToSqlArg(FieldType fieldType, Object javaObject) { + IPAddress value = (IPAddress) javaObject; + + if (value == null) return null; + + return value.getBytes(); + } + + @SneakyThrows + @Override + public Object sqlArgToJava(FieldType fieldType, Object sqlArg, int columnPos) { + if (sqlArg == null) return null; + + byte[] value = (byte[]) sqlArg; + + try { + return new IPAddressNetwork.IPAddressGenerator().from(value).getLower(); + } catch (AddressValueException e) { + return IPUtils.toIPAddress("127.0.0.1"); + } + + } + + /* This cannot be lombok. */ + public static IpAddress getSingleton() { + return singleTon; + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/storage/mysql/MySQLDatabase.java b/common/src/main/java/me/confuser/banmanager/common/storage/mysql/MySQLDatabase.java new file mode 100644 index 000000000..968092e9f --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/storage/mysql/MySQLDatabase.java @@ -0,0 +1,17 @@ +package me.confuser.banmanager.common.storage.mysql; + +import me.confuser.banmanager.common.ormlite.db.MysqlDatabaseType; + +public class MySQLDatabase extends MysqlDatabaseType { + + private final static String DRIVER_CLASS_NAME = "me.confuser.banmanager.common.mysql.cj.jdbc.Driver"; + + public MySQLDatabase() { + setCreateTableSuffix("ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci"); + } + + @Override + protected String getDriverClassName() { + return DRIVER_CLASS_NAME; + } +} diff --git a/src/main/java/me/confuser/banmanager/util/DateUtils.java b/common/src/main/java/me/confuser/banmanager/common/util/DateUtils.java similarity index 86% rename from src/main/java/me/confuser/banmanager/util/DateUtils.java rename to common/src/main/java/me/confuser/banmanager/common/util/DateUtils.java index f2e0f60cb..f43c50608 100644 --- a/src/main/java/me/confuser/banmanager/util/DateUtils.java +++ b/common/src/main/java/me/confuser/banmanager/common/util/DateUtils.java @@ -1,17 +1,14 @@ -package me.confuser.banmanager.util; +package me.confuser.banmanager.common.util; -import com.j256.ormlite.dao.GenericRawResults; import lombok.Getter; -import me.confuser.banmanager.BanManager; -import me.confuser.bukkitutil.Message; -import java.sql.SQLException; +import java.time.Instant; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; -import static java.lang.Long.parseLong; - public class DateUtils { private static final List times = Arrays.asList( @@ -26,7 +23,6 @@ public class DateUtils { .asList("year", "month", "week", "day", "hour", "minute", "second"); private static final List shortTimesString = Arrays .asList("y", "mo", "w", "d", "h", "m", "s"); - private static BanManager plugin = BanManager.getPlugin(); @Getter private static long timeDiff = 0; private static Pattern timePattern = Pattern @@ -94,7 +90,7 @@ public static String getDifferenceFormat(long timestamp) { // Copyright essentials, all credits to them for this. public static long parseDateDiff(String time, boolean future) throws Exception { // Support raw timestamps - if (time.length() == 10) { + if (time.length() >= 10) { try { long timestamp = Long.parseLong(time); @@ -151,11 +147,8 @@ public static long parseDateDiff(String time, boolean future) throws Exception { break; } } - if (!found) { - throw new Exception("Illegal Date"); - } - if (years > 20) { + if (!found) { throw new Exception("Illegal Date"); } @@ -184,16 +177,13 @@ public static long parseDateDiff(String time, boolean future) throws Exception { return c.getTimeInMillis() / 1000L; } - public static long findTimeDiff() throws SQLException { - String query = "SELECT UNIX_TIMESTAMP() - ? as mysqlTime"; - - GenericRawResults results = plugin.getPlayerStorage() - .queryRaw(query, String.valueOf(System.currentTimeMillis() / 1000L)); - - timeDiff = parseLong(results.getFirstResult()[0]); + public static String format(String pattern, long timestamp) { + return format(pattern, timestamp, ZoneId.systemDefault()); + } - results.close(); + public static String format(String pattern, long timestamp, ZoneId zoneId) { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern); - return timeDiff; + return Instant.ofEpochSecond(timestamp).atZone(zoneId).format(formatter); } } diff --git a/common/src/main/java/me/confuser/banmanager/common/util/IPUtils.java b/common/src/main/java/me/confuser/banmanager/common/util/IPUtils.java new file mode 100644 index 000000000..0961bbea7 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/util/IPUtils.java @@ -0,0 +1,52 @@ +package me.confuser.banmanager.common.util; + +import me.confuser.banmanager.common.ipaddr.AddressStringException; +import me.confuser.banmanager.common.ipaddr.IPAddress; +import me.confuser.banmanager.common.ipaddr.IPAddressNetwork; +import me.confuser.banmanager.common.ipaddr.IPAddressString; +import me.confuser.banmanager.common.ipaddr.ipv4.IPv4AddressSeqRange; +import me.confuser.banmanager.common.ipaddr.ipv6.IPv6AddressSeqRange; + +import java.net.InetAddress; + +public class IPUtils { + + public static byte[] toBytes(String ip) { + return toIPAddress(ip).getBytes(); + } + + public static String toString(byte[] ip) { + return new IPAddressNetwork.IPAddressGenerator().from(ip).getLower().toString(); + } + + public static boolean isInRange(IPAddress fromIp, IPAddress toIp, IPAddress ip) { + if (!fromIp.getIPVersion().equals(toIp.getIPVersion())) return false; + if (!fromIp.getIPVersion().equals(ip.getIPVersion())) return false; + + if (ip.isIPv4()) { + return new IPv4AddressSeqRange(fromIp.toIPv4(), toIp.toIPv4()).contains(ip); + } else { + return new IPv6AddressSeqRange(fromIp.toIPv6(), toIp.toIPv6()).contains(ip); + } + } + + public static IPAddress toIPAddress(InetAddress address) { + return new IPAddressNetwork.IPAddressGenerator().from(address).getLower(); + } + + public static IPAddress toIPAddress(byte[] bytes) { + return new IPAddressNetwork.IPAddressGenerator().from(bytes).getLower(); + } + + public static boolean isValid(String ip) { + return new IPAddressString(ip).isValid(); + } + + public static IPAddress toIPAddress(String ip) { + try { + return new IPAddressString(ip).toAddress().getLower(); + } catch (AddressStringException e) { + return null; + } + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/util/Message.java b/common/src/main/java/me/confuser/banmanager/common/util/Message.java new file mode 100644 index 000000000..a2495f598 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/util/Message.java @@ -0,0 +1,118 @@ +package me.confuser.banmanager.common.util; + +import lombok.EqualsAndHashCode; +import lombok.Getter; +import me.confuser.banmanager.common.CommonLogger; +import me.confuser.banmanager.common.CommonPlayer; +import me.confuser.banmanager.common.commands.CommonSender; +import me.confuser.banmanager.common.configs.Config; +import me.confuser.banmanager.common.configuration.file.YamlConfiguration; + +import java.util.HashMap; + +@EqualsAndHashCode +public class Message { + + private static HashMap messages = new HashMap<>(10); + private static CommonLogger logger; + + @Getter + private String key; + private String message; + + public Message(String key) { + this.key = key; + this.message = messages.get(key); + + if (this.message == null) { + logger.warning("Missing " + key + " message"); + this.message = ""; + } + } + + public Message(String key, String message) { + if (messages.containsKey(key)) { + logger.warning(key + " message already exists"); + return; + } + + this.key = key; + this.message = message; + messages.put(key, message); + + } + + public static Message get(String key) { + return new Message(key); + } + + public static String getString(String key) { + return messages.get(key); + } + + public static void load(YamlConfiguration config, CommonLogger commonLogger) { + logger = commonLogger; + messages.clear(); + + for (String key : config.getConfigurationSection("messages").getKeys(true)) { + messages.put(key, config.getString("messages." + key).replace("\\n", "\n")); + } + } + + public static void load(Config config) { + load(config.conf, config.getLogger()); + } + + public Message replace(CharSequence oldChar, CharSequence newChar) { + message = this.message.replace(oldChar, newChar); + + return this; + } + + public Message set(String token, String replace) { + return replace("[" + token + "]", replace); + } + + public Message set(String token, Integer replace) { + return replace("[" + token + "]", replace.toString()); + } + + public Message set(String token, Double replace) { + return replace("[" + token + "]", replace.toString()); + } + + public Message set(String token, Long replace) { + return replace("[" + token + "]", replace.toString()); + } + + public Message set(String token, Float replace) { + return replace("[" + token + "]", replace.toString()); + } + + public boolean sendTo(CommonSender sender) { + if (sender == null) return false; + + sender.sendMessage(message); + + return true; + } + + public boolean sendTo(CommonPlayer player) { + if (player == null) return false; + if (!player.isOnline()) return false; + + player.sendMessage(message); + + return true; + } + + public static boolean isJSONMessage(String message) { + return message.startsWith("{") && message.endsWith("}") || message.startsWith("[") && message.endsWith("]"); + } + + @Override + public String toString() { + return message; + } +} + diff --git a/common/src/main/java/me/confuser/banmanager/common/util/ReportList.java b/common/src/main/java/me/confuser/banmanager/common/util/ReportList.java new file mode 100644 index 000000000..1e1ea38e7 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/util/ReportList.java @@ -0,0 +1,56 @@ +package me.confuser.banmanager.common.util; + +import lombok.Getter; +import me.confuser.banmanager.common.CommonPlayer; +import me.confuser.banmanager.common.commands.CommonSender; +import me.confuser.banmanager.common.data.PlayerReportData; +import me.confuser.banmanager.common.kyori.text.event.ClickEvent; +import me.confuser.banmanager.common.kyori.text.serializer.legacy.LegacyComponentSerializer; + +import java.util.List; + +public class ReportList { + + @Getter + private List list; + @Getter + private long count; + @Getter + private long maxPage; + + public ReportList(List list, long count, long maxPage) { + this.list = list; + this.count = count; + this.maxPage = maxPage; + } + + public void send(CommonSender sender, int page) { + String dateTimeFormat = Message.getString("report.list.row.dateTimeFormat"); + + Message.get("report.list.row.header") + .set("page", page) + .set("maxPage", getMaxPage()) + .set("count", getCount()) + .sendTo(sender); + + for (PlayerReportData report : getList()) { + String message = Message.get("report.list.row.all") + .set("id", report.getId()) + .set("state", report.getState().getName()) + .set("player", report.getPlayer().getName()) + .set("actor", report.getActor().getName()) + .set("reason", report.getReason()) + .set("created", DateUtils.format(dateTimeFormat, report.getCreated())) + .set("updated", DateUtils.format(dateTimeFormat, report.getUpdated())).toString(); + + if (sender.isConsole()) { + sender.sendMessage(message); + } else { + ((CommonPlayer) sender).sendJSONMessage( + LegacyComponentSerializer.legacy('&').deserialize( + message).clickEvent(ClickEvent.runCommand("/reports info " + report.getId() + ))); + } + } + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/util/StorageUtils.java b/common/src/main/java/me/confuser/banmanager/common/util/StorageUtils.java new file mode 100644 index 000000000..77036c7ba --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/util/StorageUtils.java @@ -0,0 +1,72 @@ +package me.confuser.banmanager.common.util; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.ormlite.field.SqlType; +import me.confuser.banmanager.common.ormlite.stmt.StatementBuilder; +import me.confuser.banmanager.common.ormlite.support.CompiledStatement; +import me.confuser.banmanager.common.ormlite.support.DatabaseConnection; +import me.confuser.banmanager.common.ormlite.support.DatabaseResults; + +import java.io.IOException; +import java.sql.SQLException; + +public class StorageUtils { + + public static void convertIpColumn(BanManagerPlugin plugin, String table, String column) { + convertIpColumn(plugin, table, column, "int"); + } + + public static void convertIpColumn(BanManagerPlugin plugin, String table, String column, String idType) { + try (DatabaseConnection connection = plugin.getLocalConn().getReadWriteConnection(table)) { + if (connection.update("ALTER TABLE `" + table + "` CHANGE COLUMN `" + column + "` `" + column + "` VARBINARY(16) NOT NULL", null, null) != 0) { + plugin.getLogger().info("Converting " + table + " " + column + " data to support IPv6"); + + plugin.getLogger().info("Attempting fast IPv6 conversion..."); + + try { + if (connection + .compileStatement("UPDATE `" + table + "` SET " + column + " = INET6_ATON(INET_NTOA(" + column + "))", StatementBuilder + .StatementType.UPDATE, null, DatabaseConnection.DEFAULT_RESULT_FLAGS, false) + .runUpdate() == 0) { + throw new SQLException("Failed to fast convert, attempting slow conversion..."); + } else { + plugin.getLogger().info("Successfully converted " + table + " " + column + " data to support IPv6"); + } + } catch (Exception e) { + plugin.getLogger().severe("Failed to fast convert due to " + e.getMessage() + ", attempting slow conversion..."); + + DatabaseResults results = connection + .compileStatement("SELECT `id`, INET_NTOA(HEX(UNHEX(CAST(" + column + " AS UNSIGNED)))) FROM `" + table + "`", StatementBuilder + .StatementType.SELECT, null, DatabaseConnection.DEFAULT_RESULT_FLAGS, false) + .runQuery(null); + + while (results.next()) { + CompiledStatement statement = connection + .compileStatement("UPDATE " + table + " SET `" + column + "` = ? WHERE `id` = ?", StatementBuilder + .StatementType.UPDATE, null, DatabaseConnection.DEFAULT_RESULT_FLAGS, false); + + Object id; + + if (idType.equals("int")) { + id = results.getInt(0); + } else { + id = results.getBytes(0); + } + + String ipStr = results.getString(1); + byte[] ip = IPUtils.toBytes(ipStr); + + statement.setObject(0, ip, SqlType.BYTE_ARRAY); + statement.setObject(1, id, idType.equals("int") ? SqlType.INTEGER : SqlType.BYTE_ARRAY); + + if (statement.runUpdate() == 0) { + plugin.getLogger().severe("Unable to convert " + ipStr + " in " + table + " for id " + id); + } + } + } + } + } catch (SQLException | IOException e) { + e.printStackTrace(); + } + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/util/StringUtils.java b/common/src/main/java/me/confuser/banmanager/common/util/StringUtils.java new file mode 100755 index 000000000..4e896011c --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/util/StringUtils.java @@ -0,0 +1,145 @@ +package me.confuser.banmanager.common.util; + +import java.util.ArrayList; +import java.util.List; + +public class StringUtils { + + // From apache commons lang3 + /** + *

Joins the elements of the provided array into a single String + * containing the provided list of elements.

+ * + *

No delimiter is added before or after the list. + * Null objects or empty strings within the array are represented by + * empty strings.

+ * + *
+   * StringUtils.join(null, *)               = null
+   * StringUtils.join([], *)                 = ""
+   * StringUtils.join([null], *)             = ""
+   * StringUtils.join(["a", "b", "c"], ';')  = "a;b;c"
+   * StringUtils.join(["a", "b", "c"], null) = "abc"
+   * StringUtils.join([null, "", "a"], ';')  = ";;a"
+   * 
+ * + * @param array the array of values to join together, may be null + * @param separator the separator character to use + * @param startIndex the first index to start joining from. It is + * an error to pass in a start index past the end of the array + * @param endIndex the index to stop joining from (exclusive). It is + * an error to pass in an end index past the end of the array + * @return the joined String, {@code null} if null array input + */ + public static String join(final Object[] array, String separator, final int startIndex, final int endIndex) { + if (array == null) { + return null; + } + if (separator == null) { + separator = ""; + } + + // endIndex - startIndex > 0: Len = NofStrings *(len(firstString) + len(separator)) + // (Assuming that all Strings are roughly equally long) + final int noOfItems = endIndex - startIndex; + if (noOfItems <= 0) { + return ""; + } + + final StringBuilder buf = new StringBuilder(noOfItems * 16);; + + for (int i = startIndex; i < endIndex; i++) { + if (i > startIndex) { + buf.append(separator); + } + if (array[i] != null) { + buf.append(array[i]); + } + } + + return buf.toString(); + } + + /** + *

Searches a String for substrings delimited by a start and end tag, + * returning all matching substrings in an array.

+ * + *

A {@code null} input String returns {@code null}. + * A {@code null} open/close returns {@code null} (no match). + * An empty ("") open/close returns {@code null} (no match).

+ * + *
+   * StringUtils.substringsBetween("[a][b][c]", "[", "]") = ["a","b","c"]
+   * StringUtils.substringsBetween(null, *, *)            = null
+   * StringUtils.substringsBetween(*, null, *)            = null
+   * StringUtils.substringsBetween(*, *, null)            = null
+   * StringUtils.substringsBetween("", "[", "]")          = []
+   * 
+ * + * @param str the String containing the substrings, null returns null, empty returns empty + * @param open the String identifying the start of the substring, empty returns null + * @param close the String identifying the end of the substring, empty returns null + * @return a String Array of substrings, or {@code null} if no match + */ + public static String[] substringsBetween(final String str, final String open, final String close) { + if (str == null || open == null || open.length() == 0 || close == null || close.length() == 0) { + return null; + } + + final int strLen = str.length(); + + if (strLen == 0) { + return new String[0]; + } + + final int closeLen = close.length(); + final int openLen = open.length(); + final List list = new ArrayList<>(); + int pos = 0; + + while (pos < strLen - closeLen) { + int start = str.indexOf(open, pos); + if (start < 0) { + break; + } + start += openLen; + final int end = str.indexOf(close, start); + if (end < 0) { + break; + } + list.add(str.substring(start, end)); + pos = end + closeLen; + } + + if (list.isEmpty()) { + return null; + } + + return list.toArray(new String[0]); + } + + public static boolean isValidPlayerName(String name, String additionalChars) { + boolean isName = (name.length() <= 16); + + if (!isName) return false; + + char[] nameArray = name.toCharArray(); + + for (char ch : nameArray) { + if (ch >= 'A' && ch <= 'Z') continue; + if (ch >= 'a' && ch <= 'z') continue; + if (ch >= '0' && ch <= '9') continue; + if (ch == '_') continue; + + if (additionalChars != null && additionalChars.length() > 0 && additionalChars.indexOf(ch) != -1) { + continue; + } + + isName = false; + + break; + } + + return isName; + } +} diff --git a/src/main/java/me/confuser/banmanager/util/UUIDProfile.java b/common/src/main/java/me/confuser/banmanager/common/util/UUIDProfile.java similarity index 85% rename from src/main/java/me/confuser/banmanager/util/UUIDProfile.java rename to common/src/main/java/me/confuser/banmanager/common/util/UUIDProfile.java index f237a91e4..ded13742d 100644 --- a/src/main/java/me/confuser/banmanager/util/UUIDProfile.java +++ b/common/src/main/java/me/confuser/banmanager/common/util/UUIDProfile.java @@ -1,4 +1,4 @@ -package me.confuser.banmanager.util; +package me.confuser.banmanager.common.util; import lombok.Getter; diff --git a/common/src/main/java/me/confuser/banmanager/common/util/UUIDUtils.java b/common/src/main/java/me/confuser/banmanager/common/util/UUIDUtils.java new file mode 100644 index 000000000..008c3d74e --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/util/UUIDUtils.java @@ -0,0 +1,104 @@ +package me.confuser.banmanager.common.util; + +import java.io.InputStreamReader; +import java.io.UnsupportedEncodingException; +import java.net.HttpURLConnection; +import java.net.URL; +import java.nio.ByteBuffer; +import java.util.UUID; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.configs.Fetcher; +import me.confuser.banmanager.common.gson.Gson; +import me.confuser.banmanager.common.gson.JsonObject; + +/** + * Based on UUIDFetcher by evilmidget38 + */ +public class UUIDUtils { + private static HttpURLConnection createConnection(String urlStr, String method) throws Exception { + URL url = new URL(urlStr); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setRequestMethod(method); + connection.setRequestProperty("Content-Type", "application/json"); + connection.setUseCaches(false); + connection.setDoInput(true); + + if (method.equals("POST")) connection.setDoOutput(true); + return connection; + } + + private static UUID getUUID(String id) { + return UUID.fromString(id.substring(0, 8) + "-" + id.substring(8, 12) + "-" + id.substring(12, 16) + "-" + id + .substring(16, 20) + "-" + id.substring(20, 32)); + } + + public static byte[] toBytes(UUID uuid) { + ByteBuffer byteBuffer = ByteBuffer.wrap(new byte[16]); + byteBuffer.putLong(uuid.getMostSignificantBits()); + byteBuffer.putLong(uuid.getLeastSignificantBits()); + return byteBuffer.array(); + } + + public static UUID fromBytes(byte[] array) { + if (array.length != 16) { + throw new IllegalArgumentException("Illegal byte array length: " + array.length); + } + ByteBuffer byteBuffer = ByteBuffer.wrap(array); + long mostSignificant = byteBuffer.getLong(); + long leastSignificant = byteBuffer.getLong(); + return new UUID(mostSignificant, leastSignificant); + } + + public static UUIDProfile getUUIDOf(BanManagerPlugin plugin, String name) throws Exception { + if (!plugin.getConfig().isOnlineMode()) { + plugin.getLogger().info("Generating offline UUID for " + name); + + return new UUIDProfile(name, createOfflineUUID(name)); + } + + plugin.getLogger().info("Requesting UUID for " + name); + Fetcher fetcher = plugin.getConfig().getUuidFetcher().getNameToId(); + String url = fetcher.getUrl().replace("[name]", name); + + HttpURLConnection connection = createConnection(url, "GET"); + + int status = connection.getResponseCode(); + + plugin.getLogger().info(url + " " + status); + + if (status != 200) throw new Exception("Error retrieving UUID from " + url); + + JsonObject data = new Gson().fromJson(new InputStreamReader(connection.getInputStream()), + JsonObject.class); + + return new UUIDProfile(name, UUIDUtils.getUUID(data.get(fetcher.getKey()).getAsString())); + } + + public static String getCurrentName(BanManagerPlugin plugin, UUID uuid) throws Exception { + plugin.getLogger().info("Requesting name for " + uuid.toString()); + Fetcher fetcher = plugin.getConfig().getUuidFetcher().getIdToName(); + String url = fetcher.getUrl().replace("[uuid]", uuid.toString()); + + HttpURLConnection connection = createConnection(url, "GET"); + + int status = connection.getResponseCode(); + + plugin.getLogger().info(url + " " + status); + + if (status != 200) throw new Exception("Error retrieving name from " + url); + + JsonObject data = new Gson().fromJson(new InputStreamReader(connection.getInputStream()), + JsonObject.class); + + return data.get(fetcher.getKey()).getAsString(); + } + + public static UUID createOfflineUUID(String name) { + try { + return UUID.nameUUIDFromBytes(("OfflinePlayer:" + name).getBytes("UTF-8")); + } catch (UnsupportedEncodingException e) { + return null; + } + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/util/parsers/InfoCommandParser.java b/common/src/main/java/me/confuser/banmanager/common/util/parsers/InfoCommandParser.java new file mode 100644 index 000000000..aa228db79 --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/util/parsers/InfoCommandParser.java @@ -0,0 +1,50 @@ +package me.confuser.banmanager.common.util.parsers; + +import lombok.Getter; +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.cli.Argument; +import me.confuser.banmanager.common.commands.CommandParser; + +public class InfoCommandParser extends CommandParser { + + @Argument(alias = "k") + @Getter + private boolean kicks; + + @Argument(alias = "w") + @Getter + private boolean warnings; + + @Argument(alias = "b") + @Getter + private boolean bans; + + @Argument(alias = "m") + @Getter + private boolean mutes; + + @Argument(alias = "n") + @Getter + private boolean notes; + + @Argument(alias = "t") + @Getter + private String time; + + @Argument(alias = "i") + @Getter + private Integer ips; + + @Argument(alias = "r") + @Getter + private boolean reports; + + public InfoCommandParser(BanManagerPlugin plugin, String[] args) { + super(plugin, args); + } + + public InfoCommandParser(BanManagerPlugin plugin, String[] args, int start) { + super(plugin, args, start); + } + +} diff --git a/common/src/main/java/me/confuser/banmanager/common/util/parsers/UnbanCommandParser.java b/common/src/main/java/me/confuser/banmanager/common/util/parsers/UnbanCommandParser.java new file mode 100644 index 000000000..015ee5d5b --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/util/parsers/UnbanCommandParser.java @@ -0,0 +1,21 @@ +package me.confuser.banmanager.common.util.parsers; + +import lombok.Getter; +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.cli.Argument; +import me.confuser.banmanager.common.commands.CommandParser; + +public class UnbanCommandParser extends CommandParser { + + @Argument(alias = "d") + @Getter + private boolean delete; + + public UnbanCommandParser(BanManagerPlugin plugin, String[] args) { + super(plugin, args); + } + + public UnbanCommandParser(BanManagerPlugin plugin, String[] args, int start) { + super(plugin, args, start); + } +} diff --git a/common/src/main/java/me/confuser/banmanager/common/util/parsers/WarnCommandParser.java b/common/src/main/java/me/confuser/banmanager/common/util/parsers/WarnCommandParser.java new file mode 100644 index 000000000..e89849b8e --- /dev/null +++ b/common/src/main/java/me/confuser/banmanager/common/util/parsers/WarnCommandParser.java @@ -0,0 +1,26 @@ +package me.confuser.banmanager.common.util.parsers; + +import lombok.Getter; +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.cli.Argument; +import me.confuser.banmanager.common.commands.CommandParser; + +public class WarnCommandParser extends CommandParser { + + @Argument(alias = "p") + @Getter + private Double points; + + public WarnCommandParser(BanManagerPlugin plugin, String[] args) { + super(plugin, args); + + if (points == null) points = 1D; + } + + public WarnCommandParser(BanManagerPlugin plugin, String[] args, int start) { + super(plugin, args, start); + + if (points == null) points = 1D; + } + +} diff --git a/common/src/main/resources/bungeecord.yml b/common/src/main/resources/bungeecord.yml new file mode 100644 index 000000000..292453ceb --- /dev/null +++ b/common/src/main/resources/bungeecord.yml @@ -0,0 +1,2 @@ +features: + commands: true \ No newline at end of file diff --git a/src/main/resources/config.yml b/common/src/main/resources/config.yml similarity index 81% rename from src/main/resources/config.yml rename to common/src/main/resources/config.yml index d4cf29c26..94594f8cf 100644 --- a/src/main/resources/config.yml +++ b/common/src/main/resources/config.yml @@ -2,7 +2,7 @@ debug: false databases: # Local Database is always required. If not enabled, plugin will disable on startup. local: - enabled: false + storageType: 'h2' host: 127.0.0.1 port: 3306 name: local_bans @@ -10,9 +10,10 @@ databases: password: '' maxConnections: 10 useSSL: false + allowPublicKeyRetrieval: false verifyServerCertificate: false - # Used to detect slow running queries/unclosed resources - leakDetection: 3000 + maxLifetime: 1800000 + connectionTimeout: 30000 tables: players: bm_players playerBans: bm_player_bans @@ -42,6 +43,7 @@ databases: # This will enable /*all commands, e.g. /banall, /muteall global: enabled: false + storageType: 'mysql' host: 127.0.0.1 port: 3306 name: global_bans @@ -49,9 +51,12 @@ databases: password: '' maxConnections: 10 useSSL: false + allowPublicKeyRetrieval: false verifyServerCertificate: false # Used to detect slow running queries/unclosed resources leakDetection: 3000 + maxLifetime: 1800000 + connectionTimeout: 30000 tables: playerBans: bm_player_ban_all playerUnbans: bm_player_unban_all @@ -108,13 +113,18 @@ timeLimits: nameBans: # Moderator: 1d -# To prevent duplicate reports you can set a cooldown to limit the amount in seconds before a player can be reported again +# To prevent duplicate punishments you can set a cooldown to limit the amount in seconds before a player can be punished again # Set to 0 to disable -reportCooldown: 10 - -# To prevent duplicate warnings you can set a cooldown to limit the amount in seconds before a player can be warned again -# Set to 0 to disable -warningCooldown: 10 +cooldowns: + ban: 10 + tempban: 10 + mute: 10 + tempmute: 10 + banip: 10 + tempbanip: 10 + warn: 10 + tempwarn: 10 + report: 10 # Commands to execute when a player reaches a certain number of warning points warningActions: @@ -134,7 +144,7 @@ warningMute: false hooks: enabled: false # Can use ban, tempban, unban, mute, tempmute, unmute, warn, tempwarn, ipban, tempipban, unbanip, iprangeban, - # tempiprangeban, unbaniprange, note + # tempiprangeban, unbaniprange, note, report events: # ban: # pre: @@ -158,6 +168,10 @@ punishAlts: false # Automatically deny players from joining that have the same ip address as a banned player denyAlts: false +# Time period (in seconds) a player's ip should be classified as an alt of another player +# Set to 0 for an ip address to always be associated to a player +timeAssociatedAlts: 0 + # Keep records for number of days, use 0 to never delete cleanUp: kicks: 30 @@ -167,6 +181,7 @@ cleanUp: muteRecords: 0 readWarnings: 0 unreadWarnings: 0 + playerHistory: 0 # Only purges ip addresses that are not actively banned # Maximum amount of players allowed from a single ip, set to 0 to disable maxOnlinePerIp: 0 @@ -199,4 +214,19 @@ onlineMode: true # high # highest # monitor -chatPriority: normal \ No newline at end of file +chatPriority: normal + +# Don't execute actions with an invalid reason. E.g. /ban confuser #speel-erorr will create a error. +blockInvalidReasons: false + +# Used for online mode servers only +uuidFetcher: + idToName: + url: 'https://sessionserver.mojang.com/session/minecraft/profile/[uuid]' + key: name + nameToId: + url: 'https://api.mojang.com/users/profiles/minecraft/[name]' + key: id + +# Allows supporting Bedrock names (via GeyserMC) +geyserPrefix: '.' diff --git a/src/main/resources/console.yml b/common/src/main/resources/console.yml similarity index 100% rename from src/main/resources/console.yml rename to common/src/main/resources/console.yml diff --git a/common/src/main/resources/discord.yml b/common/src/main/resources/discord.yml new file mode 100644 index 000000000..e2a312f1b --- /dev/null +++ b/common/src/main/resources/discord.yml @@ -0,0 +1,255 @@ +# More info at https://banmanagement.com/docs/banmanager/configuration/discord-yml +hooks: + enabled: false + punishments: + ban: + url: 'https://discord.com/api/webhooks/changeMe' + ignoreSilent: true + payload: + embeds: + - title: '[player] banned' + description: '[reason]' + color: 10033947 + author: + name: BanManager + url: 'https://banmanagement.com' + icon_url: 'https://banmanagement.com/images/banmanager-icon.png' + footer: + text: 'By: [actor]' + icon_url: 'https://crafthead.net/helm/[actorId]/128' + thumbnail: + url: 'https://crafthead.net/helm/[playerId]/128' + tempban: + url: 'https://discord.com/api/webhooks/changeMe' + ignoreSilent: true + payload: + embeds: + - title: '[player] banned' + description: '[reason]' + color: 15680580 + fields: + - name: Duration + value: '[expires]' + inline: true + author: + name: BanManager + url: 'https://banmanagement.com' + icon_url: 'https://banmanagement.com/images/banmanager-icon.png' + footer: + text: 'By: [actor]' + icon_url: 'https://crafthead.net/helm/[actorId]/128' + thumbnail: + url: 'https://crafthead.net/helm/[playerId]/128' + unban: + url: 'https://discord.com/api/webhooks/changeMe' + ignoreSilent: true + payload: + embeds: + - title: '[player] unbanned' + description: '[reason]' + color: 2278750 + author: + name: BanManager + url: 'https://banmanagement.com' + icon_url: 'https://banmanagement.com/images/banmanager-icon.png' + footer: + text: 'By: [actor]' + icon_url: 'https://crafthead.net/helm/[actorId]/128' + thumbnail: + url: 'https://crafthead.net/helm/[playerId]/128' + banip: + url: 'https://discord.com/api/webhooks/changeMe' + ignoreSilent: true + payload: + embeds: + - title: '[ip] Banned' + description: '[reason]' + color: 10033947 + author: + name: BanManager + url: 'https://banmanagement.com' + icon_url: 'https://banmanagement.com/images/banmanager-icon.png' + footer: + text: 'By: [actor]' + icon_url: 'https://crafthead.net/helm/[actorId]/128' + thumbnail: + url: 'https://crafthead.net/helm/[playerId]/128' + tempbanip: + url: 'https://discord.com/api/webhooks/changeMe' + ignoreSilent: true + payload: + embeds: + - title: '[ip] banned' + description: '[reason]' + color: 15680580 + fields: + - name: Duration + value: '[expires]' + inline: true + author: + name: BanManager + url: 'https://banmanagement.com' + icon_url: 'https://banmanagement.com/images/banmanager-icon.png' + footer: + text: 'By: [actor]' + icon_url: 'https://crafthead.net/helm/[actorId]/128' + thumbnail: + url: 'https://crafthead.net/helm/[playerId]/128' + unbanip: + url: 'https://discord.com/api/webhooks/changeMe' + ignoreSilent: true + payload: + embeds: + - title: '[ip] Unbanned' + description: '[reason]' + color: 2278750 + author: + name: BanManager + url: 'https://banmanagement.com' + icon_url: 'https://banmanagement.com/images/banmanager-icon.png' + footer: + text: 'By: [actor]' + icon_url: 'https://crafthead.net/helm/[actorId]/128' + thumbnail: + url: 'https://crafthead.net/helm/[playerId]/128' + kick: + url: 'https://discord.com/api/webhooks/changeMe' + ignoreSilent: true + payload: + embeds: + - title: '[player] kicked' + description: '[reason]' + color: 16776960 + author: + name: BanManager + url: 'https://banmanagement.com' + icon_url: 'https://banmanagement.com/images/banmanager-icon.png' + footer: + text: 'By: [actor]' + icon_url: 'https://crafthead.net/helm/[actorId]/128' + thumbnail: + url: 'https://crafthead.net/helm/[playerId]/128' + mute: + url: 'https://discord.com/api/webhooks/changeMe' + ignoreSilent: true + payload: + embeds: + - title: '[player] muted' + description: '[reason]' + color: 3616931 + author: + name: BanManager + url: 'https://banmanagement.com' + icon_url: 'https://banmanagement.com/images/banmanager-icon.png' + footer: + text: 'By: [actor]' + icon_url: 'https://crafthead.net/helm/[actorId]/128' + thumbnail: + url: 'https://crafthead.net/helm/[playerId]/128' + tempmute: + url: 'https://discord.com/api/webhooks/changeMe' + ignoreSilent: true + payload: + embeds: + - title: '[player] muted' + description: '[reason]' + color: 6514417 + fields: + - name: Duration + value: '[expires]' + inline: true + author: + name: BanManager + url: 'https://banmanagement.com' + icon_url: 'https://banmanagement.com/images/banmanager-icon.png' + footer: + text: 'By: [actor]' + icon_url: 'https://crafthead.net/helm/[actorId]/128' + thumbnail: + url: 'https://crafthead.net/helm/[playerId]/128' + unmute: + url: 'https://discord.com/api/webhooks/changeMe' + ignoreSilent: true + payload: + embeds: + - title: '[player] unmuted' + description: '[reason]' + color: 2278750 + author: + name: BanManager + url: 'https://banmanagement.com' + icon_url: 'https://banmanagement.com/images/banmanager-icon.png' + footer: + text: 'By: [actor]' + icon_url: 'https://crafthead.net/helm/[actorId]/128' + thumbnail: + url: 'https://crafthead.net/helm/[playerId]/128' + tempwarning: + url: 'https://discord.com/api/webhooks/changeMe' + ignoreSilent: true + payload: + embeds: + - title: '[player] warned' + description: '[reason]' + color: 16096779 + fields: + - name: Duration + value: '[expires]' + inline: true + - name: Points + value: '[points]' + inline: true + author: + name: BanManager + url: 'https://banmanagement.com' + icon_url: 'https://banmanagement.com/images/banmanager-icon.png' + footer: + text: 'By: [actor]' + icon_url: 'https://crafthead.net/helm/[actorId]/128' + thumbnail: + url: 'https://crafthead.net/helm/[playerId]/128' + warning: + url: 'https://discord.com/api/webhooks/changeMe' + ignoreSilent: true + payload: + embeds: + - title: '[player] warned' + description: '[reason]' + color: 9584654 + fields: + - name: Points + value: '[points]' + inline: true + author: + name: BanManager + url: 'https://banmanagement.com' + icon_url: 'https://banmanagement.com/images/banmanager-icon.png' + footer: + text: 'By: [actor]' + icon_url: 'https://crafthead.net/helm/[actorId]/128' + thumbnail: + url: 'https://crafthead.net/helm/[playerId]/128' + report: + url: 'https://discord.com/api/webhooks/changeMe' + ignoreSilent: true + payload: + embeds: + - title: '[player] reported' + description: '[reason]' + color: 16737894 + fields: + - name: '[player] location' + value: '[playerX] [playerY] [playerZ] [playerPitch] [playerYaw] [playerWorld]' + inline: true + - name: '[actor] location' + value: '[actorX] [actorY] [actorZ] [actorPitch] [actorYaw] [actorWorld]' + inline: true + author: + name: BanManager + url: 'https://banmanagement.com' + icon_url: 'https://banmanagement.com/images/banmanager-icon.png' + footer: + text: 'By: [actor]' + icon_url: 'https://crafthead.net/helm/[actorId]/128' + thumbnail: + url: 'https://crafthead.net/helm/[playerId]/128' diff --git a/src/main/resources/exemptions.yml b/common/src/main/resources/exemptions.yml similarity index 77% rename from src/main/resources/exemptions.yml rename to common/src/main/resources/exemptions.yml index 374741cbe..d1efd21bb 100644 --- a/src/main/resources/exemptions.yml +++ b/common/src/main/resources/exemptions.yml @@ -3,8 +3,10 @@ # uuid-here: # ban: true # tempban: true +# baniprange: true +# tempbaniprange: true # mute: true # tempmute: true # warn: true # tempwarn: true -# alts: true \ No newline at end of file +# alts: true diff --git a/common/src/main/resources/geoip.yml b/common/src/main/resources/geoip.yml new file mode 100644 index 000000000..de60b4da6 --- /dev/null +++ b/common/src/main/resources/geoip.yml @@ -0,0 +1,13 @@ +enabled: false +download: + city: 'https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-City&license_key=[licenseKey]&suffix=tar.gz' + country: 'https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-Country&license_key=[licenseKey]&suffix=tar.gz' + lastUpdated: 0 + licenseKey: '' +# Allow only certain countries on the server +countries: +# allow or deny + type: 'deny' +# Use ISO codes, https://www.iso.org/obp/ui/#search e.g. United Kingdom is GB + list: + # - GB diff --git a/src/main/resources/messages.yml b/common/src/main/resources/messages.yml similarity index 82% rename from src/main/resources/messages.yml rename to common/src/main/resources/messages.yml index c6fafa8cf..27510dfe0 100644 --- a/src/main/resources/messages.yml +++ b/common/src/main/resources/messages.yml @@ -7,6 +7,7 @@ messages: duplicateIP: '&cWarning: [player] has the same IP as the following banned players:\n&6[players]' + duplicateIPAlts: '&cWarning: [player] has the same IP as the following players:\n&6[players]' configReloaded: '&aConfiguration reloaded successfully!' deniedNotify: player: '&cWarning: [player] attempted to join the server but was denied due to &4[reason]' @@ -37,7 +38,7 @@ messages: limit: '&cYou cannot perform this action for that length of time' none: 'none' -# General command text + # General command text sender: error: notFound: '&c[player] not found, are you sure they exist?' @@ -48,7 +49,8 @@ messages: offlinePermission: '&cYou are not allowed to perform this action on an offline player' exempt: '&c[player] is exempt from that action' noPermission: '&cYou do not have permission to perform that action' -# Commands + invalidReason: '&c[reason] is no valid reason.' + # Commands alts: header: 'Possible alts found:' @@ -71,17 +73,22 @@ messages: ip: started: '&aIP ban import started' finished: '&aIP ban import finished' + advancedban: + started: '&aAdvancedBan import started' + finished: '&aAdvancedBan import finished' + h2: + started: '&aH2 import started' + finished: '&aH2 import finished, please restart the server' info: error: - incorrectFlagUsage: '&cA flag has been incorrectly used' invalidIndex: '&cInvalid player option used' - indexRequired: '&cMultiple players named [name], found, please select a player by providing an index between 1 and [size], e.g. /bminfo [name] 1' + indexRequired: '&cMultiple players named [name] found, please select a player by providing an index between 1 and [size], e.g. /bminfo [name] 1' index: '&7#[index] - &6[name] - &4[uuid]' stats: player: '&6[player] has been banned [bans] times, muted [mutes] times, kicked [kicks] times and warned [warns] - times ([warnPoints] Points)' - ip: '&6This ip has been banned [bans] times' + times ([warnPoints] Points), has [notes] notes and been reported [reports] times' + ip: '&6This ip has been banned [bans] times, muted [mutes] times and range banned [rangebans] times' connection: '&6Their last connection was with [ip] on [lastSeen]' geoip: 'Country: [country] City: [city]' ban: @@ -92,12 +99,20 @@ messages: permanent: '&6Currently banned for &4[reason]&6 by [actor] at [created]' temporary: '&6Currently banned for &4[reason]&6 by [actor] at [created] which expires in [expires]' dateTimeFormat: 'dd-MM-yyyy HH:mm:ss' + iprangeban: + permanent: '&6[from] - [to] banned for &4[reason]&6 by [actor] at [created]' + temporary: '&6[from] - [to] banned for &4[reason]&6 by [actor] at [created] which expires in [expires]' + dateTimeFormat: 'dd-MM-yyyy HH:mm:ss' + ipmute: + permanent: '&6Currently muted for &4[reason]&6 by [actor] at [created]' + temporary: '&6Currently muted for &4[reason]&6 by [actor] at [created] which expires in [expires]' + dateTimeFormat: 'dd-MM-yyyy HH:mm:ss' mute: permanent: '&6Currently muted for &4[reason]&6 by [actor] at [created]' temporary: '&6Currently muted for &4[reason]&6 by [actor] at [created] which expires in [expires]' dateTimeFormat: 'dd-MM-yyyy HH:mm:ss' website: - player: 'http://yourdomain.com/index.php?action=viewplayer&player=[player]&server=0' + player: 'https://yourdomain.com/player/[uuid]' ip: 'http://yourdomain.com/index.php?action=viewip&ip=[ip]&server=0' history: row: '&7#[id] &a[&f[type]&a] &6[actor]&f [meta] [reason] - &e[created]' @@ -115,13 +130,23 @@ messages: noReason: '&6[player] has been kicked by [actor]' reason: '&6[player] has been kicked by [actor] for &4[reason]' + kickall: + player: + noReason: '&6You have been kicked' + reason: '&6You have been kicked for &4[reason]' + notify: + noReason: 'All players have been kicked by [actor]' + reason: 'All players have been kicked by [actor] for &4[reason]' + ban: player: disallowed: '&6You have been banned from this server for &4[reason]' kick: '&6You have been banned permanently for &4[reason]' + dateTimeFormat: 'yyyy-MM-dd HH:mm:ss' notify: '&6[player] has been permanently banned by [actor] for &4[reason]' error: exists: '&c[player] is already banned' + cooldown: '&cThis player was banned too recently, try again later' banall: notify: '&6[player] will be permanently banned by [actor] for &4[reason]' @@ -130,6 +155,7 @@ messages: player: disallowed: '&6You have been temporarily banned from this server for &4[reason] \n&6It expires in [expires]' kick: '&6You have been temporarily banned for &4[reason]' + dateTimeFormat: 'yyyy-MM-dd HH:mm:ss' notify: '&6[player] has been temporarily banned for [expires] by [actor] for &4[reason]' tempbanall: @@ -148,15 +174,16 @@ messages: player: blocked: '&cYou may not use the [command] command whilst muted!' disallowed: '&6You have been permanently muted for &4[reason] &6by [actor]' - broadcast: '&4[Muted]&r [message]' + broadcast: '&4[Muted] [player]&7 [message]' notify: '&6[player] has been permanently muted by [actor] for &4[reason]' error: exists: '&c[player] is already muted' + cooldown: '&cThis player was muted too recently, try again later' muteip: ip: - disallowed: '&6You have been banned from this server for &4[reason]' - broadcast: '&4[Muted]&r [message]' + disallowed: '&6You have been permanently muted for &4[reason] &6by [actor]' + broadcast: '&4[Muted] [player]&7 [message]' notify: '&6[ip] ([players]) have been permanently muted by [actor] for &4[reason]' error: exists: '&c[ip] is already muted' @@ -201,6 +228,7 @@ messages: name: disallowed: '&6You have been banned from this server for &4[reason]' kick: '&6You have been banned permanently for &4[reason]' + dateTimeFormat: 'yyyy-MM-dd HH:mm:ss' notify: '&6Name [name] has been permanently banned by [actor] for &4[reason]' error: exists: '&cName [name] is already banned' @@ -209,6 +237,7 @@ messages: name: disallowed: '&6You have been banned from this server for &4[reason] \n&6It expires in [expires]' kick: '&6You have been temporarily banned for &4[reason]' + dateTimeFormat: 'yyyy-MM-dd HH:mm:ss' notify: '&6Name [name] has been temporarily banned for [expires] by [actor] for &4[reason]' unbanname: @@ -220,9 +249,11 @@ messages: ip: disallowed: '&6You have been banned from this server for &4[reason]' kick: '&6You have been banned permanently for &4[reason]' + dateTimeFormat: 'yyyy-MM-dd HH:mm:ss' notify: '&6[ip] ([players]) has been permanently banned by [actor] for &4[reason]' error: exists: '&c[ip] is already banned' + cooldown: '&cThis ip was banned too recently, try again later' baniprange: error: @@ -232,6 +263,7 @@ messages: ip: disallowed: '&6You have been banned from this server for &4[reason]' kick: '&6You have been banned permanently for &4[reason]' + dateTimeFormat: 'yyyy-MM-dd HH:mm:ss' notify: '&6[from] - [to] have been banned by [actor]' tempbaniprange: @@ -239,6 +271,7 @@ messages: ip: disallowed: '&6You have been banned from this server for &4[reason] \n&6It expires in [expires]' kick: '&6You have been temporarily banned for [expires] by [actor] for &4[reason]' + dateTimeFormat: 'yyyy-MM-dd HH:mm:ss' unbaniprange: notify: '&6[from] - [to] has been unbanned by [actor]' @@ -250,6 +283,7 @@ messages: ip: disallowed: '&6You have been banned from this server for &4[reason] \n&6It expires in [expires]' kick: '&6You have been temporarily banned for &4[reason]' + dateTimeFormat: 'yyyy-MM-dd HH:mm:ss' notify: '&6[ip] ([players]) has been temporarily banned for [expires] by [actor] for &4[reason]' tempbanipall: @@ -259,6 +293,7 @@ messages: notify: '&6[ip] has been unbanned by [actor]' error: noExists: '&c[ip] is not banned' + notOwn: '&c[ip] was not banned by you, unable to unban' unbanipall: notify: '&6[ip] will be unbanned by [actor]' @@ -299,11 +334,18 @@ messages: error: failedLookup: '&cFailed to lookup player [uuid], check server logs' complete: '&a[amount] players resolved, please restart your server for failed punishments to take affect' + duplicates: + lookup: + notFound: '&aNo duplicate player names found' + error: + invalidName: '&cInvalid name, must be 16 characters or less and contain only letters, numbers and an underscore' + nameExists: '&cA player with that name already exists' + success: '&aPlayer name set to [player] successfully' bmrollback: notify: '&c[player] has had their [type] actions undone' error: - invalid: '&cInvalid type, please choose between bans, banrecords, mutes, muterecords, kicks, notes or warnings' + invalid: '&cInvalid type [type], please choose between [types]' sync: player: @@ -341,6 +383,8 @@ messages: dispatch: 'Executing command [command]' list: noResults: '&cNo reports found' + error: + invalidState: '&cReport state [state] not found' row: dateTimeFormat: 'yyyy-MM-dd HH:mm:ss' header: '&e-- Reports ([count]) -- Page ([page]/[maxPage])' @@ -363,7 +407,7 @@ messages: report: '&7#[id] &6[actor] reported [player] for &4[reason]&6 at [created]' location: '[world] - [x], [y], [z]' - adnoteall: + addnoteall: notify: '&c[player] will have a new attached by [actor]: [message]' banlist: @@ -387,4 +431,4 @@ messages: disallowed: '&cThe IP address you are joining from is linked to a banned player' reasons: - row: '[hashtag] = [reason]' \ No newline at end of file + row: '[hashtag] = [reason]' diff --git a/src/main/resources/plugin.yml b/common/src/main/resources/plugin.yml similarity index 88% rename from src/main/resources/plugin.yml rename to common/src/main/resources/plugin.yml index 3f40966b9..185bef823 100644 --- a/src/main/resources/plugin.yml +++ b/common/src/main/resources/plugin.yml @@ -1,26 +1,34 @@ -main: me.confuser.banmanager.BanManager +main: "${mainPath}" name: BanManager -version: ${project.version} -authors: [ confuser ] -website: http://dev.bukkit.org/bukkit-plugins/ban-management/ -description: ${project.description} -commands: - ban: +version: "${internalVersion}" +author: confuser +website: https://banmanagement.com +description: "A database driven punishment system" +softdepend: + - PlaceholderAPI + +# Mark the plugin as 1.13 compatible to avoid CB having to perform quite as much unnecessary +# remapping when the plugin is loaded. Note that despite what this setting might otherwise imply, +# BM is still compatible with pre-1.13 releases. +api-version: 1.13 + +commands: + ban: description: "ban a player" usage: "/ban " aliases: [bmban] permission: bm.command.ban - banall: + banall: description: "ban a player across multiple servers" usage: "/banall " aliases: [bmbanall] permission: bm.command.banall - tempban: + tempban: description: "tempban a player" usage: "/tempban " aliases: [bmtempban] permission: bm.command.tempban - tempbanall: + tempbanall: description: "tempban a player across multiple servers" usage: "/tempbanall " aliases: [bmtempbanall] @@ -50,12 +58,12 @@ commands: usage: "/banipall " aliases: [bmbanipall] permission: bm.command.banipall - tempbanip: + tempbanip: description: "tempban an ip" usage: "/tempbanip " aliases: [bmtempbanip] permission: bm.command.tempbanip - tempbanipall: + tempbanipall: description: "tempban an ip across multiple servers" usage: "/tempbanipall " aliases: [bmtempbanipall] @@ -80,6 +88,11 @@ commands: usage: "/kick " aliases: [bmkick] permission: bm.command.kick + kickall: + description: "kick all players on the current server" + usage: "/kickall " + aliases: [bmkickall] + permission: bm.command.kickall mute: description: "mutes a player" usage: "/mute " @@ -130,6 +143,11 @@ commands: usage: "/nlkick " aliases: [bmnlkick] permission: bm.command.nlkick + nlkickall: + description: "kick all players on the current server without logging" + usage: "/nlkickall " + aliases: [bmnlkickall] + permission: bm.command.nlkickall bmreload: description: "Reloads from the config everything except database connection info" usage: "/bmreload" @@ -258,11 +276,14 @@ permissions: bm.command.bminfo.others: true bm.command.bminfo.playerstats: true bm.command.bminfo.connection: true + bm.command.bminfo.geoip: true bm.command.bminfo.ipstats: true bm.command.bminfo.alts: true bm.command.bminfo.website: true bm.command.bminfo.history.bans: true + bm.command.bminfo.history.ipbans: true bm.command.bminfo.history.mutes: true + bm.command.bminfo.history.ipmutes: true bm.command.bminfo.history.kicks: true bm.command.bminfo.history.ips: true bm.command.bminfo.history.warnings: true @@ -277,7 +298,9 @@ permissions: bm.command.unbanip: true bm.command.import: true bm.command.kick: true + bm.command.kickall: true bm.command.nlkick: true + bm.command.nlkickall: true bm.command.update: true bm.command.mute: true bm.command.mute.offline: true @@ -310,6 +333,7 @@ permissions: bm.command.unbanname: true bm.command.bmutils: true bm.command.bmutils.missingplayers: true + bm.command.bmutils.duplicates: true bm.*: description: Gives access to all BanManager commands children: @@ -325,11 +349,14 @@ permissions: bm.command.bminfo.others: true bm.command.bminfo.playerstats: true bm.command.bminfo.connection: true + bm.command.bminfo.geoip: true bm.command.bminfo.ipstats: true bm.command.bminfo.alts: true bm.command.bminfo.website: true bm.command.bminfo.history.bans: true + bm.command.bminfo.history.ipbans: true bm.command.bminfo.history.mutes: true + bm.command.bminfo.history.ipmutes: true bm.command.bminfo.history.kicks: true bm.command.bminfo.history.ips: true bm.command.bminfo.history.warnings: true @@ -344,7 +371,9 @@ permissions: bm.command.unbanip: true bm.command.import: true bm.command.kick: true + bm.command.kickall: true bm.command.nlkick: true + bm.command.nlkickall: true bm.command.update: true bm.command.mute: true bm.command.mute.offline: true @@ -382,6 +411,7 @@ permissions: bm.command.unbanname: true bm.command.bmutils: true bm.command.bmutils.missingplayers: true + bm.command.bmutils.duplicates: true bm.notify.*: description: Players with this permission will be notified of bans default: op @@ -420,6 +450,8 @@ permissions: bm.exempt.ban: true bm.exempt.banip: true bm.exempt.kick: true + bm.exempt.maxonlineperip: true + bm.exempt.maxmultiaccountsrecently: true bm.exempt.mute: true bm.exempt.tempban: true bm.exempt.tempipban: true @@ -436,7 +468,9 @@ permissions: bm.command.bminfo.alts: true bm.command.bminfo.website: true bm.command.bminfo.history.bans: true + bm.command.bminfo.history.ipbans: true bm.command.bminfo.history.mutes: true + bm.command.bminfo.history.ipmutes: true bm.command.bminfo.history.kicks: true bm.command.bminfo.history.ips: true bm.command.bminfo.history.warnings: true @@ -477,6 +511,9 @@ permissions: bm.command.bminfo.connection: description: Allows you to see connection information default: op + bm.command.bminfo.geoip: + description: Allows you to see city and country information + default: op bm.command.bminfo.alts: description: Allows you to see possible alts default: op @@ -486,6 +523,12 @@ permissions: bm.command.bminfo.history.bans: description: Allows you to see ban records default: op + bm.command.bminfo.history.ipbans: + description: Allows you to see ip ban records + default: op + bm.command.bminfo.history.ipmutes: + description: Allows you to see ip mute records + default: op bm.command.bminfo.history.mutes: description: Allows you to see mute reocrds default: op @@ -531,6 +574,15 @@ permissions: bm.command.kick: description: Allows a player to kick another player default: op + bm.command.kickall: + description: Allows a player to kick all players on the server + default: op + bm.command.nlkick: + description: Allows a player to kick another player without logging + default: op + bm.command.nlkickall: + description: Allows a player to kick all players on the server without logging + default: op bm.command.update: description: Notifies player of a plugin update default: op @@ -567,6 +619,9 @@ permissions: bm.command.clear.banrecords: description: Allows you to clear a player's ban records default: op + bm.command.clear.baniprecords: + description: Allows you to clear a player's ip ban records + default: op bm.command.clear.kicks: description: Allows you to clear a player's kick records default: op @@ -633,6 +688,9 @@ permissions: bm.command.delete.banrecords: description: Allows you to delete a player's ban records by id default: op + bm.command.delete.baniprecords: + description: Allows you to delete a player's ban records by id + default: op bm.command.delete.kicks: description: Allows you to delete a player's kick records by id default: op @@ -663,9 +721,12 @@ permissions: bm.command.unbanname: description: Allows unbanning a name default: op -bm.command.bmutils: - description: Allows using bmutils base command - default: op -bm.command.bmutils.missingplayers: - description: Allows resolving missing players - default: op \ No newline at end of file + bm.command.bmutils: + description: Allows using bmutils base command + default: op + bm.command.bmutils.missingplayers: + description: Allows resolving missing players + default: op + bm.command.bmutils.duplicates: + description: Allows resolving duplicate player names + default: op diff --git a/src/main/resources/reasons.yml b/common/src/main/resources/reasons.yml similarity index 100% rename from src/main/resources/reasons.yml rename to common/src/main/resources/reasons.yml diff --git a/src/main/resources/schedules.yml b/common/src/main/resources/schedules.yml similarity index 65% rename from src/main/resources/schedules.yml rename to common/src/main/resources/schedules.yml index 22a12dd5c..e8daad001 100644 --- a/src/main/resources/schedules.yml +++ b/common/src/main/resources/schedules.yml @@ -2,18 +2,18 @@ # Setting to 0 disables the scheduler from running. # Only change if you know what you are doing! scheduler: - expiresCheck: 30 - playerBans: 30 - playerMutes: 30 - playerWarnings: 30 - ipBans: 30 - ipRangeBans: 30 + expiresCheck: 5 + playerBans: 5 + playerMutes: 5 + playerWarnings: 5 + ipBans: 5 + ipRangeBans: 5 rollbacks: 30 - nameBans: 30 - externalPlayerBans: 120 - externalPlayerMutes: 120 - externalPlayerNotes: 120 - externalIpBans: 120 + nameBans: 5 + externalPlayerBans: 5 + externalPlayerMutes: 5 + externalPlayerNotes: 5 + externalIpBans: 5 saveLastChecked: 60 # Don't change these! @@ -29,4 +29,4 @@ lastChecked: externalPlayerBans: 0 externalPlayerMutes: 0 externalPlayerNotes: 0 - externalIpBans: 0 \ No newline at end of file + externalIpBans: 0 diff --git a/common/src/main/resources/velocity-plugin.json b/common/src/main/resources/velocity-plugin.json new file mode 100644 index 000000000..05fa5da8b --- /dev/null +++ b/common/src/main/resources/velocity-plugin.json @@ -0,0 +1,18 @@ +{ + "id": "banmanager", + "name": "BanManager", + "version": "${internalVersion}", + "description": "A suite of moderation plugins & apps for Minecraft servers", + "url": "https://gitlab.com/cubekrowd/plugins/globalvanish", + "authors": [ + "confuser", + "Lorias-Jak" + ], + "main": "${mainPath}", + "dependencies": [ + { + "id": "signedvelocity", + "optional": true + } + ] +} \ No newline at end of file diff --git a/common/src/main/resources/velocity.yml b/common/src/main/resources/velocity.yml new file mode 100644 index 000000000..9cfc2ce62 --- /dev/null +++ b/common/src/main/resources/velocity.yml @@ -0,0 +1,3 @@ +features: + commands: true + forceEnableMute: false \ No newline at end of file diff --git a/common/src/test/java/me/confuser/banmanager/common/BasePluginDbTest.java b/common/src/test/java/me/confuser/banmanager/common/BasePluginDbTest.java new file mode 100644 index 000000000..6904c350c --- /dev/null +++ b/common/src/test/java/me/confuser/banmanager/common/BasePluginDbTest.java @@ -0,0 +1,83 @@ +package me.confuser.banmanager.common; + +import ch.vorburger.exec.ManagedProcessException; +import ch.vorburger.mariadb4j.DB; +import com.github.javafaker.Faker; +import org.junit.*; +import org.junit.rules.TemporaryFolder; + +import java.io.File; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.List; + +import static org.mockito.Mockito.*; + +public abstract class BasePluginDbTest { + @Rule + public TemporaryFolder temporaryFolder = new TemporaryFolder(); + protected static String storageType = System.getenv("STORAGE_TYPE"); + protected BanManagerPlugin plugin; + protected Faker faker = new Faker(); + protected TestUtils testUtils; + protected TestServer server = spy(new TestServer()); + private boolean configSetup = false; + private static DB db; + + @BeforeClass + public static void dbSetup() throws ManagedProcessException { + if (storageType == null || storageType.isEmpty()) storageType = "mariadb"; + + if (storageType.equals("mariadb")) { + db = DB.newEmbeddedDB(0); + db.start(); + } + } + + @Before + public void setup() throws Exception { + CommonLogger logger = new TestLogger(); + plugin = new BanManagerPlugin(BasePluginTest.setupConfigs(temporaryFolder), logger, temporaryFolder.getRoot(), new TestScheduler(), server, new TestMetrics()); + + testUtils = new TestUtils(plugin, faker); + server.enable(plugin); + + if (!configSetup) { + try { + plugin.enable(); + } catch (Exception e) { + } + + setupConfig(); + } + + plugin.enable(); + } + + @AfterClass + public static void teardown() { + if (db == null) return; + + try { + db.stop(); + } catch (ManagedProcessException e) { + throw new AssertionError("db.stop() failed", e); + } + } + + private void setupConfig() throws Exception { + Path configFile = new File(temporaryFolder.getRoot(), "config.yml").toPath(); + List lines = Files.readAllLines(configFile, StandardCharsets.UTF_8); + lines.set(5, " storageType: " + storageType); + lines.set(6, " host: localhost"); + lines.set(7, " port: " + (db != null ? db.getConfiguration().getPort() : "")); + lines.set(8, " name: test"); + lines.set(9, " user: root"); + lines.set(10, " password: ''"); + + Files.write(configFile, lines, StandardCharsets.UTF_8); + + configSetup = true; + } +} diff --git a/common/src/test/java/me/confuser/banmanager/common/BasePluginTest.java b/common/src/test/java/me/confuser/banmanager/common/BasePluginTest.java new file mode 100644 index 000000000..5eff4d1fd --- /dev/null +++ b/common/src/test/java/me/confuser/banmanager/common/BasePluginTest.java @@ -0,0 +1,78 @@ +package me.confuser.banmanager.common; + +import me.confuser.banmanager.common.configs.PluginInfo; +import me.confuser.banmanager.common.configuration.ConfigurationSection; +import me.confuser.banmanager.common.configuration.file.YamlConfiguration; +import org.junit.Before; +import org.junit.Rule; +import org.junit.rules.TemporaryFolder; + +import java.io.*; + +public abstract class BasePluginTest { + @Rule + public TemporaryFolder temporaryFolder = new TemporaryFolder(); + protected BanManagerPlugin plugin; + + @Before + public void setup() { + CommonLogger logger = new TestLogger(); + plugin = new BanManagerPlugin(setupConfigs(temporaryFolder), logger, temporaryFolder.getRoot(), new TestScheduler(), new TestServer(), new TestMetrics()); + + try { + plugin.enable(); + } catch (Exception e) { + } + } + + public static PluginInfo setupConfigs(TemporaryFolder folder) { + String[] configs = new String[]{ + "config.yml", + "console.yml", + "discord.yml", + "exemptions.yml", + "geoip.yml", + "messages.yml", + "reasons.yml", + "schedules.yml" + }; + + for (String name : configs) { + try { + InputStream in = BasePluginTest.class.getClassLoader().getResource(name).openStream(); + File outFile = new File(folder.getRoot(), name); + OutputStream out = new FileOutputStream(outFile); + byte[] buf = new byte[1024]; + int len; + while ((len = in.read(buf)) > 0) { + out.write(buf, 0, len); + } + out.close(); + in.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + // Load plugin.yml + PluginInfo pluginInfo = new PluginInfo(); + Reader defConfigStream = null; + try { + defConfigStream = new InputStreamReader(BasePluginTest.class.getClassLoader().getResource("plugin.yml").openStream()); + } catch (IOException e) { + e.printStackTrace(); + return null; + } + + YamlConfiguration conf = YamlConfiguration.loadConfiguration(defConfigStream); + ConfigurationSection commands = conf.getConfigurationSection("commands"); + + for (String command : commands.getKeys(false)) { + ConfigurationSection cmd = commands.getConfigurationSection(command); + + pluginInfo.setCommand( new PluginInfo.CommandInfo(command, cmd.getString("permission"), cmd.getString("usage"), cmd.getStringList("aliases"))); + } + + return pluginInfo; + } +} diff --git a/common/src/test/java/me/confuser/banmanager/common/PluginTest.java b/common/src/test/java/me/confuser/banmanager/common/PluginTest.java new file mode 100644 index 000000000..c0700dfb9 --- /dev/null +++ b/common/src/test/java/me/confuser/banmanager/common/PluginTest.java @@ -0,0 +1,13 @@ +package me.confuser.banmanager.common; + +import org.junit.Test; + +import static org.junit.Assert.*; + +public class PluginTest extends BasePluginTest { + @Test + public void testConfigs() { + assertEquals(10, plugin.getConfig().getLocalDb().getMaxConnections()); + assertEquals("Console", plugin.getConsoleConfig().getName()); + } +} diff --git a/common/src/test/java/me/confuser/banmanager/common/TestLogger.java b/common/src/test/java/me/confuser/banmanager/common/TestLogger.java new file mode 100644 index 000000000..46a88a04a --- /dev/null +++ b/common/src/test/java/me/confuser/banmanager/common/TestLogger.java @@ -0,0 +1,28 @@ +package me.confuser.banmanager.common; + +import java.util.logging.Logger; + +public class TestLogger implements CommonLogger { + + private final Logger logger; + + public TestLogger() { + this.logger = java.util.logging.Logger.getLogger("tests"); + } + + @Override + public void info(String msg) { + logger.info(msg); + } + + @Override + public void warning(String msg) { + logger.warning(msg); + } + + @Override + public void severe(String msg) { + logger.severe(msg); + } +} + diff --git a/common/src/test/java/me/confuser/banmanager/common/TestMetrics.java b/common/src/test/java/me/confuser/banmanager/common/TestMetrics.java new file mode 100755 index 000000000..20984dc1e --- /dev/null +++ b/common/src/test/java/me/confuser/banmanager/common/TestMetrics.java @@ -0,0 +1,27 @@ +package me.confuser.banmanager.common; + +public class TestMetrics implements CommonMetrics { + @Override + public void submitOnlineMode(boolean online) { + } + + @Override + public void submitStorageType(String storageType) { + } + + @Override + public void submitStorageVersion(String version) { + } + + @Override + public void submitGlobalMode(boolean enabled) { + } + + @Override + public void submitGeoMode(boolean enabled) { + } + + @Override + public void submitDiscordMode(boolean enabled) { + } +} diff --git a/common/src/test/java/me/confuser/banmanager/common/TestPlayer.java b/common/src/test/java/me/confuser/banmanager/common/TestPlayer.java new file mode 100644 index 000000000..e978bbe47 --- /dev/null +++ b/common/src/test/java/me/confuser/banmanager/common/TestPlayer.java @@ -0,0 +1,96 @@ +package me.confuser.banmanager.common; + +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.kyori.text.TextComponent; +import me.confuser.banmanager.common.util.Message; + +import java.net.InetAddress; +import java.util.UUID; + +public class TestPlayer implements CommonPlayer { + + private final UUID uuid; + private final String name; + private final boolean onlineMode; + + public TestPlayer(UUID uuid, String name, boolean onlineMode) { + this.uuid = uuid; + this.name = name; + this.onlineMode = onlineMode; + } + + @Override + public void kick(String message) { + } + + @Override + public void sendMessage(String message) { + } + + @Override + public void sendMessage(Message message) { + } + + @Override + public void sendJSONMessage(TextComponent jsonString) { + } + + @Override + public void sendJSONMessage(String jsonString) { + } + + @Override + public boolean isConsole() { + return false; + } + + @Override + public PlayerData getData() { + return BanManagerPlugin.getInstance().getPlayerStorage().retrieve(this.name, false); + } + + @Override + public boolean isOnlineMode() { + return this.onlineMode; + } + + @Override + public boolean isOnline() { + return true; + } + + @Override + public boolean hasPermission(String permission) { + return true; + } + + @Override + public String getDisplayName() { + return this.name; + } + + @Override + public String getName() { + return this.name; + } + + @Override + public InetAddress getAddress() { + return null; + } + + @Override + public UUID getUniqueId() { + return this.uuid; + } + + @Override + public boolean teleport(CommonWorld world, double x, double y, double z, float pitch, float yaw) { + return false; + } + + @Override + public boolean canSee(CommonPlayer player) { + return true; + } +} diff --git a/common/src/test/java/me/confuser/banmanager/common/TestScheduler.java b/common/src/test/java/me/confuser/banmanager/common/TestScheduler.java new file mode 100644 index 000000000..4f5378897 --- /dev/null +++ b/common/src/test/java/me/confuser/banmanager/common/TestScheduler.java @@ -0,0 +1,24 @@ +package me.confuser.banmanager.common; + +public class TestScheduler implements CommonScheduler { + + @Override + public void runAsync(Runnable task) { + task.run(); + } + + @Override + public void runAsyncLater(Runnable task, long delay) { + task.run(); + } + + @Override + public void runSync(Runnable task) { + task.run(); + } + + @Override + public void runSyncLater(Runnable task, long delay) { + task.run(); + } +} diff --git a/common/src/test/java/me/confuser/banmanager/common/TestSender.java b/common/src/test/java/me/confuser/banmanager/common/TestSender.java new file mode 100644 index 000000000..75599ac4f --- /dev/null +++ b/common/src/test/java/me/confuser/banmanager/common/TestSender.java @@ -0,0 +1,53 @@ +package me.confuser.banmanager.common; + +import me.confuser.banmanager.common.commands.CommonCommand; +import me.confuser.banmanager.common.commands.CommonSender; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.util.Message; + +import java.util.UUID; + +public class TestSender implements CommonSender { + + private final UUID uuid; + private final String name; + private final boolean onlineMode; + + public TestSender(UUID uuid, String name, boolean onlineMode) { + this.uuid = uuid; + this.name = name; + this.onlineMode = onlineMode; + } + + @Override + public String getName() { + return this.name; + } + + @Override + public boolean hasPermission(String permission) { + return true; + } + + @Override + public void sendMessage(String message) { + + } + + @Override + public void sendMessage(Message message) { + + } + + @Override + public boolean isConsole() { + return true; + } + + @Override + public PlayerData getData() { + if (isConsole()) return BanManagerPlugin.getInstance().getPlayerStorage().getConsole(); + + return CommonCommand.getPlayer(this, getName(), false); + } +} diff --git a/common/src/test/java/me/confuser/banmanager/common/TestServer.java b/common/src/test/java/me/confuser/banmanager/common/TestServer.java new file mode 100644 index 000000000..42a8dc029 --- /dev/null +++ b/common/src/test/java/me/confuser/banmanager/common/TestServer.java @@ -0,0 +1,86 @@ +package me.confuser.banmanager.common; + +import me.confuser.banmanager.common.api.events.CommonEvent; +import me.confuser.banmanager.common.commands.CommonSender; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.kyori.text.TextComponent; +import me.confuser.banmanager.common.util.UUIDUtils; + +import java.sql.SQLException; +import java.util.UUID; + +public class TestServer implements CommonServer { + private BanManagerPlugin plugin; + + @Override + public CommonPlayer getPlayer(UUID uniqueId) { + try { + PlayerData player = plugin.getPlayerStorage().queryForId(UUIDUtils.toBytes(uniqueId)); + + if (player == null) return null; + + return new TestPlayer(uniqueId, player.getName(), true); + } catch (SQLException e) { + e.printStackTrace(); + } + + return null; + } + + @Override + public CommonPlayer getPlayer(String name) { + PlayerData player = plugin.getPlayerStorage().retrieve(name, false); + + if (player == null) return null; + + return new TestPlayer(player.getUUID(), player.getName(), true); + } + + @Override + public CommonPlayer[] getOnlinePlayers() { + return new CommonPlayer[0]; + } + + @Override + public void broadcast(String message, String permission) { + } + + @Override + public void broadcastJSON(TextComponent message, String permission) { + } + + @Override + public void broadcast(String message, String permission, CommonSender sender) { + } + + @Override + public CommonSender getConsoleSender() { + PlayerData console = plugin.getPlayerStorage().getConsole(); + + return new TestSender(console.getUUID(), console.getName(), true); + } + + @Override + public boolean dispatchCommand(CommonSender consoleSender, String command) { + return true; + } + + @Override + public CommonWorld getWorld(String name) { + return new CommonWorld(name); + } + + @Override + public CommonEvent callEvent(String name, Object... args) { + return new CommonEvent(false, false); + } + + public void enable(BanManagerPlugin plugin) { + this.plugin = plugin; + } + + @Override + public CommonExternalCommand getPluginCommand(String commandName) { + return null; + } +} diff --git a/common/src/test/java/me/confuser/banmanager/common/TestUtils.java b/common/src/test/java/me/confuser/banmanager/common/TestUtils.java new file mode 100644 index 000000000..d1bbefa04 --- /dev/null +++ b/common/src/test/java/me/confuser/banmanager/common/TestUtils.java @@ -0,0 +1,30 @@ +package me.confuser.banmanager.common; + +import com.github.javafaker.Faker; +import lombok.AllArgsConstructor; +import me.confuser.banmanager.common.data.PlayerData; + +import java.sql.SQLException; +import java.util.UUID; + +@AllArgsConstructor +public class TestUtils { + private BanManagerPlugin plugin; + private Faker faker; + + public PlayerData createRandomPlayer() { + try { + return plugin.getPlayerStorage().createIfNotExists(UUID.fromString(faker.internet().uuid()), createRandomPlayerName()); + } catch (SQLException e) { + e.printStackTrace(); + } + + return null; + } + + public String createRandomPlayerName() { + String name = faker.name().username(); + + return name.substring(0, Math.min(name.length(), 16)); + } +} diff --git a/common/src/test/java/me/confuser/banmanager/common/commands/BanCommandTest.java b/common/src/test/java/me/confuser/banmanager/common/commands/BanCommandTest.java new file mode 100644 index 000000000..b33d589d8 --- /dev/null +++ b/common/src/test/java/me/confuser/banmanager/common/commands/BanCommandTest.java @@ -0,0 +1,154 @@ +package me.confuser.banmanager.common.commands; + +import me.confuser.banmanager.common.BasePluginDbTest; +import me.confuser.banmanager.common.CommonPlayer; +import me.confuser.banmanager.common.CommonServer; +import me.confuser.banmanager.common.configs.ExemptionsConfig; +import me.confuser.banmanager.common.data.PlayerBanData; +import me.confuser.banmanager.common.data.PlayerData; +import org.junit.Before; +import org.junit.Test; + +import java.sql.SQLException; + +import static org.awaitility.Awaitility.await; +import static org.junit.Assert.*; +import static org.mockito.Mockito.*; + +public class BanCommandTest extends BasePluginDbTest { + private BanCommand cmd; + + @Before + public void setupCmd() { + for (CommonCommand cmd : plugin.getCommands()) { + if (cmd.getCommandName().equals("ban")) { + this.cmd = (BanCommand) cmd; + break; + } + } + } + + @Test + public void shouldFailIfNoReasonGiven() { + CommonSender sender = plugin.getServer().getConsoleSender(); + String[] args = new String[]{"confuser"}; + + assertFalse(cmd.onCommand(sender, new CommandParser(plugin, args, 1))); + } + + @Test + public void shouldFailIfNoSilentPermission() { + CommonSender sender = spy(plugin.getServer().getConsoleSender()); + String[] args = new String[]{"-s", "confuser", "test"}; + + when(sender.hasPermission(cmd.getPermission() + ".silent")).thenReturn(false); + + assert (cmd.onCommand(sender, new CommandParser(plugin, args, 1))); + verify(sender).sendMessage("&cYou do not have permission to perform that action"); + } + + @Test + public void shouldFailIfSelf() { + CommonSender sender = spy(plugin.getServer().getConsoleSender()); + String[] args = new String[]{"Console", "test"}; + + assert (cmd.onCommand(sender, new CommandParser(plugin, args, 1))); + verify(sender).sendMessage("&cYou cannot perform that action on yourself!"); + } + + @Test + public void shouldFailIfAlreadyBanned() throws SQLException { + PlayerData player = testUtils.createRandomPlayer(); + CommonSender sender = spy(plugin.getServer().getConsoleSender()); + String[] args = new String[]{player.getName(), "test"}; + + assert plugin.getPlayerBanStorage().ban(new PlayerBanData(player, sender.getData(), args[1], true)); + + when(sender.hasPermission(cmd.getPermission() + ".override")).thenReturn(false); + + assert (cmd.onCommand(sender, new CommandParser(plugin, args, 1))); + verify(sender).sendMessage("&c" + player.getName() + " is already banned"); + } + + @Test + public void shouldFailIfOffline() { + CommonSender sender = spy(plugin.getServer().getConsoleSender()); + String[] args = new String[]{testUtils.createRandomPlayerName(), "test"}; + + when(sender.hasPermission(cmd.getPermission() + ".offline")).thenReturn(false); + + assert (cmd.onCommand(sender, new CommandParser(plugin, args, 1))); + verify(sender).sendMessage("&cYou are not allowed to perform this action on an offline player"); + } + + @Test + public void shouldFailIfExempt() { + PlayerData player = testUtils.createRandomPlayer(); + CommonServer server = spy(plugin.getServer()); + CommonSender sender = spy(server.getConsoleSender()); + CommonPlayer commonPlayer = spy(server.getPlayer(player.getName())); + String[] args = new String[]{player.getName(), "test"}; + + when(sender.hasPermission("bm.exempt.override.ban")).thenReturn(false); + when(commonPlayer.hasPermission("bm.exempt.ban")).thenReturn(true); + + assert (cmd.onCommand(sender, new CommandParser(plugin, args, 1))); + verify(sender).sendMessage("&c" + player.getName() + " is exempt from that action"); + } + + @Test + public void shouldFailIfNotFound() { + CommonSender sender = spy(plugin.getServer().getConsoleSender()); + String[] args = new String[]{faker.internet().uuid(), "test"}; + + assert (cmd.onCommand(sender, new CommandParser(plugin, args, 1))); + verify(sender).sendMessage("&c" + args[0] + " not found, are you sure they exist?"); + } + + @Test + public void shouldFailIfOfflineExempt() { + PlayerData player = testUtils.createRandomPlayer(); + CommonServer server = spy(plugin.getServer()); + CommonSender sender = spy(server.getConsoleSender()); + ExemptionsConfig config = spy(plugin.getExemptionsConfig()); + String[] args = new String[]{player.getName(), "test"}; + + when(sender.hasPermission("bm.exempt.override.ban")).thenReturn(false); + when(config.isExempt(player, "ban")).thenReturn(true); + + assert (cmd.onCommand(sender, new CommandParser(plugin, args, 1))); + verify(sender).sendMessage("&c" + player.getName() + " is exempt from that action"); + } + + @Test + public void shouldBanPlayer() { + PlayerData player = testUtils.createRandomPlayer(); + CommonServer server = spy(plugin.getServer()); + CommonSender sender = spy(server.getConsoleSender()); + String[] args = new String[]{player.getName(), "test"}; + + assert (cmd.onCommand(sender, new CommandParser(plugin, args, 1))); + + await().until(() -> plugin.getPlayerBanStorage().isBanned(player.getUUID())); + PlayerBanData ban = plugin.getPlayerBanStorage().getBan(player.getUUID()); + + assertEquals(player.getName(), ban.getPlayer().getName()); + assertEquals("test", ban.getReason()); + assertEquals(sender.getName(), ban.getActor().getName()); + assertFalse(ban.isSilent()); + } + + @Test + public void shouldBanPlayerSilently() { + PlayerData player = testUtils.createRandomPlayer(); + CommonServer server = spy(plugin.getServer()); + CommonSender sender = spy(server.getConsoleSender()); + String[] args = new String[]{player.getName(), "test", "-s"}; + + assert (cmd.onCommand(sender, new CommandParser(plugin, args, 1))); + + await().until(() -> plugin.getPlayerBanStorage().isBanned(player.getUUID())); + + assertTrue(plugin.getPlayerBanStorage().getBan(player.getUUID()).isSilent()); + } +} \ No newline at end of file diff --git a/common/src/test/java/me/confuser/banmanager/common/commands/BanIpCommandTest.java b/common/src/test/java/me/confuser/banmanager/common/commands/BanIpCommandTest.java new file mode 100644 index 000000000..1e9a4ef9e --- /dev/null +++ b/common/src/test/java/me/confuser/banmanager/common/commands/BanIpCommandTest.java @@ -0,0 +1,146 @@ +package me.confuser.banmanager.common.commands; + +import me.confuser.banmanager.common.BasePluginDbTest; +import me.confuser.banmanager.common.CommonPlayer; +import me.confuser.banmanager.common.CommonServer; +import me.confuser.banmanager.common.configs.ExemptionsConfig; +import me.confuser.banmanager.common.data.IpBanData; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.ipaddr.IPAddress; +import me.confuser.banmanager.common.util.IPUtils; +import org.junit.Before; +import org.junit.Test; + +import java.sql.SQLException; + +import static org.awaitility.Awaitility.await; +import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.*; + +public class BanIpCommandTest extends BasePluginDbTest { + private BanIpCommand cmd; + + @Before + public void setupCmd() { + for (CommonCommand cmd : plugin.getCommands()) { + if (cmd.getCommandName().equals("banip")) { + this.cmd = (BanIpCommand) cmd; + break; + } + } + } + + @Test + public void shouldFailIfNoReasonGiven() { + CommonSender sender = plugin.getServer().getConsoleSender(); + String[] args = new String[]{faker.internet().ipV6Address()}; + + assertFalse(cmd.onCommand(sender, new CommandParser(plugin, args, 1))); + } + + @Test + public void shouldFailIfNoSilentPermission() { + CommonSender sender = spy(plugin.getServer().getConsoleSender()); + String[] args = new String[]{"-s", faker.internet().ipV6Address(), "test"}; + + when(sender.hasPermission(cmd.getPermission() + ".silent")).thenReturn(false); + + assert (cmd.onCommand(sender, new CommandParser(plugin, args, 1))); + verify(sender).sendMessage("&cYou do not have permission to perform that action"); + } + + @Test + public void shouldFailIfSelf() { + CommonSender sender = spy(plugin.getServer().getConsoleSender()); + String[] args = new String[]{"Console", "test"}; + + assert (cmd.onCommand(sender, new CommandParser(plugin, args, 1))); + verify(sender).sendMessage("&cYou cannot perform that action on yourself!"); + } + + @Test + public void shouldFailIfAlreadyBanned() throws SQLException { + IPAddress ip = IPUtils.toIPAddress(faker.internet().ipV6Address()); + CommonSender sender = spy(plugin.getServer().getConsoleSender()); + String[] args = new String[]{ip.toString(), "test"}; + + assert plugin.getIpBanStorage().ban(new IpBanData(ip, sender.getData(), args[1], true)); + + when(sender.hasPermission(cmd.getPermission() + ".override")).thenReturn(false); + + assert (cmd.onCommand(sender, new CommandParser(plugin, args, 1))); + verify(sender).sendMessage("&c" + ip.toString() + " is already banned"); + } + + @Test + public void shouldFailIfExempt() { + PlayerData player = testUtils.createRandomPlayer(); + CommonServer server = spy(plugin.getServer()); + CommonSender sender = spy(server.getConsoleSender()); + CommonPlayer commonPlayer = spy(server.getPlayer(player.getName())); + String[] args = new String[]{player.getName(), "test"}; + + when(sender.hasPermission("bm.exempt.override.banip")).thenReturn(false); + when(commonPlayer.hasPermission("bm.exempt.banip")).thenReturn(true); + + assert (cmd.onCommand(sender, new CommandParser(plugin, args, 1))); + verify(sender).sendMessage("&c" + player.getName() + " is exempt from that action"); + } + + @Test + public void shouldFailIfNotFound() { + CommonSender sender = spy(plugin.getServer().getConsoleSender()); + String[] args = new String[]{testUtils.createRandomPlayerName(), "test"}; + + assert (cmd.onCommand(sender, new CommandParser(plugin, args, 1))); + verify(sender).sendMessage("&c" + args[0] + " not found, are you sure they exist?"); + } + + @Test + public void shouldFailIfOfflineExempt() { + PlayerData player = testUtils.createRandomPlayer(); + CommonServer server = spy(plugin.getServer()); + CommonSender sender = spy(server.getConsoleSender()); + ExemptionsConfig config = spy(plugin.getExemptionsConfig()); + String[] args = new String[]{player.getName(), "test"}; + + when(sender.hasPermission("bm.exempt.override.banip")).thenReturn(false); + when(config.isExempt(player, "ban")).thenReturn(true); + + assert (cmd.onCommand(sender, new CommandParser(plugin, args, 1))); + verify(sender).sendMessage("&c" + player.getName() + " is exempt from that action"); + } + + @Test + public void shouldBanIp() { + IPAddress ip = IPUtils.toIPAddress(faker.internet().ipV6Address()); + CommonServer server = spy(plugin.getServer()); + CommonSender sender = spy(server.getConsoleSender()); + String[] args = new String[]{ip.toString(), "test"}; + + assert (cmd.onCommand(sender, new CommandParser(plugin, args, 1))); + + await().until(() -> plugin.getIpBanStorage().isBanned(ip)); + IpBanData ban = plugin.getIpBanStorage().getBan(ip); + + assertEquals(ip, ban.getIp()); + assertEquals("test", ban.getReason()); + assertEquals(sender.getName(), ban.getActor().getName()); + assertFalse(ban.isSilent()); + } + + @Test + public void shouldBanIpSilently() { + IPAddress ip = IPUtils.toIPAddress(faker.internet().ipV6Address()); + CommonServer server = spy(plugin.getServer()); + CommonSender sender = spy(server.getConsoleSender()); + String[] args = new String[]{ip.toString(), "test", "-s"}; + + assert (cmd.onCommand(sender, new CommandParser(plugin, args, 1))); + + await().until(() -> plugin.getIpBanStorage().isBanned(ip)); + + assertTrue(plugin.getIpBanStorage().getBan(ip).isSilent()); + } +} \ No newline at end of file diff --git a/common/src/test/java/me/confuser/banmanager/common/commands/BanIpRangeCommandTest.java b/common/src/test/java/me/confuser/banmanager/common/commands/BanIpRangeCommandTest.java new file mode 100644 index 000000000..a54a14d27 --- /dev/null +++ b/common/src/test/java/me/confuser/banmanager/common/commands/BanIpRangeCommandTest.java @@ -0,0 +1,91 @@ +package me.confuser.banmanager.common.commands; + +import me.confuser.banmanager.common.BasePluginDbTest; +import me.confuser.banmanager.common.CommonServer; +import me.confuser.banmanager.common.data.IpRangeBanData; +import me.confuser.banmanager.common.ipaddr.IPAddress; +import me.confuser.banmanager.common.util.IPUtils; +import org.junit.Before; +import org.junit.Test; + +import java.sql.SQLException; + +import static org.awaitility.Awaitility.await; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.mockito.Mockito.*; + +public class BanIpRangeCommandTest extends BasePluginDbTest { + private BanIpRangeCommand cmd; + + @Before + public void setupCmd() { + for (CommonCommand cmd : plugin.getCommands()) { + if (cmd.getCommandName().equals("baniprange")) { + this.cmd = (BanIpRangeCommand) cmd; + break; + } + } + } + + @Test + public void shouldFailIfNoReasonGiven() { + CommonSender sender = plugin.getServer().getConsoleSender(); + String[] args = new String[]{faker.internet().ipV6Cidr()}; + + assertFalse(cmd.onCommand(sender, new CommandParser(plugin, args, 1))); + } + + @Test + public void shouldFailIfNoSilentPermission() { + CommonSender sender = spy(plugin.getServer().getConsoleSender()); + String[] args = new String[]{"-s", faker.internet().ipV6Cidr(), "test"}; + + when(sender.hasPermission(cmd.getPermission() + ".silent")).thenReturn(false); + + assert (cmd.onCommand(sender, new CommandParser(plugin, args, 1))); + verify(sender).sendMessage("&cYou do not have permission to perform that action"); + } + + @Test + public void shouldFailIfAlreadyBanned() throws SQLException { + IPAddress ip = IPUtils.toIPAddress(faker.internet().ipV6Cidr()); + CommonSender sender = spy(plugin.getServer().getConsoleSender()); + String[] args = new String[]{ip.toString(), "test"}; + + assert plugin.getIpRangeBanStorage().ban(new IpRangeBanData(ip.getLower(), ip.getUpper(), sender.getData(), args[1], true)); + + when(sender.hasPermission(cmd.getPermission() + ".override")).thenReturn(false); + + assert (cmd.onCommand(sender, new CommandParser(plugin, args, 1))); + verify(sender).sendMessage("&cA ban containing those ranges already exists"); + } + + @Test + public void shouldFailIfInvalidIp() { + CommonSender sender = spy(plugin.getServer().getConsoleSender()); + String[] args = new String[]{testUtils.createRandomPlayerName(), "test"}; + + assert (cmd.onCommand(sender, new CommandParser(plugin, args, 1))); + verify(sender).sendMessage("&cInvalid range, please use cidr notation 192.168.0.1/16 or wildcard 192.168.*.*"); + } + + @Test + public void shouldBanRange() { + IPAddress ip = IPUtils.toIPAddress(faker.internet().ipV6Cidr()); + CommonServer server = spy(plugin.getServer()); + CommonSender sender = spy(server.getConsoleSender()); + String[] args = new String[]{ip.toString(), "test"}; + + assert (cmd.onCommand(sender, new CommandParser(plugin, args, 1))); + + await().until(() -> plugin.getIpRangeBanStorage().isBanned(ip.getUpper())); + IpRangeBanData ban = plugin.getIpRangeBanStorage().getBan(ip.getUpper()); + + assertEquals(ip.getLower(), ban.getFromIp()); + assertEquals(ip.getUpper(), ban.getToIp()); + assertEquals("test", ban.getReason()); + assertEquals(sender.getName(), ban.getActor().getName()); + assertFalse(ban.isSilent()); + } +} \ No newline at end of file diff --git a/common/src/test/java/me/confuser/banmanager/common/commands/BanNameCommandTest.java b/common/src/test/java/me/confuser/banmanager/common/commands/BanNameCommandTest.java new file mode 100755 index 000000000..020b30eba --- /dev/null +++ b/common/src/test/java/me/confuser/banmanager/common/commands/BanNameCommandTest.java @@ -0,0 +1,93 @@ +package me.confuser.banmanager.common.commands; + +import me.confuser.banmanager.common.BasePluginDbTest; +import me.confuser.banmanager.common.CommonServer; +import me.confuser.banmanager.common.data.NameBanData; +import me.confuser.banmanager.common.data.PlayerData; +import org.junit.Before; +import org.junit.Test; + +import java.sql.SQLException; + +import static org.awaitility.Awaitility.await; +import static org.junit.Assert.*; +import static org.mockito.Mockito.*; + +public class BanNameCommandTest extends BasePluginDbTest { + private BanNameCommand cmd; + + @Before + public void setupCmd() { + for (CommonCommand cmd : plugin.getCommands()) { + if (cmd.getCommandName().equals("banname")) { + this.cmd = (BanNameCommand) cmd; + break; + } + } + } + + @Test + public void shouldFailIfNoReasonGiven() { + CommonSender sender = plugin.getServer().getConsoleSender(); + String[] args = new String[]{"confuser"}; + + assertFalse(cmd.onCommand(sender, new CommandParser(plugin, args, 1))); + } + + @Test + public void shouldFailIfNoSilentPermission() { + CommonSender sender = spy(plugin.getServer().getConsoleSender()); + String[] args = new String[]{"-s", "confuser", "test"}; + + when(sender.hasPermission(cmd.getPermission() + ".silent")).thenReturn(false); + + assert (cmd.onCommand(sender, new CommandParser(plugin, args, 1))); + verify(sender).sendMessage("&cYou do not have permission to perform that action"); + } + + @Test + public void shouldFailIfAlreadyBanned() throws SQLException { + PlayerData player = testUtils.createRandomPlayer(); + CommonSender sender = spy(plugin.getServer().getConsoleSender()); + String[] args = new String[]{player.getName(), "test"}; + + assert plugin.getNameBanStorage().ban(new NameBanData(player.getName(), sender.getData(), args[1], true)); + + when(sender.hasPermission(cmd.getPermission() + ".override")).thenReturn(false); + + assert (cmd.onCommand(sender, new CommandParser(plugin, args, 1))); + verify(sender).sendMessage("&cName " + player.getName() + " is already banned"); + } + + @Test + public void shouldBanPlayerName() { + PlayerData player = testUtils.createRandomPlayer(); + CommonServer server = spy(plugin.getServer()); + CommonSender sender = spy(server.getConsoleSender()); + String[] args = new String[]{player.getName(), "test"}; + + assert (cmd.onCommand(sender, new CommandParser(plugin, args, 1))); + + await().until(() -> plugin.getNameBanStorage().isBanned(player.getName())); + NameBanData ban = plugin.getNameBanStorage().getBan(player.getName()); + + assertEquals(player.getName(), ban.getName()); + assertEquals("test", ban.getReason()); + assertEquals(sender.getName(), ban.getActor().getName()); + assertFalse(ban.isSilent()); + } + + @Test + public void shouldBanNameSilently() { + PlayerData player = testUtils.createRandomPlayer(); + CommonServer server = spy(plugin.getServer()); + CommonSender sender = spy(server.getConsoleSender()); + String[] args = new String[]{player.getName(), "test", "-s"}; + + assert (cmd.onCommand(sender, new CommandParser(plugin, args, 1))); + + await().until(() -> plugin.getNameBanStorage().isBanned(player.getName())); + + assertTrue(plugin.getNameBanStorage().getBan(player.getName()).isSilent()); + } +} \ No newline at end of file diff --git a/common/src/test/java/me/confuser/banmanager/common/commands/KickAllCommandTest.java b/common/src/test/java/me/confuser/banmanager/common/commands/KickAllCommandTest.java new file mode 100644 index 000000000..009c408ad --- /dev/null +++ b/common/src/test/java/me/confuser/banmanager/common/commands/KickAllCommandTest.java @@ -0,0 +1,115 @@ +package me.confuser.banmanager.common.commands; + +import me.confuser.banmanager.common.BasePluginDbTest; +import me.confuser.banmanager.common.CommonPlayer; +import me.confuser.banmanager.common.data.PlayerData; +import org.junit.Before; +import org.junit.Test; + +import static org.mockito.Mockito.*; + +public class KickAllCommandTest extends BasePluginDbTest { + private KickAllCommand cmd; + + @Before + public void setupCmd() { + for (CommonCommand cmd : plugin.getCommands()) { + if (cmd.getCommandName().equals("kickall")) { + this.cmd = (KickAllCommand) cmd; + break; + } + } + } + + @Test + public void shouldFailIfNoSilentPermission() { + CommonSender sender = spy(plugin.getServer().getConsoleSender()); + String[] args = new String[]{"-s", "test"}; + + when(sender.hasPermission(cmd.getPermission() + ".silent")).thenReturn(false); + + assert (cmd.onCommand(sender, new CommandParser(plugin, args, 0))); + verify(sender).sendMessage("&cYou do not have permission to perform that action"); + } + + @Test + public void shouldFailIfExempt() { + PlayerData player = testUtils.createRandomPlayer(); + CommonSender sender = spy(server.getConsoleSender()); + CommonPlayer commonPlayer = spy(server.getPlayer(player.getName())); + String[] args = new String[]{"test"}; + + when(sender.hasPermission("bm.exempt.override.kick")).thenReturn(false); + when(commonPlayer.hasPermission("bm.exempt.kick")).thenReturn(true); + when(server.getOnlinePlayers()).thenReturn(new CommonPlayer[]{commonPlayer}); + + assert (cmd.onCommand(sender, new CommandParser(plugin, args, 0))); + + verify(commonPlayer, never()).kick("&6You have been kicked"); + verify(server).broadcast("All players have been kicked by Console for &4test", "bm.notify.kick"); + } + + @Test + public void shouldKickPlayerWithoutAReason() { + PlayerData player = testUtils.createRandomPlayer(); + CommonSender sender = spy(server.getConsoleSender()); + CommonPlayer commonPlayer = spy(server.getPlayer(player.getName())); + String[] args = new String[]{}; + + when(commonPlayer.hasPermission("bm.notify.kick")).thenReturn(false); + when(server.getOnlinePlayers()).thenReturn(new CommonPlayer[]{commonPlayer}); + + assert (cmd.onCommand(sender, new CommandParser(plugin, args, 0))); + + verify(commonPlayer).kick("&6You have been kicked"); + verify(server).broadcast("All players have been kicked by Console", "bm.notify.kick"); + } + + @Test + public void shouldKickPlayerWithAReason() { + PlayerData player = testUtils.createRandomPlayer(); + CommonSender sender = spy(server.getConsoleSender()); + CommonPlayer commonPlayer = spy(server.getPlayer(player.getName())); + String[] args = new String[]{"test"}; + + when(commonPlayer.hasPermission("bm.notify.kick")).thenReturn(false); + when(server.getOnlinePlayers()).thenReturn(new CommonPlayer[]{commonPlayer}); + + assert (cmd.onCommand(sender, new CommandParser(plugin, args, 0))); + + verify(commonPlayer).kick("&6You have been kicked for &4" + args[0]); + verify(server).broadcast("All players have been kicked by Console for &4" + args[0], "bm.notify.kick"); + } + + @Test + public void shouldKickPlayerWithoutAReasonSilently() { + PlayerData player = testUtils.createRandomPlayer(); + CommonSender sender = spy(server.getConsoleSender()); + CommonPlayer commonPlayer = spy(server.getPlayer(player.getName())); + String[] args = new String[]{"-s"}; + + when(commonPlayer.hasPermission("bm.notify.kick")).thenReturn(false); + when(server.getOnlinePlayers()).thenReturn(new CommonPlayer[]{commonPlayer}); + + assert (cmd.onCommand(sender, new CommandParser(plugin, args, 0))); + + verify(commonPlayer).kick("&6You have been kicked"); + verify(server, never()).broadcast("All players have been kicked by Console", "bm.notify.kick"); + } + + @Test + public void shouldKickPlayerWithAReasonSilently() { + PlayerData player = testUtils.createRandomPlayer(); + CommonSender sender = spy(server.getConsoleSender()); + CommonPlayer commonPlayer = spy(server.getPlayer(player.getName())); + String[] args = new String[]{"-s", "test", "reason"}; + + when(commonPlayer.hasPermission("bm.notify.kick")).thenReturn(false); + when(server.getOnlinePlayers()).thenReturn(new CommonPlayer[]{commonPlayer}); + + assert (cmd.onCommand(sender, new CommandParser(plugin, args, 0))); + + verify(commonPlayer).kick("&6You have been kicked for &4test reason"); + verify(server, never()).broadcast("All players have been kicked by Console for &4test reason", "bm.notify.kick"); + } +} diff --git a/common/src/test/java/me/confuser/banmanager/common/commands/KickCommandTest.java b/common/src/test/java/me/confuser/banmanager/common/commands/KickCommandTest.java new file mode 100644 index 000000000..31c415ec6 --- /dev/null +++ b/common/src/test/java/me/confuser/banmanager/common/commands/KickCommandTest.java @@ -0,0 +1,140 @@ +package me.confuser.banmanager.common.commands; + +import me.confuser.banmanager.common.BasePluginDbTest; +import me.confuser.banmanager.common.CommonPlayer; +import me.confuser.banmanager.common.data.PlayerData; +import org.junit.Before; +import org.junit.Test; + +import static org.junit.Assert.*; +import static org.mockito.Mockito.*; + +public class KickCommandTest extends BasePluginDbTest { + private KickCommand cmd; + + @Before + public void setupCmd() { + for (CommonCommand cmd : plugin.getCommands()) { + if (cmd.getCommandName().equals("kick")) { + this.cmd = (KickCommand) cmd; + break; + } + } + } + + @Test + public void shouldFailIfNoPlayerGiven() { + CommonSender sender = plugin.getServer().getConsoleSender(); + String[] args = new String[]{}; + + assertFalse(cmd.onCommand(sender, new CommandParser(plugin, args))); + } + + @Test + public void shouldFailIfNoSilentPermission() { + PlayerData player = testUtils.createRandomPlayer(); + CommonSender sender = spy(plugin.getServer().getConsoleSender()); + String[] args = new String[]{"-s", player.getName(), "test"}; + + when(sender.hasPermission(cmd.getPermission() + ".silent")).thenReturn(false); + + assert (cmd.onCommand(sender, new CommandParser(plugin, args))); + verify(sender).sendMessage("&cYou do not have permission to perform that action"); + } + + @Test + public void shouldFailIfSelf() { + CommonSender sender = spy(plugin.getServer().getConsoleSender()); + String[] args = new String[]{"Console", "test"}; + + assert (cmd.onCommand(sender, new CommandParser(plugin, args))); + verify(sender).sendMessage("&cYou cannot perform that action on yourself!"); + } + + @Test + public void shouldFailIfOffline() { + CommonSender sender = spy(plugin.getServer().getConsoleSender()); + String[] args = new String[]{testUtils.createRandomPlayerName(), "test"}; + + assert (cmd.onCommand(sender, new CommandParser(plugin, args))); + verify(sender).sendMessage("&c" + args[0] + " is offline"); + } + + @Test + public void shouldFailIfExempt() { + PlayerData player = testUtils.createRandomPlayer(); + CommonSender sender = spy(server.getConsoleSender()); + CommonPlayer commonPlayer = spy(server.getPlayer(player.getName())); + String[] args = new String[]{player.getName(), "test"}; + + when(sender.hasPermission("bm.exempt.override.kick")).thenReturn(false); + when(commonPlayer.hasPermission("bm.exempt.kick")).thenReturn(true); + + assert (cmd.onCommand(sender, new CommandParser(plugin, args))); + verify(sender).sendMessage("&c" + player.getName() + " is exempt from that action"); + } + + @Test + public void shouldKickPlayerWithoutAReason() { + PlayerData player = testUtils.createRandomPlayer(); + CommonSender sender = spy(server.getConsoleSender()); + CommonPlayer commonPlayer = spy(server.getPlayer(player.getName())); + String[] args = new String[]{player.getName()}; + + when(commonPlayer.hasPermission("bm.notify.kick")).thenReturn(false); + when(server.getPlayer(args[0])).thenReturn(commonPlayer); + + assert (cmd.onCommand(sender, new CommandParser(plugin, args))); + + verify(commonPlayer).kick("&6You have been kicked"); + verify(server).broadcast("&6" + args[0] + " has been kicked by Console", "bm.notify.kick"); + } + + @Test + public void shouldKickPlayerWithAReason() { + PlayerData player = testUtils.createRandomPlayer(); + CommonSender sender = spy(server.getConsoleSender()); + CommonPlayer commonPlayer = spy(server.getPlayer(player.getName())); + String[] args = new String[]{player.getName(), "test reason"}; + + when(commonPlayer.hasPermission("bm.notify.kick")).thenReturn(false); + when(server.getPlayer(args[0])).thenReturn(commonPlayer); + + assert (cmd.onCommand(sender, new CommandParser(plugin, args))); + + verify(commonPlayer).kick("&6You have been kicked for &4" + args[1]); + verify(server).broadcast("&6" + args[0] + " has been kicked by Console for &4" + args[1], "bm.notify.kick"); + } + + @Test + public void shouldKickPlayerWithoutAReasonSilently() { + PlayerData player = testUtils.createRandomPlayer(); + CommonSender sender = spy(server.getConsoleSender()); + CommonPlayer commonPlayer = spy(server.getPlayer(player.getName())); + String[] args = new String[]{player.getName(), "-s"}; + + when(commonPlayer.hasPermission("bm.notify.kick")).thenReturn(false); + when(server.getPlayer(args[0])).thenReturn(commonPlayer); + + assert (cmd.onCommand(sender, new CommandParser(plugin, args))); + + verify(commonPlayer).kick("&6You have been kicked"); + verify(server, never()).broadcast("&6" + args[0] + " has been kicked by Console", "bm.notify.kick"); + } + + @Test + public void shouldKickPlayerWithAReasonSilently() { + PlayerData player = testUtils.createRandomPlayer(); + CommonSender sender = spy(server.getConsoleSender()); + CommonPlayer commonPlayer = spy(server.getPlayer(player.getName())); + String[] args = new String[]{player.getName(), "-s", "test", "reason"}; + + when(commonPlayer.hasPermission("bm.notify.kick")).thenReturn(false); + when(server.getPlayer(args[0])).thenReturn(commonPlayer); + + assert (cmd.onCommand(sender, new CommandParser(plugin, args))); + + verify(commonPlayer).kick("&6You have been kicked for &4test reason"); + verify(server, never()).broadcast("&6" + args[0] + " has been kicked by Console for &4test reason", "bm.notify.kick"); + } +} diff --git a/common/src/test/java/me/confuser/banmanager/common/commands/LoglessKickAllCommandTest.java b/common/src/test/java/me/confuser/banmanager/common/commands/LoglessKickAllCommandTest.java new file mode 100644 index 000000000..0fc23f900 --- /dev/null +++ b/common/src/test/java/me/confuser/banmanager/common/commands/LoglessKickAllCommandTest.java @@ -0,0 +1,115 @@ +package me.confuser.banmanager.common.commands; + +import me.confuser.banmanager.common.BasePluginDbTest; +import me.confuser.banmanager.common.CommonPlayer; +import me.confuser.banmanager.common.data.PlayerData; +import org.junit.Before; +import org.junit.Test; + +import static org.mockito.Mockito.*; + +public class LoglessKickAllCommandTest extends BasePluginDbTest { + private LoglessKickAllCommand cmd; + + @Before + public void setupCmd() { + for (CommonCommand cmd : plugin.getCommands()) { + if (cmd.getCommandName().equals("nlkickall")) { + this.cmd = (LoglessKickAllCommand) cmd; + break; + } + } + } + + @Test + public void shouldFailIfNoSilentPermission() { + CommonSender sender = spy(plugin.getServer().getConsoleSender()); + String[] args = new String[]{"-s", "test"}; + + when(sender.hasPermission(cmd.getPermission() + ".silent")).thenReturn(false); + + assert (cmd.onCommand(sender, new CommandParser(plugin, args, 0))); + verify(sender).sendMessage("&cYou do not have permission to perform that action"); + } + + @Test + public void shouldFailIfExempt() { + PlayerData player = testUtils.createRandomPlayer(); + CommonSender sender = spy(server.getConsoleSender()); + CommonPlayer commonPlayer = spy(server.getPlayer(player.getName())); + String[] args = new String[]{"test"}; + + when(sender.hasPermission("bm.exempt.override.kick")).thenReturn(false); + when(commonPlayer.hasPermission("bm.exempt.kick")).thenReturn(true); + when(server.getOnlinePlayers()).thenReturn(new CommonPlayer[]{commonPlayer}); + + assert (cmd.onCommand(sender, new CommandParser(plugin, args, 0))); + + verify(commonPlayer, never()).kick("&6You have been kicked"); + verify(server).broadcast("All players have been kicked by Console for &4test", "bm.notify.kick"); + } + + @Test + public void shouldKickPlayerWithoutAReason() { + PlayerData player = testUtils.createRandomPlayer(); + CommonSender sender = spy(server.getConsoleSender()); + CommonPlayer commonPlayer = spy(server.getPlayer(player.getName())); + String[] args = new String[]{}; + + when(commonPlayer.hasPermission("bm.notify.kick")).thenReturn(false); + when(server.getOnlinePlayers()).thenReturn(new CommonPlayer[]{commonPlayer}); + + assert (cmd.onCommand(sender, new CommandParser(plugin, args, 0))); + + verify(commonPlayer).kick("&6You have been kicked"); + verify(server).broadcast("All players have been kicked by Console", "bm.notify.kick"); + } + + @Test + public void shouldKickPlayerWithAReason() { + PlayerData player = testUtils.createRandomPlayer(); + CommonSender sender = spy(server.getConsoleSender()); + CommonPlayer commonPlayer = spy(server.getPlayer(player.getName())); + String[] args = new String[]{"test"}; + + when(commonPlayer.hasPermission("bm.notify.kick")).thenReturn(false); + when(server.getOnlinePlayers()).thenReturn(new CommonPlayer[]{commonPlayer}); + + assert (cmd.onCommand(sender, new CommandParser(plugin, args, 0))); + + verify(commonPlayer).kick("&6You have been kicked for &4" + args[0]); + verify(server).broadcast("All players have been kicked by Console for &4" + args[0], "bm.notify.kick"); + } + + @Test + public void shouldKickPlayerWithoutAReasonSilently() { + PlayerData player = testUtils.createRandomPlayer(); + CommonSender sender = spy(server.getConsoleSender()); + CommonPlayer commonPlayer = spy(server.getPlayer(player.getName())); + String[] args = new String[]{"-s"}; + + when(commonPlayer.hasPermission("bm.notify.kick")).thenReturn(false); + when(server.getOnlinePlayers()).thenReturn(new CommonPlayer[]{commonPlayer}); + + assert (cmd.onCommand(sender, new CommandParser(plugin, args, 0))); + + verify(commonPlayer).kick("&6You have been kicked"); + verify(server, never()).broadcast("All players have been kicked by Console", "bm.notify.kick"); + } + + @Test + public void shouldKickPlayerWithAReasonSilently() { + PlayerData player = testUtils.createRandomPlayer(); + CommonSender sender = spy(server.getConsoleSender()); + CommonPlayer commonPlayer = spy(server.getPlayer(player.getName())); + String[] args = new String[]{"-s", "test", "reason"}; + + when(commonPlayer.hasPermission("bm.notify.kick")).thenReturn(false); + when(server.getOnlinePlayers()).thenReturn(new CommonPlayer[]{commonPlayer}); + + assert (cmd.onCommand(sender, new CommandParser(plugin, args, 0))); + + verify(commonPlayer).kick("&6You have been kicked for &4test reason"); + verify(server, never()).broadcast("All players have been kicked by Console for &4test reason", "bm.notify.kick"); + } +} diff --git a/common/src/test/java/me/confuser/banmanager/common/commands/MuteCommandTest.java b/common/src/test/java/me/confuser/banmanager/common/commands/MuteCommandTest.java new file mode 100755 index 000000000..ba7b39ee7 --- /dev/null +++ b/common/src/test/java/me/confuser/banmanager/common/commands/MuteCommandTest.java @@ -0,0 +1,173 @@ +package me.confuser.banmanager.common.commands; + +import me.confuser.banmanager.common.BasePluginDbTest; +import me.confuser.banmanager.common.CommonPlayer; +import me.confuser.banmanager.common.CommonServer; +import me.confuser.banmanager.common.configs.ExemptionsConfig; +import me.confuser.banmanager.common.data.PlayerMuteData; +import me.confuser.banmanager.common.data.PlayerData; +import org.junit.Before; +import org.junit.Test; + +import java.sql.SQLException; + +import static org.awaitility.Awaitility.await; +import static org.junit.Assert.*; +import static org.mockito.Mockito.*; + +public class MuteCommandTest extends BasePluginDbTest { + private MuteCommand cmd; + + @Before + public void setupCmd() { + for (CommonCommand cmd : plugin.getCommands()) { + if (cmd.getCommandName().equals("mute")) { + this.cmd = (MuteCommand) cmd; + break; + } + } + } + + @Test + public void shouldFailIfNoReasonGiven() { + CommonSender sender = plugin.getServer().getConsoleSender(); + String[] args = new String[]{"confuser"}; + + assertFalse(cmd.onCommand(sender, new CommandParser(plugin, args, 1))); + } + + @Test + public void shouldFailIfNoSilentPermission() { + CommonSender sender = spy(plugin.getServer().getConsoleSender()); + String[] args = new String[]{"-s", "confuser", "test"}; + + when(sender.hasPermission(cmd.getPermission() + ".silent")).thenReturn(false); + + assert (cmd.onCommand(sender, new CommandParser(plugin, args, 1))); + verify(sender).sendMessage("&cYou do not have permission to perform that action"); + } + + @Test + public void shouldFailIfSelf() { + CommonSender sender = spy(plugin.getServer().getConsoleSender()); + String[] args = new String[]{"Console", "test"}; + + assert (cmd.onCommand(sender, new CommandParser(plugin, args, 1))); + verify(sender).sendMessage("&cYou cannot perform that action on yourself!"); + } + + @Test + public void shouldFailIfAlreadyMuted() throws SQLException { + PlayerData player = testUtils.createRandomPlayer(); + CommonSender sender = spy(plugin.getServer().getConsoleSender()); + String[] args = new String[]{player.getName(), "test"}; + + assert plugin.getPlayerMuteStorage().mute(new PlayerMuteData(player, sender.getData(), args[1], true, false)); + + when(sender.hasPermission(cmd.getPermission() + ".override")).thenReturn(false); + + assert (cmd.onCommand(sender, new CommandParser(plugin, args, 1))); + verify(sender).sendMessage("&c" + player.getName() + " is already muted"); + } + + @Test + public void shouldFailIfOffline() { + CommonSender sender = spy(plugin.getServer().getConsoleSender()); + String[] args = new String[]{testUtils.createRandomPlayerName(), "test"}; + + when(sender.hasPermission(cmd.getPermission() + ".offline")).thenReturn(false); + + assert (cmd.onCommand(sender, new CommandParser(plugin, args, 1))); + verify(sender).sendMessage("&cYou are not allowed to perform this action on an offline player"); + } + + @Test + public void shouldFailIfExempt() { + PlayerData player = testUtils.createRandomPlayer(); + CommonServer server = spy(plugin.getServer()); + CommonSender sender = spy(server.getConsoleSender()); + CommonPlayer commonPlayer = spy(server.getPlayer(player.getName())); + String[] args = new String[]{player.getName(), "test"}; + + when(sender.hasPermission("bm.exempt.override.mute")).thenReturn(false); + when(commonPlayer.hasPermission("bm.exempt.mute")).thenReturn(true); + + assert (cmd.onCommand(sender, new CommandParser(plugin, args, 1))); + verify(sender).sendMessage("&c" + player.getName() + " is exempt from that action"); + } + + @Test + public void shouldFailIfNotFound() { + CommonSender sender = spy(plugin.getServer().getConsoleSender()); + String[] args = new String[]{faker.internet().uuid(), "test"}; + + assert (cmd.onCommand(sender, new CommandParser(plugin, args, 1))); + verify(sender).sendMessage("&c" + args[0] + " not found, are you sure they exist?"); + } + + @Test + public void shouldFailIfOfflineExempt() { + PlayerData player = testUtils.createRandomPlayer(); + CommonServer server = spy(plugin.getServer()); + CommonSender sender = spy(server.getConsoleSender()); + ExemptionsConfig config = spy(plugin.getExemptionsConfig()); + String[] args = new String[]{player.getName(), "test"}; + + when(sender.hasPermission("bm.exempt.override.mute")).thenReturn(false); + when(config.isExempt(player, "mute")).thenReturn(true); + + assert (cmd.onCommand(sender, new CommandParser(plugin, args, 1))); + verify(sender).sendMessage("&c" + player.getName() + " is exempt from that action"); + } + + @Test + public void shouldMutePlayer() { + PlayerData player = testUtils.createRandomPlayer(); + CommonServer server = spy(plugin.getServer()); + CommonSender sender = spy(server.getConsoleSender()); + String[] args = new String[]{player.getName(), "test"}; + + assert (cmd.onCommand(sender, new CommandParser(plugin, args, 1))); + + await().until(() -> plugin.getPlayerMuteStorage().isMuted(player.getUUID())); + PlayerMuteData mute = plugin.getPlayerMuteStorage().getMute(player.getUUID()); + + assertEquals(player.getName(), mute.getPlayer().getName()); + assertEquals("test", mute.getReason()); + assertEquals(sender.getName(), mute.getActor().getName()); + assertFalse(mute.isSilent()); + } + + @Test + public void shouldMutePlayerSoftly() { + PlayerData player = testUtils.createRandomPlayer(); + CommonServer server = spy(plugin.getServer()); + CommonSender sender = spy(server.getConsoleSender()); + String[] args = new String[]{player.getName(), "test", "-st"}; + + assert (cmd.onCommand(sender, new CommandParser(plugin, args, 1))); + + await().until(() -> plugin.getPlayerMuteStorage().isMuted(player.getUUID())); + PlayerMuteData mute = plugin.getPlayerMuteStorage().getMute(player.getUUID()); + + assertEquals(player.getName(), mute.getPlayer().getName()); + assertEquals("test", mute.getReason()); + assertEquals(sender.getName(), mute.getActor().getName()); + assertFalse(mute.isSilent()); + assertTrue(mute.isSoft()); + } + + @Test + public void shouldMutePlayerSilently() { + PlayerData player = testUtils.createRandomPlayer(); + CommonServer server = spy(plugin.getServer()); + CommonSender sender = spy(server.getConsoleSender()); + String[] args = new String[]{player.getName(), "test", "-s"}; + + assert (cmd.onCommand(sender, new CommandParser(plugin, args, 1))); + + await().until(() -> plugin.getPlayerMuteStorage().isMuted(player.getUUID())); + + assertTrue(plugin.getPlayerMuteStorage().getMute(player.getUUID()).isSilent()); + } +} \ No newline at end of file diff --git a/common/src/test/java/me/confuser/banmanager/common/commands/MuteIpCommandTest.java b/common/src/test/java/me/confuser/banmanager/common/commands/MuteIpCommandTest.java new file mode 100755 index 000000000..ffec0bac0 --- /dev/null +++ b/common/src/test/java/me/confuser/banmanager/common/commands/MuteIpCommandTest.java @@ -0,0 +1,164 @@ +package me.confuser.banmanager.common.commands; + +import me.confuser.banmanager.common.BasePluginDbTest; +import me.confuser.banmanager.common.CommonPlayer; +import me.confuser.banmanager.common.CommonServer; +import me.confuser.banmanager.common.configs.ExemptionsConfig; +import me.confuser.banmanager.common.data.IpMuteData; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.ipaddr.IPAddress; +import me.confuser.banmanager.common.util.IPUtils; +import org.junit.Before; +import org.junit.Test; + +import java.sql.SQLException; + +import static org.awaitility.Awaitility.await; +import static org.junit.Assert.*; +import static org.mockito.Mockito.*; + +public class MuteIpCommandTest extends BasePluginDbTest { + private MuteIpCommand cmd; + + @Before + public void setupCmd() { + for (CommonCommand cmd : plugin.getCommands()) { + if (cmd.getCommandName().equals("muteip")) { + this.cmd = (MuteIpCommand) cmd; + break; + } + } + } + + @Test + public void shouldFailIfNoReasonGiven() { + CommonSender sender = plugin.getServer().getConsoleSender(); + String[] args = new String[]{faker.internet().ipV6Address()}; + + assertFalse(cmd.onCommand(sender, new CommandParser(plugin, args, 1))); + } + + @Test + public void shouldFailIfNoSilentPermission() { + CommonSender sender = spy(plugin.getServer().getConsoleSender()); + String[] args = new String[]{"-s", faker.internet().ipV6Address(), "test"}; + + when(sender.hasPermission(cmd.getPermission() + ".silent")).thenReturn(false); + + assert (cmd.onCommand(sender, new CommandParser(plugin, args, 1))); + verify(sender).sendMessage("&cYou do not have permission to perform that action"); + } + + @Test + public void shouldFailIfSelf() { + CommonSender sender = spy(plugin.getServer().getConsoleSender()); + String[] args = new String[]{"Console", "test"}; + + assert (cmd.onCommand(sender, new CommandParser(plugin, args, 1))); + verify(sender).sendMessage("&cYou cannot perform that action on yourself!"); + } + + @Test + public void shouldFailIfAlreadyBanned() throws SQLException { + IPAddress ip = IPUtils.toIPAddress(faker.internet().ipV6Address()); + CommonSender sender = spy(plugin.getServer().getConsoleSender()); + String[] args = new String[]{ip.toString(), "test"}; + + assert plugin.getIpMuteStorage().mute(new IpMuteData(ip, sender.getData(), args[1], true, false)); + + when(sender.hasPermission(cmd.getPermission() + ".override")).thenReturn(false); + + assert (cmd.onCommand(sender, new CommandParser(plugin, args, 1))); + verify(sender).sendMessage("&c" + ip.toString() + " is already muted"); + } + + @Test + public void shouldFailIfExempt() { + PlayerData player = testUtils.createRandomPlayer(); + CommonServer server = spy(plugin.getServer()); + CommonSender sender = spy(server.getConsoleSender()); + CommonPlayer commonPlayer = spy(server.getPlayer(player.getName())); + String[] args = new String[]{player.getName(), "test"}; + + when(sender.hasPermission("bm.exempt.override.muteip")).thenReturn(false); + when(commonPlayer.hasPermission("bm.exempt.muteip")).thenReturn(true); + + assert (cmd.onCommand(sender, new CommandParser(plugin, args, 1))); + verify(sender).sendMessage("&c" + player.getName() + " is exempt from that action"); + } + + @Test + public void shouldFailIfNotFound() { + CommonSender sender = spy(plugin.getServer().getConsoleSender()); + String[] args = new String[]{testUtils.createRandomPlayerName(), "test"}; + + assert (cmd.onCommand(sender, new CommandParser(plugin, args, 1))); + verify(sender).sendMessage("&c" + args[0] + " not found, are you sure they exist?"); + } + + @Test + public void shouldFailIfOfflineExempt() { + PlayerData player = testUtils.createRandomPlayer(); + CommonServer server = spy(plugin.getServer()); + CommonSender sender = spy(server.getConsoleSender()); + ExemptionsConfig config = spy(plugin.getExemptionsConfig()); + String[] args = new String[]{player.getName(), "test"}; + + when(sender.hasPermission("bm.exempt.override.muteip")).thenReturn(false); + when(config.isExempt(player, "ban")).thenReturn(true); + + assert (cmd.onCommand(sender, new CommandParser(plugin, args, 1))); + verify(sender).sendMessage("&c" + player.getName() + " is exempt from that action"); + } + + @Test + public void shouldMuteIp() { + IPAddress ip = IPUtils.toIPAddress(faker.internet().ipV6Address()); + CommonServer server = spy(plugin.getServer()); + CommonSender sender = spy(server.getConsoleSender()); + String[] args = new String[]{ip.toString(), "test"}; + + assert (cmd.onCommand(sender, new CommandParser(plugin, args, 1))); + + await().until(() -> plugin.getIpMuteStorage().isMuted(ip)); + IpMuteData mute = plugin.getIpMuteStorage().getMute(ip); + + assertEquals(ip, mute.getIp()); + assertEquals("test", mute.getReason()); + assertEquals(sender.getName(), mute.getActor().getName()); + assertFalse(mute.isSilent()); + } + + @Test + public void shouldMuteIpSilently() { + IPAddress ip = IPUtils.toIPAddress(faker.internet().ipV6Address()); + CommonServer server = spy(plugin.getServer()); + CommonSender sender = spy(server.getConsoleSender()); + String[] args = new String[]{ip.toString(), "test", "-s"}; + + assert (cmd.onCommand(sender, new CommandParser(plugin, args, 1))); + + await().until(() -> plugin.getIpMuteStorage().isMuted(ip)); + + assertTrue(plugin.getIpMuteStorage().getMute(ip).isSilent()); + } + + @Test + public void shouldMuteIpSoftly() { + IPAddress ip = IPUtils.toIPAddress(faker.internet().ipV6Address()); + CommonServer server = spy(plugin.getServer()); + CommonSender sender = spy(server.getConsoleSender()); + String[] args = new String[]{ip.toString(), "test", "-st"}; + + assert (cmd.onCommand(sender, new CommandParser(plugin, args, 1))); + + await().until(() -> plugin.getIpMuteStorage().isMuted(ip)); + IpMuteData mute = plugin.getIpMuteStorage().getMute(ip); + + assertEquals(ip, mute.getIp()); + assertEquals("test", mute.getReason()); + assertEquals(sender.getName(), mute.getActor().getName()); + assertFalse(mute.isSilent()); + assertTrue(mute.isSoft()); + } +} \ No newline at end of file diff --git a/common/src/test/java/me/confuser/banmanager/common/commands/TempBanCommandTest.java b/common/src/test/java/me/confuser/banmanager/common/commands/TempBanCommandTest.java new file mode 100644 index 000000000..c05e09e7f --- /dev/null +++ b/common/src/test/java/me/confuser/banmanager/common/commands/TempBanCommandTest.java @@ -0,0 +1,154 @@ +package me.confuser.banmanager.common.commands; + +import me.confuser.banmanager.common.BasePluginDbTest; +import me.confuser.banmanager.common.CommonPlayer; +import me.confuser.banmanager.common.CommonServer; +import me.confuser.banmanager.common.configs.ExemptionsConfig; +import me.confuser.banmanager.common.data.PlayerBanData; +import me.confuser.banmanager.common.data.PlayerData; +import org.junit.Before; +import org.junit.Test; + +import java.sql.SQLException; + +import static org.awaitility.Awaitility.await; +import static org.junit.Assert.*; +import static org.mockito.Mockito.*; + +public class TempBanCommandTest extends BasePluginDbTest { + private TempBanCommand cmd; + + @Before + public void setupCmd() { + for (CommonCommand cmd : plugin.getCommands()) { + if (cmd.getCommandName().equals("tempban")) { + this.cmd = (TempBanCommand) cmd; + break; + } + } + } + + @Test + public void shouldFailIfNoReasonGiven() { + CommonSender sender = plugin.getServer().getConsoleSender(); + String[] args = new String[]{"confuser", "1d"}; + + assertFalse(cmd.onCommand(sender, new CommandParser(plugin, args, 2))); + } + + @Test + public void shouldFailIfNoSilentPermission() { + CommonSender sender = spy(plugin.getServer().getConsoleSender()); + String[] args = new String[]{"-s", "confuser", "1d", "test"}; + + when(sender.hasPermission(cmd.getPermission() + ".silent")).thenReturn(false); + + assert (cmd.onCommand(sender, new CommandParser(plugin, args, 2))); + verify(sender).sendMessage("&cYou do not have permission to perform that action"); + } + + @Test + public void shouldFailIfSelf() { + CommonSender sender = spy(plugin.getServer().getConsoleSender()); + String[] args = new String[]{"Console", "1d", "test"}; + + assert (cmd.onCommand(sender, new CommandParser(plugin, args, 2))); + verify(sender).sendMessage("&cYou cannot perform that action on yourself!"); + } + + @Test + public void shouldFailIfAlreadyBanned() throws SQLException { + PlayerData player = testUtils.createRandomPlayer(); + CommonSender sender = spy(plugin.getServer().getConsoleSender()); + String[] args = new String[]{player.getName(), "1d", "test"}; + + assert plugin.getPlayerBanStorage().ban(new PlayerBanData(player, sender.getData(), args[1], true)); + + when(sender.hasPermission(cmd.getPermission() + ".override")).thenReturn(false); + + assert (cmd.onCommand(sender, new CommandParser(plugin, args, 2))); + verify(sender).sendMessage("&c" + player.getName() + " is already banned"); + } + + @Test + public void shouldFailIfOffline() { + CommonSender sender = spy(plugin.getServer().getConsoleSender()); + String[] args = new String[]{testUtils.createRandomPlayerName(), "1d", "test"}; + + when(sender.hasPermission(cmd.getPermission() + ".offline")).thenReturn(false); + + assert (cmd.onCommand(sender, new CommandParser(plugin, args, 2))); + verify(sender).sendMessage("&cYou are not allowed to perform this action on an offline player"); + } + + @Test + public void shouldFailIfExempt() { + PlayerData player = testUtils.createRandomPlayer(); + CommonServer server = spy(plugin.getServer()); + CommonSender sender = spy(server.getConsoleSender()); + CommonPlayer commonPlayer = spy(server.getPlayer(player.getName())); + String[] args = new String[]{player.getName(), "1d", "test"}; + + when(sender.hasPermission("bm.exempt.override.tempban")).thenReturn(false); + when(commonPlayer.hasPermission("bm.exempt.ban")).thenReturn(true); + + assert (cmd.onCommand(sender, new CommandParser(plugin, args, 2))); + verify(sender).sendMessage("&c" + player.getName() + " is exempt from that action"); + } + + @Test + public void shouldFailIfNotFound() { + CommonSender sender = spy(plugin.getServer().getConsoleSender()); + String[] args = new String[]{faker.internet().uuid(), "1d", "test"}; + + assert (cmd.onCommand(sender, new CommandParser(plugin, args, 2))); + verify(sender).sendMessage("&c" + args[0] + " not found, are you sure they exist?"); + } + + @Test + public void shouldFailIfOfflineExempt() { + PlayerData player = testUtils.createRandomPlayer(); + CommonServer server = spy(plugin.getServer()); + CommonSender sender = spy(server.getConsoleSender()); + ExemptionsConfig config = spy(plugin.getExemptionsConfig()); + String[] args = new String[]{player.getName(), "1d", "test"}; + + when(sender.hasPermission("bm.exempt.override.tempban")).thenReturn(false); + when(config.isExempt(player, "tempban")).thenReturn(true); + + assert (cmd.onCommand(sender, new CommandParser(plugin, args, 2))); + verify(sender).sendMessage("&c" + player.getName() + " is exempt from that action"); + } + + @Test + public void shouldBanPlayer() { + PlayerData player = testUtils.createRandomPlayer(); + CommonServer server = spy(plugin.getServer()); + CommonSender sender = spy(server.getConsoleSender()); + String[] args = new String[]{player.getName(), "30y", "test"}; + + assert (cmd.onCommand(sender, new CommandParser(plugin, args, 2))); + + await().until(() -> plugin.getPlayerBanStorage().isBanned(player.getUUID())); + PlayerBanData ban = plugin.getPlayerBanStorage().getBan(player.getUUID()); + + assertEquals(player.getName(), ban.getPlayer().getName()); + assertEquals("test", ban.getReason()); + assertEquals(sender.getName(), ban.getActor().getName()); + assertFalse(ban.isSilent()); + } + + @Test + public void shouldBanPlayerSilently() { + PlayerData player = testUtils.createRandomPlayer(); + CommonServer server = spy(plugin.getServer()); + CommonSender sender = spy(server.getConsoleSender()); + String[] args = new String[]{player.getName(), "30y", "test", "-s"}; + + assert (cmd.onCommand(sender, new CommandParser(plugin, args, 2))); + + await().until(() -> plugin.getPlayerBanStorage().isBanned(player.getUUID())); + + assertTrue(plugin.getPlayerBanStorage().getBan(player.getUUID()).isSilent()); + } +} diff --git a/common/src/test/java/me/confuser/banmanager/common/commands/WarnCommandTest.java b/common/src/test/java/me/confuser/banmanager/common/commands/WarnCommandTest.java new file mode 100644 index 000000000..0bfdfdcb0 --- /dev/null +++ b/common/src/test/java/me/confuser/banmanager/common/commands/WarnCommandTest.java @@ -0,0 +1,144 @@ +package me.confuser.banmanager.common.commands; + +import me.confuser.banmanager.common.BasePluginDbTest; +import me.confuser.banmanager.common.CommonPlayer; +import me.confuser.banmanager.common.CommonServer; +import me.confuser.banmanager.common.configs.ActionCommand; +import me.confuser.banmanager.common.configs.WarningActionsConfig; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.data.PlayerWarnData; +import me.confuser.banmanager.common.util.DateUtils; +import me.confuser.banmanager.common.util.parsers.WarnCommandParser; +import org.junit.Before; +import org.junit.Test; + +import java.sql.SQLException; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; + +import static org.junit.Assert.*; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyBoolean; +import static org.mockito.Mockito.*; +import static org.awaitility.Awaitility.await; +import java.lang.reflect.Field; + +public class WarnCommandTest extends BasePluginDbTest { + private WarnCommand cmd; + + @Before + public void setupCmd() { + for (CommonCommand cmd : plugin.getCommands()) { + if (cmd.getCommandName().equals("warn")) { + this.cmd = (WarnCommand) cmd; + break; + } + } + } + + @Test + public void shouldFailIfNoSilentPermission() { + CommonSender sender = spy(plugin.getServer().getConsoleSender()); + String[] args = new String[]{"-s", "confuser", "test"}; + + when(sender.hasPermission(cmd.getPermission() + ".silent")).thenReturn(false); + + assert (cmd.onCommand(sender, new WarnCommandParser(plugin, args, 1))); + verify(sender).sendMessage("&cYou do not have permission to perform that action"); + } + + @Test + public void shouldFailIfNoPointsPermission() { + CommonSender sender = spy(plugin.getServer().getConsoleSender()); + String[] args = new String[]{"-p", "5", "confuser", "test"}; + + when(sender.hasPermission(cmd.getPermission() + ".points")).thenReturn(false); + + assert (cmd.onCommand(sender, new WarnCommandParser(plugin, args, 1))); + verify(sender).sendMessage("&cYou do not have permission to perform that action"); + } + + @Test + public void shouldFailIfSelfWarn() { + CommonSender sender = spy(plugin.getServer().getConsoleSender()); + String[] args = new String[]{"Console", "test"}; + + assert (cmd.onCommand(sender, new WarnCommandParser(plugin, args, 1))); + verify(sender).sendMessage("&cYou cannot perform that action on yourself!"); + } + + @Test + public void shouldFailIfOffline() { + CommonSender sender = spy(plugin.getServer().getConsoleSender()); + String[] args = new String[]{testUtils.createRandomPlayerName(), "test"}; + + when(sender.hasPermission("bm.command.warn.offline")).thenReturn(false); + + assert (cmd.onCommand(sender, new WarnCommandParser(plugin, args, 1))); + verify(sender).sendMessage("&cYou are not allowed to perform this action on an offline player"); + } + + @Test + public void shouldFailIfPlayerExempt() { + CommonSender sender = spy(plugin.getServer().getConsoleSender()); + PlayerData player = testUtils.createRandomPlayer(); + CommonPlayer commonPlayer = spy(server.getPlayer(player.getName())); + String[] args = new String[]{player.getName(), "test"}; + + when(sender.hasPermission("bm.exempt.override.warn")).thenReturn(false); + when(commonPlayer.hasPermission("bm.exempt.warn")).thenReturn(true); + + assert (cmd.onCommand(sender, new WarnCommandParser(plugin, args, 1))); + verify(sender).sendMessage("&c" + player.getName() + " is exempt from that action"); + } + + @Test + public void shouldWarnPlayer() throws SQLException { + PlayerData player = testUtils.createRandomPlayer(); + CommonServer server = spy(plugin.getServer()); + CommonSender sender = spy(server.getConsoleSender()); + String[] args = new String[]{player.getName(), "test"}; + + assert (cmd.onCommand(sender, new WarnCommandParser(plugin, args, 1))); + + await().until(() -> plugin.getPlayerWarnStorage().getCount(player) == 1); + PlayerWarnData data = plugin.getPlayerWarnStorage().getWarnings(player).next(); + + assertEquals(player.getName(), data.getPlayer().getName()); + assertEquals("test", data.getReason()); + assertEquals(sender.getName(), data.getActor().getName()); + } + + @Test + public void shouldTriggerPointsTimeframeWarningActions() throws Exception { + CommonSender sender = spy(plugin.getServer().getConsoleSender()); + PlayerData player = testUtils.createRandomPlayer(); + + ActionCommand commandWithTimeframe = new ActionCommand("kick", 0, "5m"); + ActionCommand commandWithoutTimeframe = new ActionCommand("ban", 0, ""); + ActionCommand commandWithOldTimeframe = new ActionCommand("kick", 0, "30d"); + WarningActionsConfig warningActionsConfig = spy(plugin.getConfig().getWarningActions()); + + plugin.getPlayerWarnStorage().addWarning(new PlayerWarnData(player, sender.getData(), "testing", false, 0, DateUtils.parseDateDiff("31d", false)), false); + plugin.getPlayerWarnStorage().addWarning(new PlayerWarnData(player, sender.getData(), "testing", false, 0, DateUtils.parseDateDiff("1m", false)), false); + + await().until(() -> plugin.getPlayerWarnStorage().getCount(player) == 2); + + HashMap> actions = new HashMap<>(); + actions.put(1.0, Arrays.asList(commandWithoutTimeframe, commandWithTimeframe, commandWithOldTimeframe)); + + Field actionsField = WarningActionsConfig.class.getDeclaredField("actions"); + actionsField.setAccessible(true); + actionsField.set(warningActionsConfig, actions); + + List commands = warningActionsConfig.getCommands(player, 5); + + assertEquals(2, commands.size()); + + assertTrue(commands.contains(commandWithTimeframe)); + assertTrue(commands.contains(commandWithOldTimeframe)); + assertFalse(commands.contains(commandWithoutTimeframe)); + } +} diff --git a/common/src/test/java/me/confuser/banmanager/common/configs/ConsoleConfigTest.java b/common/src/test/java/me/confuser/banmanager/common/configs/ConsoleConfigTest.java new file mode 100644 index 000000000..d3cf46cd1 --- /dev/null +++ b/common/src/test/java/me/confuser/banmanager/common/configs/ConsoleConfigTest.java @@ -0,0 +1,18 @@ +package me.confuser.banmanager.common.configs; + +import me.confuser.banmanager.common.BasePluginTest; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +public class ConsoleConfigTest extends BasePluginTest { + + @Test + public void isValid() { + assertEquals("Console", plugin.getConsoleConfig().getName()); + assertTrue(plugin + .getConsoleConfig().getUuid().toString() + .matches("[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[34][0-9a-fA-F]{3}-[89ab][0-9a-fA-F]{3}-[0-9a-fA-F]{12}")); + } +} diff --git a/common/src/test/java/me/confuser/banmanager/common/configs/DefaultConfigTest.java b/common/src/test/java/me/confuser/banmanager/common/configs/DefaultConfigTest.java new file mode 100644 index 000000000..4cb2e4620 --- /dev/null +++ b/common/src/test/java/me/confuser/banmanager/common/configs/DefaultConfigTest.java @@ -0,0 +1,5 @@ +package me.confuser.banmanager.common.configs; + +public class DefaultConfigTest { + +} diff --git a/common/src/test/java/me/confuser/banmanager/common/configs/GeoIpConfigTest.java b/common/src/test/java/me/confuser/banmanager/common/configs/GeoIpConfigTest.java new file mode 100644 index 000000000..14284a177 --- /dev/null +++ b/common/src/test/java/me/confuser/banmanager/common/configs/GeoIpConfigTest.java @@ -0,0 +1,14 @@ +package me.confuser.banmanager.common.configs; + +import me.confuser.banmanager.common.BasePluginTest; +import org.junit.Test; + +import static org.junit.Assert.assertFalse; + +public class GeoIpConfigTest extends BasePluginTest { + + @Test + public void isValid() { + assertFalse(plugin.getGeoIpConfig().isEnabled()); + } +} diff --git a/common/src/test/java/me/confuser/banmanager/common/configs/MessagesConfigTest.java b/common/src/test/java/me/confuser/banmanager/common/configs/MessagesConfigTest.java new file mode 100644 index 000000000..fd0c76703 --- /dev/null +++ b/common/src/test/java/me/confuser/banmanager/common/configs/MessagesConfigTest.java @@ -0,0 +1,18 @@ +package me.confuser.banmanager.common.configs; + +import me.confuser.banmanager.common.BasePluginTest; +import me.confuser.banmanager.common.util.Message; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class MessagesConfigTest extends BasePluginTest { + + @Test + public void isValid() { + // @TODO test tokens for all messages + assertEquals("&6Currently banned for &4abc&6 by def at 8th July which expires in 1d", Message + .get("info.ban.temporary").set("reason", "abc").set("actor", "def").set("created", + "8th July").set("expires", "1d").toString()); + } +} diff --git a/common/src/test/java/me/confuser/banmanager/common/configs/SchedulesConfigTest.java b/common/src/test/java/me/confuser/banmanager/common/configs/SchedulesConfigTest.java new file mode 100644 index 000000000..8f4bcd73a --- /dev/null +++ b/common/src/test/java/me/confuser/banmanager/common/configs/SchedulesConfigTest.java @@ -0,0 +1,40 @@ +package me.confuser.banmanager.common.configs; + +import me.confuser.banmanager.common.BasePluginTest; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class SchedulesConfigTest extends BasePluginTest { + @Test + public void isValid() { + SchedulesConfig config = plugin.getSchedulesConfig(); + + assertEquals(5, config.getSchedule("expiresCheck")); + assertEquals(5, config.getSchedule("playerBans")); + assertEquals(5, config.getSchedule("playerMutes")); + assertEquals(5, config.getSchedule("playerWarnings")); + assertEquals(5, config.getSchedule("ipBans")); + assertEquals(5, config.getSchedule("ipRangeBans")); + assertEquals(30, config.getSchedule("rollbacks")); + assertEquals(5, config.getSchedule("nameBans")); + assertEquals(5, config.getSchedule("externalPlayerBans")); + assertEquals(5, config.getSchedule("externalPlayerMutes")); + assertEquals(5, config.getSchedule("externalPlayerNotes")); + assertEquals(5, config.getSchedule("externalIpBans")); + assertEquals(60, config.getSchedule("saveLastChecked")); + + assertEquals(0, config.getLastChecked("expiresCheck")); + assertEquals(0, config.getLastChecked("playerBans")); + assertEquals(0, config.getLastChecked("playerMutes")); + assertEquals(0, config.getLastChecked("playerWarnings")); + assertEquals(0, config.getLastChecked("ipBans")); + assertEquals(0, config.getLastChecked("ipRangeBans")); + assertEquals(0, config.getLastChecked("rollbacks")); + assertEquals(0, config.getLastChecked("nameBans")); + assertEquals(0, config.getLastChecked("externalPlayerBans")); + assertEquals(0, config.getLastChecked("externalPlayerMutes")); + assertEquals(0, config.getLastChecked("externalPlayerNotes")); + assertEquals(0, config.getLastChecked("externalIpBans")); + } +} diff --git a/common/src/test/java/me/confuser/banmanager/common/listeners/NoteListenerTest.java b/common/src/test/java/me/confuser/banmanager/common/listeners/NoteListenerTest.java new file mode 100755 index 000000000..2007faa01 --- /dev/null +++ b/common/src/test/java/me/confuser/banmanager/common/listeners/NoteListenerTest.java @@ -0,0 +1,38 @@ +package me.confuser.banmanager.common.listeners; + +import me.confuser.banmanager.common.*; +import me.confuser.banmanager.common.commands.CommonSender; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.data.PlayerNoteData; +import me.confuser.banmanager.common.util.Message; +import org.junit.Test; + +import static org.mockito.Mockito.*; + +public class NoteListenerTest extends BasePluginDbTest { + @Test + public void shouldBroadcast() { + PlayerData player = testUtils.createRandomPlayer(); + BanManagerPlugin plugin = spy(this.plugin); + CommonServer server = spy(plugin.getServer()); + CommonSender sender = plugin.getServer().getConsoleSender(); + PlayerNoteData data = new PlayerNoteData(player, sender.getData(), "test"); + CommonPlayer testPlayer = spy(new TestPlayer(sender.getData().getUUID(), sender.getName(), false)); + Message message = Message.get("notes.notify"); + + message.set("player", data.getPlayer().getName()) + .set("playerId", data.getPlayer().getUUID().toString()) + .set("actor", data.getActor().getName()) + .set("message", data.getMessage()); + + when(plugin.getServer()).thenReturn(server); + when(server.getPlayer(sender.getData().getUUID())).thenReturn(testPlayer); + when(testPlayer.hasPermission("bm.notify.notes")).thenReturn(false); + + CommonNoteListener listener = new CommonNoteListener(plugin); + listener.notifyOnNote(data); + + verify(server).broadcast(message.toString(), "bm.notify.notes"); + verify(testPlayer).sendMessage(message); + } +} diff --git a/common/src/test/java/me/confuser/banmanager/common/storage/PlayerHistoryStorageTest.java b/common/src/test/java/me/confuser/banmanager/common/storage/PlayerHistoryStorageTest.java new file mode 100644 index 000000000..50395db62 --- /dev/null +++ b/common/src/test/java/me/confuser/banmanager/common/storage/PlayerHistoryStorageTest.java @@ -0,0 +1,73 @@ +package me.confuser.banmanager.common.storage; + +import me.confuser.banmanager.common.BasePluginDbTest; +import me.confuser.banmanager.common.configs.CleanUp; +import me.confuser.banmanager.common.data.IpBanData; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.data.PlayerHistoryData; +import org.junit.After; +import org.junit.Test; + +import java.sql.SQLException; + +import static org.junit.Assert.assertEquals; + +public class PlayerHistoryStorageTest extends BasePluginDbTest { + @After + public void clear() throws SQLException { + plugin.getPlayerHistoryStorage().updateRaw("TRUNCATE TABLE " + plugin.getPlayerHistoryStorage().getTableName()); + } + + @Test + public void shouldNotPurge() throws SQLException { + PlayerData player = testUtils.createRandomPlayer(); + PlayerHistoryStorage storage = plugin.getPlayerHistoryStorage(); + storage.create(new PlayerHistoryData(player)); + storage.create(new PlayerHistoryData(player)); + + assertEquals(2, storage.countOf()); + + storage.purge(new CleanUp(0)); + + assertEquals(2, storage.countOf()); + } + + @Test + public void shouldPurgeOlderThan30Days() throws SQLException { + PlayerData player = testUtils.createRandomPlayer(); + PlayerHistoryStorage storage = plugin.getPlayerHistoryStorage(); + PlayerHistoryData data = new PlayerHistoryData(player); + long leaveTime = (System.currentTimeMillis() / 1000L) - (86400 * 31); + + storage.create(data); + + data.setLeave(leaveTime); + storage.create(data); + + assertEquals(2, storage.countOf()); + + storage.purge(new CleanUp(30)); + + assertEquals(1, storage.countOf()); + } + + @Test + public void shouldNotPurgeIfBanned() throws SQLException { + PlayerData player = testUtils.createRandomPlayer(); + PlayerHistoryStorage storage = plugin.getPlayerHistoryStorage(); + PlayerHistoryData data = new PlayerHistoryData(player); + IpBanData banData = new IpBanData(player.getIp(), player, "test", false); + long leaveTime = (System.currentTimeMillis() / 1000L) - (86401 * 30); + + data.setLeave(leaveTime); + storage.create(data); + + assertEquals(1, storage.countOf()); + plugin.getIpBanStorage().create(banData); + + storage.purge(new CleanUp(30)); + + assertEquals(1, storage.countOf()); + plugin.getIpBanStorage().delete(banData); + } +} diff --git a/common/src/test/java/me/confuser/banmanager/common/storage/PlayerStorageTest.java b/common/src/test/java/me/confuser/banmanager/common/storage/PlayerStorageTest.java new file mode 100644 index 000000000..6b72639c4 --- /dev/null +++ b/common/src/test/java/me/confuser/banmanager/common/storage/PlayerStorageTest.java @@ -0,0 +1,59 @@ +package me.confuser.banmanager.common.storage; + +import me.confuser.banmanager.common.BasePluginDbTest; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.ormlite.dao.Dao; +import org.junit.Test; + +import java.sql.SQLException; +import java.util.UUID; + +import static org.junit.Assert.*; + +public class PlayerStorageTest extends BasePluginDbTest { + + @Test + public void shouldCreateConsole() { + PlayerData data = plugin.getPlayerStorage().getConsole(); + + assertEquals("Console", data.getName()); + assertEquals(plugin.getConsoleConfig().getUuid(), data.getUUID()); + } + + @Test + public void shouldUpsertPlayerData() throws SQLException { + PlayerStorage playerStorage = plugin.getPlayerStorage(); + + UUID uuid = UUID.randomUUID(); + + PlayerData data = new PlayerData(uuid, "Name 1"); + Dao.CreateOrUpdateStatus status = playerStorage.upsert(data); + assertTrue(status.isCreated()); + assertFalse(status.isUpdated()); + assertNotNull(playerStorage.getAutoCompleteTree().getValueForExactKey("Name 1")); + + data = new PlayerData(uuid, "Name 2"); + status = playerStorage.upsert(data); + assertFalse(status.isCreated()); + assertTrue(status.isUpdated()); + assertNull(playerStorage.getAutoCompleteTree().getValueForExactKey("Name 1")); + assertNotNull(playerStorage.getAutoCompleteTree().getValueForExactKey("Name 2")); + } + + @Test + public void shouldRetrievePlayerData() throws SQLException { + PlayerStorage playerStorage = plugin.getPlayerStorage(); + + UUID uuid = UUID.randomUUID(); + + PlayerData data = new PlayerData(uuid, "PlaYer 1"); + Dao.CreateOrUpdateStatus status = playerStorage.upsert(data); + assertTrue(status.isCreated()); + assertFalse(status.isUpdated()); + + data = playerStorage.retrieve("player 1", false); + + assertEquals(data.getUUID(), uuid); + assertEquals(data.getName(), "PlaYer 1"); + } +} diff --git a/common/src/test/java/me/confuser/banmanager/common/util/DateUtilsTest.java b/common/src/test/java/me/confuser/banmanager/common/util/DateUtilsTest.java new file mode 100755 index 000000000..3ef5b2cd6 --- /dev/null +++ b/common/src/test/java/me/confuser/banmanager/common/util/DateUtilsTest.java @@ -0,0 +1,19 @@ +package me.confuser.banmanager.common.util; + +import org.junit.Test; + +import java.time.ZoneOffset; + +import static org.junit.Assert.assertEquals; + +public class DateUtilsTest { + + @Test + public void shouldFormatTimestamp() { + long timestamp = 1583321267L; + + assertEquals("04-03-2020 11:27:47", DateUtils.format("dd-MM-yyyy HH:mm:ss", timestamp, ZoneOffset.UTC)); + assertEquals("2020-03-04 11:27:47 +0000", DateUtils.format("yyyy-MM-dd HH:mm:ss Z", timestamp, ZoneOffset.UTC)); + assertEquals("2020-03-04_11-27-47", DateUtils.format("yyyy-MM-dd_HH-mm-ss", timestamp, ZoneOffset.UTC)); + } +} diff --git a/common/src/test/java/me/confuser/banmanager/common/util/IPUtilsTest.java b/common/src/test/java/me/confuser/banmanager/common/util/IPUtilsTest.java new file mode 100644 index 000000000..c8f0e0f4e --- /dev/null +++ b/common/src/test/java/me/confuser/banmanager/common/util/IPUtilsTest.java @@ -0,0 +1,71 @@ +package me.confuser.banmanager.common.util; + +import com.github.javafaker.Faker; +import me.confuser.banmanager.common.ipaddr.AddressStringException; +import me.confuser.banmanager.common.ipaddr.IPAddress; +import me.confuser.banmanager.common.ipaddr.IPAddressString; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +public class IPUtilsTest { + private Faker faker = new Faker(); + + @Test + public void stringToBytes() { + } + + @Test + public void bytesToString() { + + } + + @Test + public void isInRange() throws AddressStringException { + IPAddress from = IPUtils.toIPAddress("83.60.20.102"); + IPAddress to = IPUtils.toIPAddress("83.100.100.160"); + + assertTrue(IPUtils.isInRange(from, to, IPUtils.toIPAddress("83.61.21.100"))); + + IPAddress ipv4 = new IPAddressString(faker.internet().ipV4Cidr()).toAddress(); + IPAddress ipv6 = new IPAddressString(faker.internet().ipV6Cidr()).toAddress(); + + assertTrue(IPUtils.isInRange(ipv4.getLower(), ipv4.getUpper(), ipv4.getIterable().iterator().next())); + assertTrue(IPUtils.isInRange(ipv6.getLower(), ipv6.getUpper(), ipv6.getIterable().iterator().next())); + } + + @Test + public void inetToIPAddress() { + + } + + @Test + public void bytesToIPAddress() { + + } + + @Test + public void stringToIPAddress() { + assertEquals("127.0.0.1", IPUtils.toIPAddress("127.0.0.1").toString()); + assertEquals("::1", IPUtils.toIPAddress("::1").toString()); + + String ipv4 = faker.internet().ipV4Address(); + String ipv6 = faker.internet().ipV6Address().replaceAll("0", ""); + + assertEquals(ipv4, IPUtils.toIPAddress(ipv4).toString()); + assertEquals(ipv6, IPUtils.toIPAddress(ipv6).toString()); + } + + @Test + public void isValid() { + assertTrue(IPUtils.isValid("127.0.0.1")); + assertTrue(IPUtils.isValid("::1")); + + String ipv4 = faker.internet().ipV4Address(); + String ipv6 = faker.internet().ipV6Address().replaceAll("0", ""); + + assertTrue(IPUtils.isValid(ipv4)); + assertTrue(IPUtils.isValid(ipv6)); + } +} diff --git a/common/src/test/java/me/confuser/banmanager/common/util/StringUtilsTest.java b/common/src/test/java/me/confuser/banmanager/common/util/StringUtilsTest.java new file mode 100755 index 000000000..f502f3330 --- /dev/null +++ b/common/src/test/java/me/confuser/banmanager/common/util/StringUtilsTest.java @@ -0,0 +1,99 @@ +package me.confuser.banmanager.common.util; + +import org.junit.Test; + +import static org.junit.Assert.*; + +// From apache commons lang3 +public class StringUtilsTest { + private static final String[] MIXED_STRING_LIST = new String[]{null, "", "foo"}; + private static final Object[] MIXED_TYPE_OBJECT_LIST = new Object[]{"foo", 2L}; + + @Test + public void shouldJoinAtIndex() { + assertEquals("/", StringUtils.join(MIXED_STRING_LIST, "/", 0, MIXED_STRING_LIST.length - 1)); + assertEquals("", StringUtils.join(MIXED_STRING_LIST, "", 0, MIXED_STRING_LIST.length - 1)); + assertEquals("foo", StringUtils.join(MIXED_TYPE_OBJECT_LIST, "/", 0, 1)); + assertEquals("foo/2", StringUtils.join(MIXED_TYPE_OBJECT_LIST, "/", 0, 2)); + assertEquals("2", StringUtils.join(MIXED_TYPE_OBJECT_LIST, "/", 1, 2)); + assertEquals("", StringUtils.join(MIXED_TYPE_OBJECT_LIST, "/", 2, 1)); + assertNull(null, StringUtils.join(null, "/", 0, 1)); + } + + @Test + public void shouldFindSubstrings() { + String[] results = StringUtils.substringsBetween("[one], [two], [three]", "[", "]"); + assertEquals(3, results.length); + assertEquals("one", results[0]); + assertEquals("two", results[1]); + assertEquals("three", results[2]); + + results = StringUtils.substringsBetween("[one], [two], three", "[", "]"); + assertEquals(2, results.length); + assertEquals("one", results[0]); + assertEquals("two", results[1]); + + results = StringUtils.substringsBetween("[one], [two], three]", "[", "]"); + assertEquals(2, results.length); + assertEquals("one", results[0]); + assertEquals("two", results[1]); + + results = StringUtils.substringsBetween("[one], two], three]", "[", "]"); + assertEquals(1, results.length); + assertEquals("one", results[0]); + + results = StringUtils.substringsBetween("one], two], [three]", "[", "]"); + assertEquals(1, results.length); + assertEquals("three", results[0]); + + // 'ab hello ba' will match, but 'ab non ba' won't + // this is because the 'a' is shared between the two and can't be matched twice + results = StringUtils.substringsBetween("aabhellobabnonba", "ab", "ba"); + assertEquals(1, results.length); + assertEquals("hello", results[0]); + + results = StringUtils.substringsBetween("one, two, three", "[", "]"); + assertNull(results); + + results = StringUtils.substringsBetween("[one, two, three", "[", "]"); + assertNull(results); + + results = StringUtils.substringsBetween("one, two, three]", "[", "]"); + assertNull(results); + + results = StringUtils.substringsBetween("[one], [two], [three]", "[", null); + assertNull(results); + + results = StringUtils.substringsBetween("[one], [two], [three]", null, "]"); + assertNull(results); + + results = StringUtils.substringsBetween("[one], [two], [three]", "", ""); + assertNull(results); + + results = StringUtils.substringsBetween(null, "[", "]"); + assertNull(results); + + results = StringUtils.substringsBetween("", "[", "]"); + assertEquals(0, results.length); + } + + @Test + public void shouldValidatePlayerNames() { + assertTrue(StringUtils.isValidPlayerName("confuser", "")); + assertTrue(StringUtils.isValidPlayerName("confuser", null)); + assertTrue(StringUtils.isValidPlayerName("9081", "")); + assertTrue(StringUtils.isValidPlayerName("AaA1_23456789_0a", "")); + assertTrue(StringUtils.isValidPlayerName(".confuser", ".")); + assertTrue(StringUtils.isValidPlayerName("+confuser", "+")); + assertTrue(StringUtils.isValidPlayerName("-confuser", "-")); + assertTrue(StringUtils.isValidPlayerName("!confuser", "!")); + assertTrue(StringUtils.isValidPlayerName("*confuser", "*")); + assertTrue(StringUtils.isValidPlayerName("+-!*.confuser", "+!-*.")); + + assertFalse(StringUtils.isValidPlayerName("AaA1_23456789_0aaaa", "")); + assertFalse(StringUtils.isValidPlayerName("confu$£r", "")); + assertFalse(StringUtils.isValidPlayerName("127.0.0.1", "")); + assertFalse(StringUtils.isValidPlayerName("-confuser", "")); + assertFalse(StringUtils.isValidPlayerName("+-!*.confuser", ".")); + } +} diff --git a/common/src/test/java/me/confuser/banmanager/common/util/parsers/InfoCommandParserTest.java b/common/src/test/java/me/confuser/banmanager/common/util/parsers/InfoCommandParserTest.java new file mode 100644 index 000000000..f6f39c4a6 --- /dev/null +++ b/common/src/test/java/me/confuser/banmanager/common/util/parsers/InfoCommandParserTest.java @@ -0,0 +1,89 @@ +package me.confuser.banmanager.common.util.parsers; + +import me.confuser.banmanager.common.BasePluginTest; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class InfoCommandParserTest extends BasePluginTest { + + @Test + public void parsesKicksFlag() { + String[] args = new String[] { "confuser", "-k" }; + InfoCommandParser parser = new InfoCommandParser(this.plugin, args, 1); + + assert (parser.isKicks()); + assertEquals("confuser", parser.getArgs()[0]); + assertEquals(1, parser.getArgs().length); + } + + @Test + public void parsesWarningsFlag() { + String[] args = new String[] { "confuser", "-w" }; + InfoCommandParser parser = new InfoCommandParser(this.plugin, args, 1); + + assert (parser.isWarnings()); + assertEquals("confuser", parser.getArgs()[0]); + assertEquals(1, parser.getArgs().length); + } + + @Test + public void parsesBansFlag() { + String[] args = new String[] { "confuser", "-b" }; + InfoCommandParser parser = new InfoCommandParser(this.plugin, args, 1); + + assert (parser.isBans()); + assertEquals("confuser", parser.getArgs()[0]); + assertEquals(1, parser.getArgs().length); + } + + @Test + public void parsesMutesFlag() { + String[] args = new String[] { "confuser", "-m" }; + InfoCommandParser parser = new InfoCommandParser(this.plugin, args, 1); + + assert (parser.isMutes()); + assertEquals("confuser", parser.getArgs()[0]); + assertEquals(1, parser.getArgs().length); + } + + @Test + public void parsesNotesFlag() { + String[] args = new String[] { "confuser", "-n" }; + InfoCommandParser parser = new InfoCommandParser(this.plugin, args, 1); + + assert (parser.isNotes()); + assertEquals("confuser", parser.getArgs()[0]); + assertEquals(1, parser.getArgs().length); + } + + @Test + public void parsesTimeFlag() { + String[] args = new String[] { "confuser", "-t", "5d" }; + InfoCommandParser parser = new InfoCommandParser(this.plugin, args, 1); + + assertEquals("confuser", parser.getArgs()[0]); + assertEquals("5d", parser.getTime()); + assertEquals(1, parser.getArgs().length); + } + + @Test + public void parsesIpsFlag() { + String[] args = new String[] { "confuser", "-i", "5" }; + InfoCommandParser parser = new InfoCommandParser(this.plugin, args, 1); + + assertEquals("confuser", parser.getArgs()[0]); + assertEquals(5, parser.getIps(), 0); + assertEquals(1, parser.getArgs().length); + } + + @Test + public void parsesReportsFlag() { + String[] args = new String[] { "confuser", "-r" }; + InfoCommandParser parser = new InfoCommandParser(this.plugin, args, 1); + + assert (parser.isReports()); + assertEquals("confuser", parser.getArgs()[0]); + assertEquals(1, parser.getArgs().length); + } +} diff --git a/common/src/test/java/me/confuser/banmanager/common/util/parsers/UnbanCommandParserTest.java b/common/src/test/java/me/confuser/banmanager/common/util/parsers/UnbanCommandParserTest.java new file mode 100644 index 000000000..c36f4f512 --- /dev/null +++ b/common/src/test/java/me/confuser/banmanager/common/util/parsers/UnbanCommandParserTest.java @@ -0,0 +1,38 @@ +package me.confuser.banmanager.common.util.parsers; + +import me.confuser.banmanager.common.BasePluginTest; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class UnbanCommandParserTest extends BasePluginTest { + + @Test + public void parsesDeleteFlag() { + String[] args = new String[] { "confuser", "-d" }; + UnbanCommandParser parser = new UnbanCommandParser(this.plugin, args, 0); + + assert (parser.isDelete()); + assertEquals("confuser", parser.getArgs()[0]); + assertEquals(1, parser.getArgs().length); + } + + @Test + public void parsesDeleteFlagWithReason() { + String[] args = new String[] { "confuser", "-d", "Testing", "Hello" }; + UnbanCommandParser parser = new UnbanCommandParser(this.plugin, args, 1); + + assert (parser.isDelete()); + assertEquals("confuser", parser.getArgs()[0]); + assertEquals("Testing Hello", parser.getReason().getMessage()); + } + + @Test + public void handlesNoReason() { + String[] args = new String[] { "confuser" }; + UnbanCommandParser parser = new UnbanCommandParser(this.plugin, args, 0); + + assertEquals(false, parser.isDelete()); + assertEquals("confuser", parser.getArgs()[0]); + } +} diff --git a/common/src/test/java/me/confuser/banmanager/common/util/parsers/WarnCommandParserTest.java b/common/src/test/java/me/confuser/banmanager/common/util/parsers/WarnCommandParserTest.java new file mode 100644 index 000000000..e0b64c722 --- /dev/null +++ b/common/src/test/java/me/confuser/banmanager/common/util/parsers/WarnCommandParserTest.java @@ -0,0 +1,39 @@ +package me.confuser.banmanager.common.util.parsers; + +import me.confuser.banmanager.common.BasePluginTest; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class WarnCommandParserTest extends BasePluginTest { + + @Test + public void defaultsPointsFlag() { + String[] args = new String[] { "confuser", "test" }; + WarnCommandParser parser = new WarnCommandParser(this.plugin, args, 1); + + assertEquals("confuser", parser.getArgs()[0]); + assertEquals(1.0, parser.getPoints(), 0.0); + assertEquals(2, parser.getArgs().length); + } + + @Test + public void parsesPointsFlag() { + String[] args = new String[] { "confuser", "-p 5" }; + WarnCommandParser parser = new WarnCommandParser(this.plugin, args, 1); + + assertEquals("confuser", parser.getArgs()[0]); + assertEquals(5.0, parser.getPoints(), 0.0); + assertEquals(1, parser.getArgs().length); + } + + @Test + public void parsesPointsFlagWithReason() { + String[] args = new String[] { "confuser", "-p 5", "Testing", "Hello" }; + WarnCommandParser parser = new WarnCommandParser(this.plugin, args, 1); + + assertEquals("confuser", parser.getArgs()[0]); + assertEquals(5.0, parser.getPoints(), 0.0); + assertEquals("Testing Hello", parser.getReason().getMessage()); + } +} diff --git a/common/src/test/resources/plugin.yml b/common/src/test/resources/plugin.yml new file mode 100644 index 000000000..185bef823 --- /dev/null +++ b/common/src/test/resources/plugin.yml @@ -0,0 +1,732 @@ +main: "${mainPath}" +name: BanManager +version: "${internalVersion}" +author: confuser +website: https://banmanagement.com +description: "A database driven punishment system" +softdepend: + - PlaceholderAPI + +# Mark the plugin as 1.13 compatible to avoid CB having to perform quite as much unnecessary +# remapping when the plugin is loaded. Note that despite what this setting might otherwise imply, +# BM is still compatible with pre-1.13 releases. +api-version: 1.13 + +commands: + ban: + description: "ban a player" + usage: "/ban " + aliases: [bmban] + permission: bm.command.ban + banall: + description: "ban a player across multiple servers" + usage: "/banall " + aliases: [bmbanall] + permission: bm.command.banall + tempban: + description: "tempban a player" + usage: "/tempban " + aliases: [bmtempban] + permission: bm.command.tempban + tempbanall: + description: "tempban a player across multiple servers" + usage: "/tempbanall " + aliases: [bmtempbanall] + permission: bm.command.tempbanall + unban: + description: "unban a player" + usage: "/unban [reason]" + aliases: [bmunban, pardon] + permission: bm.command.unban + unbanall: + description: "unban a player across multiple servers" + usage: "/unbanall [reason]" + aliases: [bmunbanall] + permission: bm.command.unbanall + bminfo: + description: "see information on a player" + usage: "/bminfo [index]" + aliases: [bmbminfo] + permission: bm.command.bminfo + banip: + description: "ban an ip" + usage: "/banip " + aliases: [bmbanip] + permission: bm.command.banip + banipall: + description: "ban an ip across multiple servers" + usage: "/banipall " + aliases: [bmbanipall] + permission: bm.command.banipall + tempbanip: + description: "tempban an ip" + usage: "/tempbanip " + aliases: [bmtempbanip] + permission: bm.command.tempbanip + tempbanipall: + description: "tempban an ip across multiple servers" + usage: "/tempbanipall " + aliases: [bmtempbanipall] + permission: bm.command.tempbanipall + unbanip: + description: "unban's an ip" + usage: "/unbanip [reason]" + aliases: [bmunbanip, pardonip] + permission: bm.command.unbanip + unbanipall: + description: "unban's an ip across multiple servers" + usage: "/unbanipall [reason]" + aliases: [bmunbanipall] + permission: bm.command.unbanipall + bmimport: + description: "imports bans" + usage: "/bmimport " + aliases: [bmbanimport, banimport] + permission: bm.command.import + kick: + description: "kick a player" + usage: "/kick " + aliases: [bmkick] + permission: bm.command.kick + kickall: + description: "kick all players on the current server" + usage: "/kickall " + aliases: [bmkickall] + permission: bm.command.kickall + mute: + description: "mutes a player" + usage: "/mute " + aliases: [bmmute] + permission: bm.command.mute + muteip: + description: "mutes an ip" + usage: "/muteip " + aliases: [bmmuteip] + permission: bm.command.muteip + muteall: + description: "mutes a player across multiple servers" + usage: "/muteall " + aliases: [bmmuteall] + permission: bm.command.muteall + tempmute: + description: "temp mutes a player" + usage: "/tempmute " + aliases: [bmtempmute] + permission: bm.command.tempmute + tempmuteip: + description: "temp mutes an ip" + usage: "/tempmute " + aliases: [bmtempmuteip] + permission: bm.command.tempmuteip + tempmuteall: + description: "temp mutes a player across multiple servers" + usage: "/tempmuteall " + aliases: [bmtempmuteall] + permission: bm.command.tempmuteall + unmute: + description: "unmute a player" + usage: "/unmute [reason]" + aliases: [bmunmute] + permission: bm.command.unmute + unmuteip: + description: "unmute an ip" + usage: "/unmuteip [reason]" + aliases: [bmunmuteip] + permission: bm.command.unmuteip + unmuteall: + description: "unmute a player across multiple servers" + usage: "/unmuteall [reason]" + aliases: [bmunmuteall] + permission: bm.command.unmuteall + nlkick: + description: "kick a player without logging" + usage: "/nlkick " + aliases: [bmnlkick] + permission: bm.command.nlkick + nlkickall: + description: "kick all players on the current server without logging" + usage: "/nlkickall " + aliases: [bmnlkickall] + permission: bm.command.nlkickall + bmreload: + description: "Reloads from the config everything except database connection info" + usage: "/bmreload" + permission: bm.command.reload + warn: + description: "Warn a player" + usage: "/warn " + aliases: [bmwarn] + permission: bm.command.warn + tempwarn: + description: "Temporarily warn a player" + usage: "/tempwarn " + aliases: [bmtempwarn] + permission: bm.command.tempwarn + alts: + description: "Find alts" + usage: "/alts " + aliases: [bmalts] + permission: bm.command.alts + bmclear: + description: "Clear a player's records" + usage: "/bmclear [type]" + permission: bm.command.clear + dwarn: + description: "Delete a player's last warning" + usage: "/dwarn " + aliases: [bmdwarn] + permission: bm.command.dwarn + bmsync: + description: "Forces synchronisation from database" + usage: "/bmsync " + permission: bm.command.sync + addnote: + description: "Attach a private note to a player" + usage: "/addnote " + permission: bm.command.addnote + addnoteall: + description: "Add a note for a player across multiple servers" + usage: "/addnoteall " + aliases: [bmaddnotell] + permission: bm.command.addnoteall + notes: + description: "View private notes attached to a player" + usage: "/notes " + permission: bm.command.notes + bmexport: + description: "Export bans to vanilla format" + usage: "/bmexport " + permission: bm.command.export + banlist: + description: "View all players banned from this server" + usage: "/banlist [players || ipranges || ips]" + permission: bm.command.banlist + baniprange: + description: "Ban an entire ip range" + usage: "/baniprange " + permission: bm.command.baniprange + tempbaniprange: + description: "Temporarily ban an entire ip range" + usage: "/tempbaniprange " + permission: bm.command.tempbaniprange + unbaniprange: + description: "Unban an entire ip range" + usage: "/unbaniprange [reason]" + permission: bm.command.unbaniprange + bmactivity: + description: "View recent activity" + usage: "/bmactivity [player]" + permission: bm.command.bmactivity + bmdelete: + description: "Delete records" + usage: "/bmdelete " + permission: bm.command.delete + report: + description: "report a player" + usage: "/report " + aliases: [bmreport] + permission: bm.command.report + reports: + description: "report management" + usage: "/reports " + aliases: [bmreports] + permission: bm.command.reports + reasons: + description: List all available predefined reasons + usage: "/reasons" + alias: [bmreasons] + permission: bm.command.reasons + bmrollback: + description: Rollback malicious actions + usage: "/bmrollback [types]" + permission: bm.command.bmrollback + banname: + description: "Ban a player by name" + usage: "/banname " + alias: [bmbanname] + permission: bm.command.banname + tempbanname: + description: "Temporarily ban a player by name" + usage: "/tempbanname " + alias: [bmtempbanname] + permission: bm.command.tempbanname + unbanname: + description: "Unban a name" + usage: "/unbanname [reason]" + alias: [bmunbanname] + permission: bm.command.unbanname + bmutils: + description: "BanManager utility commands" + usage: "/bmutils help" + permission: bm.command.bmutils +permissions: + bm.command.*: + description: Gives access to all BanManager commands + children: + bm.command.alts: true + bm.command.ban: true + bm.command.ban.offline: true + bm.command.ban.override: true + bm.command.unban: true + bm.command.tempban: true + bm.command.tempban.offline: true + bm.command.tempban.override: true + bm.command.exempt: true + bm.command.bminfo: true + bm.command.bminfo.others: true + bm.command.bminfo.playerstats: true + bm.command.bminfo.connection: true + bm.command.bminfo.geoip: true + bm.command.bminfo.ipstats: true + bm.command.bminfo.alts: true + bm.command.bminfo.website: true + bm.command.bminfo.history.bans: true + bm.command.bminfo.history.ipbans: true + bm.command.bminfo.history.mutes: true + bm.command.bminfo.history.ipmutes: true + bm.command.bminfo.history.kicks: true + bm.command.bminfo.history.ips: true + bm.command.bminfo.history.warnings: true + bm.command.bminfo.history.notes: true + bm.command.banip: true + bm.command.banip.override: true + bm.command.baniprange: true + bm.command.tempbaniprange: true + bm.command.unbaniprange: true + bm.command.tempbanip: true + bm.command.tempbanip.override: true + bm.command.unbanip: true + bm.command.import: true + bm.command.kick: true + bm.command.kickall: true + bm.command.nlkick: true + bm.command.nlkickall: true + bm.command.update: true + bm.command.mute: true + bm.command.mute.offline: true + bm.command.mute.override: true + bm.command.tempmute: true + bm.command.tempmute.offline: true + bm.command.tempmute.override: true + bm.command.unmute: true + bm.command.warn: true + bm.command.tempwarn: true + bm.command.dwarn: true + bm.command.clear: true + bm.command.sync: true + bm.command.addnote: true + bm.command.notes: true + bm.command.export: true + bm.command.banlist: true + bm.command.banlist.players: true + bm.command.banlist.ips: true + bm.command.banlist.ipranges: true + bm.command.bmactivity: true + bm.command.delete: true + bm.command.report: true + bm.command.report.offline: true + bm.command.report.override: true + bm.command.reasons: true + bm.command.bmrollback: true + bm.command.banname: true + bm.command.tempbanname: true + bm.command.unbanname: true + bm.command.bmutils: true + bm.command.bmutils.missingplayers: true + bm.command.bmutils.duplicates: true + bm.*: + description: Gives access to all BanManager commands + children: + bm.command.ban: true + bm.command.ban.offline: true + bm.command.ban.override: true + bm.command.unban: true + bm.command.tempban: true + bm.command.tempban.offline: true + bm.command.tempban.override: true + bm.command.exempt: true + bm.command.bminfo: true + bm.command.bminfo.others: true + bm.command.bminfo.playerstats: true + bm.command.bminfo.connection: true + bm.command.bminfo.geoip: true + bm.command.bminfo.ipstats: true + bm.command.bminfo.alts: true + bm.command.bminfo.website: true + bm.command.bminfo.history.bans: true + bm.command.bminfo.history.ipbans: true + bm.command.bminfo.history.mutes: true + bm.command.bminfo.history.ipmutes: true + bm.command.bminfo.history.kicks: true + bm.command.bminfo.history.ips: true + bm.command.bminfo.history.warnings: true + bm.command.bminfo.history.notes: true + bm.command.banip: true + bm.command.banip.override: true + bm.command.baniprange: true + bm.command.tempbaniprange: true + bm.command.unbaniprange: true + bm.command.tempbanip: true + bm.command.tempbanip.override: true + bm.command.unbanip: true + bm.command.import: true + bm.command.kick: true + bm.command.kickall: true + bm.command.nlkick: true + bm.command.nlkickall: true + bm.command.update: true + bm.command.mute: true + bm.command.mute.offline: true + bm.command.mute.override: true + bm.command.tempmute: true + bm.command.tempmute.offline: true + bm.command.tempmute.override: true + bm.command.unmute: true + bm.command.warn: true + bm.command.tempwarn: true + bm.command.dwarn: true + bm.command.clear: true + bm.command.sync: true + bm.command.addnote: true + bm.command.notes: true + bm.command.export: true + bm.command.banlist: true + bm.command.banlist.players: true + bm.command.banlist.ips: true + bm.command.banlist.ipranges: true + bm.command.bmactivity: true + bm.command.delete: true + bm.command.report: true + bm.command.report.offline: true + bm.command.report.override: true + bm.command.reports.assign: true + bm.command.reports.close: true + bm.command.reports.list: true + bm.command.reports.teleport: true + bm.command.reports.unassign: true + bm.command.reasons: true + bm.command.bmrollback: true + bm.command.banname: true + bm.command.tempbanname: true + bm.command.unbanname: true + bm.command.bmutils: true + bm.command.bmutils.missingplayers: true + bm.command.bmutils.duplicates: true + bm.notify.*: + description: Players with this permission will be notified of bans + default: op + children: + bm.notify.ban: true + bm.notify.ipban: true + bm.notify.kick: true + bm.notify.mute: true + bm.notify.tempban: true + bm.notify.tempipban: true + bm.notify.tempmute: true + bm.notify.unban: true + bm.notify.unipban: true + bm.notify.unmute: true + bm.notify.warn: true + bm.notify.duplicateips: true + bm.notify.update: true + bm.notify.denied.player: true + bm.notify.denied.ip: true + bm.notify.baniprange: true + bm.notify.tempbaniprange: true + bm.notify.unbaniprange: true + bm.notify.report: true + bm.notify.muted: true + bm.notify.mutedip: true + bm.notify.reports.open: true + bm.notify.reports.assigned: true + bm.notify.banname: true + bm.notify.tempbanname: true + bm.notify.unbanname: true + bm.exempt.*: + description: Players with this permission cannot be banned, kicked or muted + default: op + children: + bm.exempt.alts: true + bm.exempt.ban: true + bm.exempt.banip: true + bm.exempt.kick: true + bm.exempt.maxonlineperip: true + bm.exempt.maxmultiaccountsrecently: true + bm.exempt.mute: true + bm.exempt.tempban: true + bm.exempt.tempipban: true + bm.exempt.tempmute: true + bm.exempt.warn: true + bm.exempt.report: true + bm.command.bminfo.*: + description: Gives access to all BanManager information + children: + bm.command.bminfo.others: true + bm.command.bminfo.playerstats: true + bm.command.bminfo.connection: true + bm.command.bminfo.ipstats: true + bm.command.bminfo.alts: true + bm.command.bminfo.website: true + bm.command.bminfo.history.bans: true + bm.command.bminfo.history.ipbans: true + bm.command.bminfo.history.mutes: true + bm.command.bminfo.history.ipmutes: true + bm.command.bminfo.history.kicks: true + bm.command.bminfo.history.ips: true + bm.command.bminfo.history.warnings: true + bm.command.bminfo.history.notes: true + bm.command.unban: + description: Allows you to unban a player + default: op + bm.command.ban: + description: Allows you to ban a player + default: op + bm.command.ban.offline: + description: Allows you to ban an offline player + default: op + bm.command.ban.override: + description: Allows you to ovveride a ban + default: op + bm.command.tempban: + description: Allows you to tempban a player + default: op + bm.command.tempban.offline: + description: Allows you to tempban an offline player + default: op + bm.command.tempban.override: + description: Allows you to ovveride a temp ban + default: op + bm.command.bminfo: + description: Allows you to see information on players + default: op + bm.command.bminfo.others: + description: Allows you to see other players information + default: op + bm.command.bminfo.playerstats: + description: Allows you to see player statistics + default: op + bm.command.bminfo.ipstats: + description: Allows you to see ip statistics + default: op + bm.command.bminfo.connection: + description: Allows you to see connection information + default: op + bm.command.bminfo.geoip: + description: Allows you to see city and country information + default: op + bm.command.bminfo.alts: + description: Allows you to see possible alts + default: op + bm.command.bminfo.website: + description: Allows you to see a website link + default: op + bm.command.bminfo.history.bans: + description: Allows you to see ban records + default: op + bm.command.bminfo.history.ipbans: + description: Allows you to see ip ban records + default: op + bm.command.bminfo.history.ipmutes: + description: Allows you to see ip mute records + default: op + bm.command.bminfo.history.mutes: + description: Allows you to see mute reocrds + default: op + bm.command.bminfo.history.kicks: + description: Allows you to see kicks + default: op + bm.command.bminfo.history.ips: + description: Allows you to see player join leave history + default: op + bm.command.bminfo.history.warnings: + description: Allows you to see warnings + default: op + bm.command.bminfo.history.notes: + description: Allows you to see notes + default: op + bm.command.banip: + description: Allows you to ban an ip + default: op + bm.command.banip.override: + description: Allows you to ovveride a ban + default: op + bm.command.tempbanip: + description: Allows you to temban an ip + default: op + bm.command.tempbanip.override: + description: Allows you to ovveride a ban + default: op + bm.command.unbanip: + description: Allows you to unban an ip + default: op + bm.command.baniprange: + description: Allows you to ban an ip range + default: op + bm.command.tempbaniprange: + description: Allows you to temporarily ban an ip range + default: op + bm.command.unbaniprange: + description: Allows you to unban an ip range + default: op + bm.command.import: + description: Allows importing of banned players and ips from Bukkit + default: op + bm.command.kick: + description: Allows a player to kick another player + default: op + bm.command.kickall: + description: Allows a player to kick all players on the server + default: op + bm.command.nlkick: + description: Allows a player to kick another player without logging + default: op + bm.command.nlkickall: + description: Allows a player to kick all players on the server without logging + default: op + bm.command.update: + description: Notifies player of a plugin update + default: op + bm.command.mute: + description: Allows you to mute a player + default: op + bm.command.mute.offline: + description: Allows you to mute an offline player + default: op + bm.command.mute.override: + description: Allows you to ovveride a mute + default: op + bm.command.tempmute: + description: Allows you to temp mute a player + default: op + bm.command.tempmute.offline: + description: Allows you to temp mute an offline player + default: op + bm.command.tempmute.override: + description: Allows you to ovveride a mute + default: op + bm.command.unmute: + description: Allows you to unmute a player + default: op + bm.command.warn: + description: Allows you to warn a player + default: op + bm.command.tempwarn: + description: Allows you to temporarily warn a player + default: op + bm.command.clear: + description: Allows you to clear a player's records + default: op + bm.command.clear.banrecords: + description: Allows you to clear a player's ban records + default: op + bm.command.clear.baniprecords: + description: Allows you to clear a player's ip ban records + default: op + bm.command.clear.kicks: + description: Allows you to clear a player's kick records + default: op + bm.command.clear.muterecords: + description: Allows you to clear a player's mute records + default: op + bm.command.clear.notes: + description: Allows you to clear a player's notes + default: op + bm.command.clear.reports: + description: Allows you to clear a player's reports + default: op + bm.command.clear.warnings: + description: Allows you to clear a player's warnings + default: op + bm.command.sync: + description: Allows you to force synchronisation with the database + default: op + bm.command.addnote: + description: Allows you to attach a private note to a player + default: op + bm.command.notes: + description: Allows you to view private notes attached to a player + default: op + bm.command.export: + description: Allows you to export bans to a vanilla compatible file + default: op + bm.command.banlist: + description: Allows you to view currently banned players or ip addresses + default: op + bm.command.banlist.players: + description: Allows you to view currently banned players + default: op + bm.command.banlist.ips: + description: Allows you to view currently banned ip addresses + default: op + bm.command.banlist.ipranges: + description: Allows you to view currently banned ip ranges + default: op + bm.command.bmactivity: + description: Allows you to view recent activity + default: op + bm.command.report: + description: Allows you to report a player + default: op + bm.command.reports.assign: + description: Allows you to assign a report to a player + default: op + bm.command.reports.close: + description: Allows you to close a report + default: op + bm.command.reports.list: + description: Allows you to list reports + default: op + bm.command.reports.tp: + description: Allows you to teleport to the location of the actor who created the report + default: op + bm.command.reports.unassign: + description: Allows you to unassign a report + default: op + bm.command.delete: + description: Allows you to delete records by id + default: op + bm.command.delete.banrecords: + description: Allows you to delete a player's ban records by id + default: op + bm.command.delete.baniprecords: + description: Allows you to delete a player's ban records by id + default: op + bm.command.delete.kicks: + description: Allows you to delete a player's kick records by id + default: op + bm.command.delete.muterecords: + description: Allows you to delete a player's mute records by id + default: op + bm.command.delete.notes: + description: Allows you to delete a player's notes by id + default: op + bm.command.delete.reports: + description: Allows you to clear a player's reports by id + default: op + bm.command.delete.warnings: + description: Allows you to clear a player's warnings by id + default: op + bm.command.reasons: + description: Allows you to list all available predefined reasons + default: op + bm.command.bmrollback: + description: Allows you to rollback player actions + default: op + bm.command.banname: + description: Allows you to ban a player by name + default: op + bm.command.tempbanname: + description: Allows you to temporarily ban a player by name + default: op + bm.command.unbanname: + description: Allows unbanning a name + default: op + bm.command.bmutils: + description: Allows using bmutils base command + default: op + bm.command.bmutils.missingplayers: + description: Allows resolving missing players + default: op + bm.command.bmutils.duplicates: + description: Allows resolving duplicate player names + default: op diff --git a/fabric/build.gradle.kts b/fabric/build.gradle.kts new file mode 100644 index 000000000..e5f65468a --- /dev/null +++ b/fabric/build.gradle.kts @@ -0,0 +1,141 @@ +import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar +import net.fabricmc.loom.task.RemapJarTask + +plugins { + `java-library` + `maven-publish` + `signing` + `fabric-loom` +} + +applyPlatformAndCoreConfiguration() +applyShadowConfiguration() + +publishing { + publications { + create("mavenJava") { + from(components["java"]) + + pom { + name.set("BanManagerFabric") + description.set("BanManager for Fabric") + url.set("https://github.com/BanManagement/BanManager/") + licenses { + license { + name.set("Creative Commons Attribution-NonCommercial-ShareAlike 2.0 UK: England & Wales") + url.set("https://github.com/BanManagement/BanManager/blob/master/LICENCE") + } + } + developers { + developer { + id.set("confuser") + name.set("James Mortemore") + email.set("jamesmortemore@gmail.com") + } + } + scm { + connection.set("scm:git:git://github.com/BanManagement/BanManager.git") + developerConnection.set("scm:git:ssh://git@github.com/BanManagement/BanManager.git") + url.set("https://github.com/BanManagement/BanManager/") + } + } + } + } +} + +signing { + if (project.findProperty("signingKey")?.toString()?.toBoolean() == true) { + useInMemoryPgpKeys(findProperty("signingKey")?.toString(), findProperty("signingPassword")?.toString()) + + sign(publishing.publications["mavenJava"]) + } +} + +repositories { + maven { + name = "Fabric" + url = uri("https://maven.fabricmc.net/") + } +} + +configurations { + compileClasspath.get().extendsFrom(create("shadeOnly")) +} + +dependencies { + minecraft("com.mojang:minecraft:1.21.4") + mappings("net.fabricmc:yarn:1.21.4+build.1:v2") + modImplementation("net.fabricmc:fabric-loader:0.16.9") + + val modules = listOf( + "fabric-api-base", + "fabric-command-api-v2", + "fabric-events-interaction-v0", + "fabric-lifecycle-events-v1", + "fabric-message-api-v1", + "fabric-networking-api-v1", + "fabric-entity-events-v1" + ) + + modules.forEach { + modImplementation(fabricApi.module(it, "0.111.0+1.21.4")) + } + + modImplementation("me.lucko:fabric-permissions-api:0.3.1") + + api(project(":BanManagerCommon")) +} + +tasks.named("processResources") { + val internalVersion = project.ext["internalVersion"] + + inputs.property("internalVersion", internalVersion) + + filesMatching(listOf("plugin.yml", "fabric.mod.json")) { + expand("internalVersion" to internalVersion, "mainPath" to "me.confuser.banmanager.fabric.BMFabricPlugin") + } +} + +tasks.named("jar") { + val projectVersion = project.version + inputs.property("projectVersion", projectVersion) + manifest { + attributes("Implementation-Version" to projectVersion) + } +} + +tasks.named("shadowJar") { + configurations = listOf(project.configurations["shadeOnly"], project.configurations["runtimeClasspath"]) + + archiveBaseName.set("BanManagerFabric") + archiveClassifier.set("") + archiveVersion.set("") + + dependencies { + include(dependency(":BanManagerCommon")) + include(dependency(":BanManagerLibs")) + } + exclude("GradleStart**") + exclude(".cache"); + exclude("LICENSE*") + exclude("META-INF/services/**") + exclude("META-INF/maven/**") + exclude("org/intellij/**") + exclude("org/jetbrains/**") + exclude("/mappings/*") + + minimize() +} + +tasks.named("remapJar") { + dependsOn(tasks.named("shadowJar")) + + inputFile.set(tasks.named("shadowJar").get().archiveFile) + archiveBaseName.set("BanManagerFabric") + archiveClassifier.set("") + archiveVersion.set("") +} + +tasks.named("assemble").configure { + dependsOn("shadowJar") +} diff --git a/fabric/src/main/java/me/confuser/banmanager/fabric/BMFabricPlugin.java b/fabric/src/main/java/me/confuser/banmanager/fabric/BMFabricPlugin.java new file mode 100644 index 000000000..6b83a4a06 --- /dev/null +++ b/fabric/src/main/java/me/confuser/banmanager/fabric/BMFabricPlugin.java @@ -0,0 +1,241 @@ +package me.confuser.banmanager.fabric; + +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.util.concurrent.TimeUnit; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import lombok.Getter; +import lombok.SneakyThrows; +import me.confuser.banmanager.fabric.listeners.*; +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.commands.CommonCommand; +import me.confuser.banmanager.common.configs.PluginInfo; +import me.confuser.banmanager.common.configuration.ConfigurationSection; +import me.confuser.banmanager.common.configuration.file.YamlConfiguration; +import me.confuser.banmanager.common.runnables.BanSync; +import me.confuser.banmanager.common.runnables.ExpiresSync; +import me.confuser.banmanager.common.runnables.GlobalBanSync; +import me.confuser.banmanager.common.runnables.GlobalIpSync; +import me.confuser.banmanager.common.runnables.GlobalMuteSync; +import me.confuser.banmanager.common.runnables.GlobalNoteSync; +import me.confuser.banmanager.common.runnables.IpRangeSync; +import me.confuser.banmanager.common.runnables.IpSync; +import me.confuser.banmanager.common.runnables.MuteSync; +import me.confuser.banmanager.common.runnables.NameSync; +import me.confuser.banmanager.common.runnables.Purge; +import me.confuser.banmanager.common.runnables.RollbackSync; +import me.confuser.banmanager.common.runnables.Runner; +import me.confuser.banmanager.common.runnables.SaveLastChecked; +import me.confuser.banmanager.common.runnables.WarningSync; +import net.fabricmc.api.DedicatedServerModInitializer; +import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; +import net.fabricmc.loader.api.FabricLoader; +import net.minecraft.server.MinecraftServer; + +public class BMFabricPlugin implements DedicatedServerModInitializer { + + @Getter + private BanManagerPlugin plugin; + private String[] configs = new String[] { + "config.yml", + "console.yml", + "discord.yml", + "exemptions.yml", + "geoip.yml", + "messages.yml", + "reasons.yml", + "schedules.yml" + }; + private FabricScheduler scheduler; + private PluginInfo pluginInfo; + private FabricServer server; + + @Override + public void onInitializeServer() { + try { + pluginInfo = setupConfigs(); + } catch (IOException e) { + e.printStackTrace(); + return; + } + + this.server = new FabricServer(); + this.scheduler = new FabricScheduler(); + + plugin = new BanManagerPlugin(pluginInfo, new PluginLogger(LogManager.getLogger("BanManager")), getDataFolder(), + scheduler, this.server, null); + + try { + plugin.enable(); + } catch (Exception e) { + this.scheduler.shutdown(); + + plugin.disable(); + e.printStackTrace(); + return; + } + + setupListeners(); + setupCommands(); + setupRunnables(); + + ServerLifecycleEvents.SERVER_STARTING.register(this::onServerStarting); + ServerLifecycleEvents.SERVER_STOPPING.register(this::onServerStopping); + ServerLifecycleEvents.SERVER_STARTED.register(this::onServerStarted); + } + + private void onServerStarting(MinecraftServer server) { + this.scheduler.enable(server); + this.server.enable(plugin, server); + } + + private void onServerStarted(MinecraftServer server) { + plugin.getLogger().info("The following commands are blocked whilst muted:"); + plugin.getConfig().handleBlockedCommands(plugin, plugin.getConfig().getMutedBlacklistCommands()); + + plugin.getLogger().info("The following commands are blocked whilst soft muted:"); + plugin.getConfig().handleBlockedCommands(plugin, plugin.getConfig().getSoftMutedBlacklistCommands()); + } + + private void onServerStopping(MinecraftServer server) { + this.scheduler.shutdown(); + + if (plugin != null) { + plugin.disable(); + } + } + + private void setupCommands() { + for (CommonCommand cmd : plugin.getCommands()) { + new FabricCommand(cmd).register(); + } + + if (plugin.getGlobalConn() != null) { + for (CommonCommand cmd : plugin.getGlobalCommands()) { + new FabricCommand(cmd).register(); + } + } + } + + private File getDataFolder() { + File dataDirectory = FabricLoader.getInstance().getConfigDir().resolve("banmanager").toFile(); + + if (!dataDirectory.exists()) { + dataDirectory.mkdir(); + } + + return dataDirectory; + } + + private PluginInfo setupConfigs() throws IOException { + for (String name : configs) { + File file = new File(getDataFolder(), name); + + if (!file.exists()) { + try (InputStream in = getResourceAsStream(name)) { + Files.copy(in, file.toPath()); + } catch (IOException e) { + e.printStackTrace(); + } + } else { + Reader defConfigStream = new InputStreamReader(getResourceAsStream(file.getName()), StandardCharsets.UTF_8); + + YamlConfiguration conf = YamlConfiguration.loadConfiguration(file); + YamlConfiguration defConfig = YamlConfiguration.loadConfiguration(defConfigStream); + conf.setDefaults(defConfig); + conf.options().copyDefaults(true); + conf.save(file); + } + } + + // Load plugin.yml + PluginInfo pluginInfo = new PluginInfo(); + Reader defConfigStream = new InputStreamReader(getResourceAsStream("plugin.yml"), StandardCharsets.UTF_8); + YamlConfiguration conf = YamlConfiguration.loadConfiguration(defConfigStream); + ConfigurationSection commands = conf.getConfigurationSection("commands"); + + for (String command : commands.getKeys(false)) { + ConfigurationSection cmd = commands.getConfigurationSection(command); + + pluginInfo.setCommand(new PluginInfo.CommandInfo(command, cmd.getString("permission"), cmd.getString("usage"), + cmd.getStringList("aliases"))); + } + + return pluginInfo; + } + + public void setupListeners() { + new JoinListener(plugin); + new LeaveListener(plugin); + new HookListener(plugin); + + if (!plugin.getConfig().getChatPriority().equals("NONE")) { + new ChatListener(plugin); + } + + if (plugin.getConfig().isDisplayNotificationsEnabled()) { + new BanListener(plugin); + new MuteListener(plugin); + new NoteListener(plugin); + new ReportListener(plugin, this.server); + } + + if (plugin.getDiscordConfig().isHooksEnabled()) { + new DiscordListener(plugin); + } + } + + public void setupRunnables() { + Runner syncRunner; + + if (plugin.getGlobalConn() == null) { + syncRunner = new Runner(new BanSync(plugin), new MuteSync(plugin), new IpSync(plugin), new IpRangeSync(plugin), + new ExpiresSync(plugin), + new WarningSync(plugin), new RollbackSync(plugin), new NameSync(plugin)); + } else { + syncRunner = new Runner(new BanSync(plugin), new MuteSync(plugin), new IpSync(plugin), new IpRangeSync(plugin), + new ExpiresSync(plugin), + new WarningSync(plugin), new RollbackSync(plugin), new NameSync(plugin), + new GlobalBanSync(plugin), new GlobalMuteSync(plugin), new GlobalIpSync(plugin), new GlobalNoteSync(plugin)); + } + + plugin.setSyncRunner(syncRunner); + + setupAsyncRunnable(1L, syncRunner); + + /* + * This task should be ran last with a 1L offset as it gets modified + * above. + */ + setupAsyncRunnable((plugin.getSchedulesConfig() + .getSchedule("saveLastChecked")) + 1L, new SaveLastChecked(plugin)); + + // Purge + plugin.getScheduler().runAsync(new Purge(plugin)); + } + + private void setupAsyncRunnable(long length, Runnable runnable) { + if (length <= 0) { + return; + } + + this.scheduler.runAsyncRepeating(runnable, length, length); + } + + @SneakyThrows + private InputStream getResourceAsStream(String resource) { + Class cls = getClass(); + + // returns the ClassLoader object associated with this Class + ClassLoader cLoader = cls.getClassLoader(); + + return cLoader.getResourceAsStream(resource); + } +} diff --git a/fabric/src/main/java/me/confuser/banmanager/fabric/BanManagerEvents.java b/fabric/src/main/java/me/confuser/banmanager/fabric/BanManagerEvents.java new file mode 100644 index 000000000..16df0bfeb --- /dev/null +++ b/fabric/src/main/java/me/confuser/banmanager/fabric/BanManagerEvents.java @@ -0,0 +1,369 @@ +package me.confuser.banmanager.fabric; + +import lombok.Getter; +import lombok.Setter; +import me.confuser.banmanager.common.data.*; +import me.confuser.banmanager.common.util.Message; +import net.fabricmc.fabric.api.event.Event; +import net.fabricmc.fabric.api.event.EventFactory; + +public class BanManagerEvents { + + public static final Event PLAYER_BAN_EVENT = EventFactory.createArrayBacked(PlayerBanEvent.class, + (listeners) -> (banData, silent) -> { + for (PlayerBanEvent listener : listeners) { + if (listener.onPlayerBan(banData, silent)) { + return true; + } + } + return false; + }); + + public static final Event PLAYER_BANNED_EVENT = EventFactory.createArrayBacked(PlayerBannedEvent.class, + (listeners) -> (banData, silent) -> { + for (PlayerBannedEvent listener : listeners) { + listener.onPlayerBanned(banData, silent); + } + }); + + public static final Event PLAYER_UNBAN_EVENT = EventFactory.createArrayBacked(PlayerUnbanEvent.class, + (listeners) -> (banData, actor, reason) -> { + for (PlayerUnbanEvent listener : listeners) { + listener.onPlayerUnban(banData, actor, reason); + } + }); + + public static final Event IP_BAN_EVENT = EventFactory.createArrayBacked(IpBanEvent.class, + (listeners) -> (banData, silent) -> { + for (IpBanEvent listener : listeners) { + if (listener.onIpBan(banData, silent)) { + return true; + } + } + return false; + }); + + public static final Event IP_BANNED_EVENT = EventFactory.createArrayBacked(IpBannedEvent.class, + (listeners) -> (banData, silent) -> { + for (IpBannedEvent listener : listeners) { + listener.onIpBanned(banData, silent); + } + }); + + public static final Event IP_UNBAN_EVENT = EventFactory.createArrayBacked(IpUnbanEvent.class, + (listeners) -> (banData, actor, reason) -> { + for (IpUnbanEvent listener : listeners) { + listener.onIpUnban(banData, actor, reason); + } + }); + + public static final Event IP_MUTE_EVENT = EventFactory.createArrayBacked(IpMuteEvent.class, + (listeners) -> (muteData, silent) -> { + for (IpMuteEvent listener : listeners) { + if (listener.onIpMute(muteData, silent)) { + return true; + } + } + return false; + }); + + public static final Event IP_MUTED_EVENT = EventFactory.createArrayBacked(IpMutedEvent.class, + (listeners) -> (muteData, silent) -> { + for (IpMutedEvent listener : listeners) { + listener.onIpMuted(muteData, silent); + } + }); + + public static final Event IP_UNMUTED_EVENT = EventFactory.createArrayBacked(IpUnmutedEvent.class, + (listeners) -> (muteData, actor, reason) -> { + for (IpUnmutedEvent listener : listeners) { + listener.onIpUnmuted(muteData, actor, reason); + } + }); + + public static final Event PLAYER_KICKED_EVENT = EventFactory.createArrayBacked(PlayerKickedEvent.class, + (listeners) -> (kickData, silent) -> { + for (PlayerKickedEvent listener : listeners) { + listener.onPlayerKicked(kickData, silent); + } + }); + + public static final Event PLAYER_NOTE_CREATED_EVENT = EventFactory.createArrayBacked(PlayerNoteCreatedEvent.class, + (listeners) -> (noteData) -> { + for (PlayerNoteCreatedEvent listener : listeners) { + listener.onPlayerNoteCreated(noteData); + } + }); + + public static final Event PLAYER_REPORT_EVENT = EventFactory.createArrayBacked(PlayerReportEvent.class, + (listeners) -> (reportData, silent) -> { + for (PlayerReportEvent listener : listeners) { + if (listener.onPlayerReport(reportData, silent)) { + return true; + } + } + return false; + }); + + public static final Event PLAYER_REPORTED_EVENT = EventFactory.createArrayBacked(PlayerReportedEvent.class, + (listeners) -> (reportData, silent) -> { + for (PlayerReportedEvent listener : listeners) { + listener.onPlayerReported(reportData, silent); + } + }); + + public static final Event PLAYER_REPORT_DELETED_EVENT = EventFactory.createArrayBacked(PlayerReportDeletedEvent.class, + (listeners) -> (reportData) -> { + for (PlayerReportDeletedEvent listener : listeners) { + listener.onPlayerReportDeleted(reportData); + } + }); + + public static final Event NAME_BAN_EVENT = EventFactory.createArrayBacked(NameBanEvent.class, + (listeners) -> (banData, silent) -> { + for (NameBanEvent listener : listeners) { + if (listener.onNameBan(banData, silent)) { + return true; + } + } + return false; + }); + + public static final Event NAME_BANNED_EVENT = EventFactory.createArrayBacked(NameBannedEvent.class, + (listeners) -> (banData, silent) -> { + for (NameBannedEvent listener : listeners) { + listener.onNameBanned(banData, silent); + } + }); + + public static final Event NAME_UNBAN_EVENT = EventFactory.createArrayBacked(NameUnbanEvent.class, + (listeners) -> (banData, actor, reason) -> { + for (NameUnbanEvent listener : listeners) { + listener.onNameUnban(banData, actor, reason); + } + }); + + public static final Event PLAYER_WARN_EVENT = EventFactory.createArrayBacked(PlayerWarnEvent.class, + (listeners) -> (warnData, silent) -> { + for (PlayerWarnEvent listener : listeners) { + if (listener.onPlayerWarn(warnData, silent)) { + return true; + } + } + return false; + }); + + public static final Event PLAYER_WARNED_EVENT = EventFactory.createArrayBacked(PlayerWarnedEvent.class, + (listeners) -> (warnData, silent) -> { + for (PlayerWarnedEvent listener : listeners) { + listener.onPlayerWarned(warnData, silent); + } + }); + + public static final Event IP_RANGE_BAN_EVENT = EventFactory.createArrayBacked(IpRangeBanEvent.class, + (listeners) -> (banData, silent) -> { + for (IpRangeBanEvent listener : listeners) { + if (listener.onIpRangeBan(banData, silent)) { + return true; + } + } + return false; + }); + + public static final Event IP_RANGE_BANNED_EVENT = EventFactory.createArrayBacked(IpRangeBannedEvent.class, + (listeners) -> (banData, silent) -> { + for (IpRangeBannedEvent listener : listeners) { + listener.onIpRangeBanned(banData, silent); + } + }); + + public static final Event IP_RANGE_UNBAN_EVENT = EventFactory.createArrayBacked(IpRangeUnbanEvent.class, + (listeners) -> (banData, actor, reason) -> { + for (IpRangeUnbanEvent listener : listeners) { + listener.onIpRangeUnban(banData, actor, reason); + } + }); + + public static final Event PLAYER_MUTE_EVENT = EventFactory.createArrayBacked(PlayerMuteEvent.class, + (listeners) -> (muteData, silent) -> { + for (PlayerMuteEvent listener : listeners) { + if (listener.onPlayerMute(muteData, silent)) { + return true; + } + } + return false; + }); + + public static final Event PLAYER_MUTED_EVENT = EventFactory.createArrayBacked(PlayerMutedEvent.class, + (listeners) -> (muteData, silent) -> { + for (PlayerMutedEvent listener : listeners) { + listener.onPlayerMuted(muteData, silent); + } + }); + + public static final Event PLAYER_UNMUTE_EVENT = EventFactory.createArrayBacked(PlayerUnmuteEvent.class, + (listeners) -> (muteData, actor, reason) -> { + for (PlayerUnmuteEvent listener : listeners) { + listener.onPlayerUnmute(muteData, actor, reason); + } + }); + + public static final Event PLUGIN_RELOADED_EVENT = EventFactory.createArrayBacked(PluginReloadedEvent.class, + (listeners) -> (actor) -> { + for (PluginReloadedEvent listener : listeners) { + listener.onPluginReloaded(actor); + } + }); + + public static final Event PLAYER_DENIED_EVENT = EventFactory.createArrayBacked(PlayerDeniedEvent.class, + (listeners) -> (player, message) -> { + for (PlayerDeniedEvent listener : listeners) { + listener.onPlayerDenied(player, message); + } + }); + + @FunctionalInterface + public interface PlayerBanEvent { + boolean onPlayerBan(PlayerBanData banData, SilentValue silent); + } + + @FunctionalInterface + public interface PlayerBannedEvent { + void onPlayerBanned(PlayerBanData banData, boolean silent); + } + + @FunctionalInterface + public interface PlayerUnbanEvent { + void onPlayerUnban(PlayerBanData banData, PlayerData actor, String reason); + } + + @FunctionalInterface + public interface IpBanEvent { + boolean onIpBan(IpBanData banData, SilentValue silent); + } + + @FunctionalInterface + public interface IpBannedEvent { + void onIpBanned(IpBanData banData, boolean silent); + } + + @FunctionalInterface + public interface IpUnbanEvent { + void onIpUnban(IpBanData banData, PlayerData actor, String reason); + } + + @FunctionalInterface + public interface IpMuteEvent { + boolean onIpMute(IpMuteData muteData, SilentValue silent); + } + + @FunctionalInterface + public interface IpMutedEvent { + void onIpMuted(IpMuteData muteData, boolean silent); + } + + @FunctionalInterface + public interface IpUnmutedEvent { + void onIpUnmuted(IpMuteData muteData, PlayerData actor, String reason); + } + + @FunctionalInterface + public interface PlayerKickedEvent { + void onPlayerKicked(PlayerKickData kickData, boolean silent); + } + + @FunctionalInterface + public interface PlayerNoteCreatedEvent { + void onPlayerNoteCreated(PlayerNoteData noteData); + } + + @FunctionalInterface + public interface PlayerReportEvent { + boolean onPlayerReport(PlayerReportData reportData, SilentValue silent); + } + + @FunctionalInterface + public interface PlayerReportedEvent { + void onPlayerReported(PlayerReportData reportData, boolean silent); + } + + @FunctionalInterface + public interface PlayerReportDeletedEvent { + void onPlayerReportDeleted(PlayerReportData reportData); + } + + @FunctionalInterface + public interface NameBanEvent { + boolean onNameBan(NameBanData banData, SilentValue silent); + } + + @FunctionalInterface + public interface NameBannedEvent { + void onNameBanned(NameBanData banData, boolean silent); + } + + @FunctionalInterface + public interface NameUnbanEvent { + void onNameUnban(NameBanData banData, PlayerData actor, String reason); + } + + @FunctionalInterface + public interface PlayerWarnEvent { + boolean onPlayerWarn(PlayerWarnData warnData, SilentValue silent); + } + + @FunctionalInterface + public interface PlayerWarnedEvent { + void onPlayerWarned(PlayerWarnData warnData, boolean silent); + } + + @FunctionalInterface + public interface IpRangeBanEvent { + boolean onIpRangeBan(IpRangeBanData banData, SilentValue silent); + } + + @FunctionalInterface + public interface IpRangeBannedEvent { + void onIpRangeBanned(IpRangeBanData banData, boolean silent); + } + + @FunctionalInterface + public interface IpRangeUnbanEvent { + void onIpRangeUnban(IpRangeBanData banData, PlayerData actor, String reason); + } + + @FunctionalInterface + public interface PlayerMuteEvent { + boolean onPlayerMute(PlayerMuteData muteData, SilentValue silent); + } + + @FunctionalInterface + public interface PlayerMutedEvent { + void onPlayerMuted(PlayerMuteData muteData, boolean silent); + } + + @FunctionalInterface + public interface PlayerUnmuteEvent { + void onPlayerUnmute(PlayerMuteData muteData, PlayerData actor, String reason); + } + + @FunctionalInterface + public interface PluginReloadedEvent { + void onPluginReloaded(PlayerData actor); + } + + @FunctionalInterface + public interface PlayerDeniedEvent { + void onPlayerDenied(PlayerData player, Message message); + } + + public static class SilentValue { + @Getter + @Setter + private boolean silent; + + public SilentValue(boolean silent) { + this.silent = silent; + } + } +} diff --git a/fabric/src/main/java/me/confuser/banmanager/fabric/FabricCommand.java b/fabric/src/main/java/me/confuser/banmanager/fabric/FabricCommand.java new file mode 100644 index 000000000..2ff1c451b --- /dev/null +++ b/fabric/src/main/java/me/confuser/banmanager/fabric/FabricCommand.java @@ -0,0 +1,109 @@ +package me.confuser.banmanager.fabric; + +import java.lang.reflect.InvocationTargetException; +import java.util.Arrays; +import java.util.Collection; +import java.util.LinkedList; +import java.util.List; +import java.util.concurrent.CompletableFuture; + +import com.mojang.brigadier.CommandDispatcher; +import com.mojang.brigadier.arguments.StringArgumentType; +import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import com.mojang.brigadier.context.CommandContext; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import com.mojang.brigadier.suggestion.Suggestions; +import com.mojang.brigadier.suggestion.SuggestionsBuilder; +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.commands.CommonCommand; +import me.confuser.banmanager.common.commands.CommonSender; +import me.lucko.fabric.api.permissions.v0.Permissions; +import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback; +import net.minecraft.server.command.CommandManager; +import net.minecraft.server.command.ServerCommandSource; +import net.minecraft.server.network.ServerPlayerEntity; + +public class FabricCommand { + + private CommonCommand command; + + public FabricCommand(CommonCommand command) { + this.command = command; + } + + public void register() { + CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> { + registerCommand(dispatcher, command.getCommandName()); + + for (String alias : command.getAliases()) { + registerCommand(dispatcher, alias); + } + }); + } + + private void registerCommand(CommandDispatcher dispatcher, String name) { + LiteralArgumentBuilder literal = CommandManager.literal(name) + .requires(source -> Permissions.check(source, command.getPermission(), 4)) + .executes(this::execute) + .then(CommandManager.argument("args", StringArgumentType.greedyString()).executes(this::execute)); + + dispatcher.register(literal); + } + + private int execute(CommandContext context) throws CommandSyntaxException { + ServerCommandSource source = context.getSource(); + CommonSender commonSender = getSender(source); + + int start = context.getRange().getStart(); + String buffer = context.getInput().substring(start); + List args = new LinkedList(Arrays.asList(buffer.split(" "))); + args.remove(0); + + try { + if (commonSender.hasPermission(command.getPermission())) { + boolean success = this.command.onCommand(commonSender, this.command.getParser(args)); + + if (!success) { + commonSender.sendMessage(command.getUsage()); + } + + return success ? 1 : 0; + } else { + commonSender.sendMessage("&cYou do not have permission to use this command"); + return 1; + } + } catch (Exception e) { + e.printStackTrace(); + } + + return 0; + } + + private CommonSender getSender(ServerCommandSource source) { + if (source.getEntity() instanceof ServerPlayerEntity) { + return new FabricPlayer((ServerPlayerEntity) source.getEntity(), source.getServer(), BanManagerPlugin.getInstance().getConfig().isOnlineMode()); + } else { + return new FabricSender(BanManagerPlugin.getInstance(), source); + } + } + + private CompletableFuture suggest(CommandContext context, SuggestionsBuilder builder) throws CommandSyntaxException { + if (!this.command.isEnableTabCompletion()) { + return builder.buildFuture(); + } + + ServerCommandSource source = context.getSource(); + CommonSender commonSender = getSender(source); + + String input = context.getInput().substring(context.getInput().indexOf(' ') + 1); + String[] args = input.split(" "); + + List suggestions = this.command.handlePlayerNameTabComplete(commonSender, args); + + for (String suggestion : suggestions) { + builder.suggest(suggestion); + } + + return builder.buildFuture(); + } +} diff --git a/fabric/src/main/java/me/confuser/banmanager/fabric/FabricPlayer.java b/fabric/src/main/java/me/confuser/banmanager/fabric/FabricPlayer.java new file mode 100644 index 000000000..f1a15ec8f --- /dev/null +++ b/fabric/src/main/java/me/confuser/banmanager/fabric/FabricPlayer.java @@ -0,0 +1,136 @@ +package me.confuser.banmanager.fabric; + +import java.net.InetAddress; +import java.net.InetSocketAddress; +import java.sql.SQLException; +import java.util.Collection; +import java.util.Collections; +import java.util.Set; +import java.util.UUID; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.CommonPlayer; +import me.confuser.banmanager.common.CommonWorld; +import me.confuser.banmanager.common.kyori.text.TextComponent; +import me.confuser.banmanager.common.kyori.text.serializer.gson.GsonComponentSerializer; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.util.Message; +import me.confuser.banmanager.common.util.UUIDUtils; +import net.minecraft.network.packet.s2c.play.PositionFlag; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.server.world.ServerWorld; +import me.lucko.fabric.api.permissions.v0.Permissions; + +public class FabricPlayer implements CommonPlayer { + private final UUID uuid; + private final boolean onlineMode; + private final ServerPlayerEntity player; + private final MinecraftServer server; + + public FabricPlayer(ServerPlayerEntity player, MinecraftServer server, boolean onlineMode) { + this.player = player; + this.server = server; + this.uuid = player.getUuid(); + this.onlineMode = onlineMode; + } + + public void kick(String message) { + this.player.networkHandler.disconnect(FabricServer.formatMessage(message)); + } + + public void sendMessage(String message) { + if(message.isEmpty()) return; + + if(Message.isJSONMessage(message)) { + sendJSONMessage(message); + } else { + this.player.sendMessage(FabricServer.formatMessage(message)); + } + } + + public void sendMessage(Message message) { + sendMessage(message.toString()); + } + + @Override + public void sendJSONMessage(TextComponent jsonString) { + getPlayer().sendMessage(FabricServer.formatMessage(jsonString)); + } + + @Override + public void sendJSONMessage(String message) { + getPlayer().sendMessage(FabricServer.formatJsonMessage(message)); + } + + public boolean isConsole() { + return false; + } + + public PlayerData getData() { + try { + return BanManagerPlugin.getInstance().getPlayerStorage().queryForId(UUIDUtils.toBytes(getUniqueId())); + } catch (SQLException e) { + e.printStackTrace(); + sendMessage(Message.get("sender.error.exception").toString()); + return null; + } + } + + public boolean isOnlineMode() { + return onlineMode; + } + + public boolean hasPermission(String permission) { + return Permissions.check(getPlayer(), permission,4); + } + + public String getDisplayName() { + return getPlayer().getDisplayName().toString(); + } + + public String getName() { + return getPlayer().getNameForScoreboard(); + } + + public InetAddress getAddress() { + return ((InetSocketAddress) getPlayer().networkHandler.getConnectionAddress()).getAddress(); + } + + public UUID getUniqueId() { + return getPlayer().getUuid(); + } + + public boolean teleport(CommonWorld world, double x, double y, double z, float pitch, float yaw) { + ServerPlayerEntity player = getPlayer(); + + for (ServerWorld world1 : this.server.getWorlds()) { + if (world1.getRegistryKey().getValue().toString().equals(world.getName())) { + return player.teleport(world1, x, y, z, Collections.emptySet(), yaw, pitch, true); + } + } + + return false; + } + + @Override + public boolean canSee(CommonPlayer player) { + return getPlayer().canSee(this.server.getPlayerManager().getPlayer(player.getUniqueId())); + } + + public boolean isOnline() { + return getPlayer() != null && !getPlayer().isDisconnected(); + } + + private ServerPlayerEntity getPlayer() { + if (player != null) return player; + if (isOnlineMode()) return this.server.getPlayerManager().getPlayer(uuid); + + for (ServerPlayerEntity onlinePlayer : this.server.getPlayerManager().getPlayerList()) { + if (UUIDUtils.createOfflineUUID(onlinePlayer.getName().toString()).equals(uuid)) return onlinePlayer; + } + + return null; + } + +} diff --git a/fabric/src/main/java/me/confuser/banmanager/fabric/FabricScheduler.java b/fabric/src/main/java/me/confuser/banmanager/fabric/FabricScheduler.java new file mode 100644 index 000000000..bf5d021c5 --- /dev/null +++ b/fabric/src/main/java/me/confuser/banmanager/fabric/FabricScheduler.java @@ -0,0 +1,111 @@ +package me.confuser.banmanager.fabric; + +import me.confuser.banmanager.common.CommonScheduler; +import net.minecraft.server.MinecraftServer; + +import java.util.concurrent.Executors; +import java.util.concurrent.ForkJoinPool; +import java.util.concurrent.ForkJoinWorkerThread; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.TimeUnit; + +public class FabricScheduler implements CommonScheduler { + private final ScheduledExecutorService schedulerService; + private final ForkJoinPool executorService; + private MinecraftServer server; + + public FabricScheduler() { + this.schedulerService = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() { + @Override + public Thread newThread(Runnable r) { + Thread thread = new Thread(r); + thread.setName("banmanager-scheduler"); + return thread; + } + }); + this.executorService = new ForkJoinPool( + Runtime.getRuntime().availableProcessors(), + pool -> { + ForkJoinWorkerThread worker = ForkJoinPool.defaultForkJoinWorkerThreadFactory.newThread(pool); + worker.setName("banmanager-worker-" + worker.getPoolIndex()); + return worker; + }, + (t, e) -> e.printStackTrace(), + false); + } + + public void enable(MinecraftServer server) { + this.server = server; + } + + @Override + public void runAsync(Runnable task) { + executorService.execute(() -> { + try { + task.run(); + } catch (Exception e) { + e.printStackTrace(); + } + }); + } + + @Override + public void runAsyncLater(Runnable task, long delay) { + schedulerService.schedule(() -> executorService.execute(() -> { + try { + task.run(); + } catch (Exception e) { + e.printStackTrace(); + } + }), delay, TimeUnit.MILLISECONDS); + } + + @Override + public void runSync(Runnable task) { + server.execute(() -> { + try { + task.run(); + } catch (Exception e) { + e.printStackTrace(); + } + }); + } + + @Override + public void runSyncLater(Runnable task, long delay) { + schedulerService.schedule(() -> server.execute(() -> { + try { + task.run(); + } catch (Exception e) { + e.printStackTrace(); + } + }), delay, TimeUnit.MILLISECONDS); + } + + public void runAsyncRepeating(Runnable task, long initialDelay, long period) { + schedulerService.scheduleAtFixedRate(() -> executorService.execute(() -> { + try { + task.run(); + } catch (Exception e) { + e.printStackTrace(); + } + }), initialDelay, period, TimeUnit.SECONDS); + } + + public void shutdown() { + schedulerService.shutdown(); + executorService.shutdown(); + try { + if (!schedulerService.awaitTermination(60, TimeUnit.SECONDS)) { + schedulerService.shutdownNow(); + } + if (!executorService.awaitTermination(60, TimeUnit.SECONDS)) { + executorService.shutdownNow(); + } + } catch (InterruptedException e) { + schedulerService.shutdownNow(); + executorService.shutdownNow(); + } + } +} diff --git a/fabric/src/main/java/me/confuser/banmanager/fabric/FabricSender.java b/fabric/src/main/java/me/confuser/banmanager/fabric/FabricSender.java new file mode 100644 index 000000000..58bbc8eee --- /dev/null +++ b/fabric/src/main/java/me/confuser/banmanager/fabric/FabricSender.java @@ -0,0 +1,60 @@ +package me.confuser.banmanager.fabric; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.commands.CommonSender; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.util.Message; +import me.confuser.banmanager.common.util.UUIDUtils; +import net.minecraft.server.command.ServerCommandSource; +import me.lucko.fabric.api.permissions.v0.Permissions; + +import java.sql.SQLException; + +public class FabricSender implements CommonSender { + + private BanManagerPlugin plugin; + private ServerCommandSource sender; + + public FabricSender(BanManagerPlugin plugin, ServerCommandSource sender) { + this.plugin = plugin; + this.sender = sender; + } + + @Override + public String getName() { + return sender.getName(); + } + + @Override + public boolean hasPermission(String permission) { + return Permissions.check(sender, permission, 4); + } + + @Override + public void sendMessage(String message) { + sender.sendMessage(FabricServer.formatMessage(message)); + } + + @Override + public void sendMessage(Message message) { + sendMessage(message.toString()); + } + + @Override + public boolean isConsole() { + return !sender.isExecutedByPlayer(); + } + + @Override + public PlayerData getData() { + if (isConsole()) return plugin.getPlayerStorage().getConsole(); + + try { + return plugin.getPlayerStorage().queryForId(UUIDUtils.toBytes((sender.getPlayer().getUuid()))); + } catch (SQLException e) { + e.printStackTrace(); + sendMessage(Message.get("sender.error.exception")); + return null; + } + } +} diff --git a/fabric/src/main/java/me/confuser/banmanager/fabric/FabricServer.java b/fabric/src/main/java/me/confuser/banmanager/fabric/FabricServer.java new file mode 100644 index 000000000..94ec75cf2 --- /dev/null +++ b/fabric/src/main/java/me/confuser/banmanager/fabric/FabricServer.java @@ -0,0 +1,353 @@ +package me.confuser.banmanager.fabric; + +import java.util.Arrays; +import java.util.UUID; +import java.util.ArrayList; +import java.util.List; + +import com.mojang.serialization.JsonOps; + +import lombok.Getter; + +import com.mojang.brigadier.tree.CommandNode; +import com.mojang.brigadier.tree.LiteralCommandNode; +import com.google.gson.JsonParser; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.CommonExternalCommand; +import me.confuser.banmanager.common.CommonPlayer; +import me.confuser.banmanager.common.CommonServer; +import me.confuser.banmanager.common.CommonWorld; +import me.confuser.banmanager.common.api.events.CommonEvent; +import me.confuser.banmanager.common.commands.CommonSender; +import me.confuser.banmanager.common.data.IpBanData; +import me.confuser.banmanager.common.data.IpMuteData; +import me.confuser.banmanager.common.data.IpRangeBanData; +import me.confuser.banmanager.common.data.NameBanData; +import me.confuser.banmanager.common.data.PlayerBanData; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.data.PlayerKickData; +import me.confuser.banmanager.common.data.PlayerMuteData; +import me.confuser.banmanager.common.data.PlayerNoteData; +import me.confuser.banmanager.common.data.PlayerReportData; +import me.confuser.banmanager.common.data.PlayerWarnData; +import me.confuser.banmanager.common.kyori.text.TextComponent; +import me.confuser.banmanager.common.kyori.text.serializer.gson.GsonComponentSerializer; +import me.confuser.banmanager.common.kyori.text.serializer.legacy.LegacyComponentSerializer; +import com.google.gson.JsonElement; +import me.confuser.banmanager.common.util.Message; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.text.Text; +import net.minecraft.text.TextCodecs; +import net.fabricmc.fabric.api.event.Event; +import net.fabricmc.fabric.api.event.EventFactory; + +public class FabricServer implements CommonServer { + + private BanManagerPlugin plugin; + @Getter + private MinecraftServer server; + + public FabricServer() { + } + + public void enable(BanManagerPlugin plugin, MinecraftServer server) { + this.plugin = plugin; + this.server = server; + } + + public CommonPlayer getPlayer(UUID uniqueId) { + ServerPlayerEntity player = this.server.getPlayerManager().getPlayer(uniqueId); + + if (player == null) return null; + + return new FabricPlayer(player, this.server, plugin.getConfig().isOnlineMode()); + } + + public CommonPlayer getPlayer(String name) { + ServerPlayerEntity player = this.server.getPlayerManager().getPlayer(name); + + if (player == null) return null; + + return new FabricPlayer(player, this.server, plugin.getConfig().isOnlineMode()); + } + + public CommonPlayer[] getOnlinePlayers() { + return this.server.getPlayerManager().getPlayerList().stream() + .map(player -> new FabricPlayer(player, this.server, plugin.getConfig().isOnlineMode())) + .filter(player -> player != null && player.isOnline()) + .toArray(CommonPlayer[]::new); + } + + public void broadcast(String message, String permission) { + Arrays.stream(getOnlinePlayers()) + .filter(player -> player.hasPermission(permission)) + .forEach(player -> player.sendMessage(message)); + + getConsoleSender().sendMessage(message); + } + + public void broadcastJSON(TextComponent message, String permission) { + Arrays.stream(getOnlinePlayers()) + .filter(player -> player.hasPermission(permission)) + .forEach(player -> player.sendJSONMessage(message)); + } + + public void broadcast(String message, String permission, CommonSender sender) { + broadcast(message, permission); + + if (!sender.hasPermission(permission)) sender.sendMessage(message); + } + + public CommonSender getConsoleSender() { + return new FabricSender(plugin, this.server.getCommandSource()); + } + + public boolean dispatchCommand(CommonSender consoleSender, String command) { + this.server.getCommandManager().executeWithPrefix(this.server.getCommandSource(), command); + + return true; + } + + public CommonWorld getWorld(String name) { + for (ServerWorld world : this.server.getWorlds()) { + if (world.getRegistryKey().getValue().toString().equals(name)) { + return new CommonWorld(world.getRegistryKey().getValue().toString()); + } + } + + return null; + } + + public CommonEvent callEvent(String name, Object... args) { + CommonEvent commonEvent; + BanManagerEvents.SilentValue silentValue = new BanManagerEvents.SilentValue(true); + + switch (name) { + case "PlayerBanEvent": + silentValue = new BanManagerEvents.SilentValue((boolean) args[1]); + commonEvent = new CommonEvent(!BanManagerEvents.PLAYER_BAN_EVENT.invoker().onPlayerBan((PlayerBanData) args[0], silentValue), silentValue.isSilent()); + break; + case "PlayerBannedEvent": + silentValue = new BanManagerEvents.SilentValue((boolean) args[1]); + BanManagerEvents.PLAYER_BANNED_EVENT.invoker().onPlayerBanned((PlayerBanData) args[0], silentValue.isSilent()); + commonEvent = new CommonEvent(false, silentValue.isSilent()); + break; + case "PlayerUnbanEvent": + BanManagerEvents.PLAYER_UNBAN_EVENT.invoker().onPlayerUnban((PlayerBanData) args[0], (PlayerData) args[1], (String) args[2]); + commonEvent = new CommonEvent(false, false); + break; + + case "IpBanEvent": + silentValue = new BanManagerEvents.SilentValue((boolean) args[1]); + commonEvent = new CommonEvent(!BanManagerEvents.IP_BAN_EVENT.invoker().onIpBan((IpBanData) args[0], silentValue), silentValue.isSilent()); + break; + case "IpBannedEvent": + silentValue = new BanManagerEvents.SilentValue((boolean) args[1]); + BanManagerEvents.IP_BANNED_EVENT.invoker().onIpBanned((IpBanData) args[0], silentValue.isSilent()); + commonEvent = new CommonEvent(false, silentValue.isSilent()); + break; + case "IpUnbanEvent": + BanManagerEvents.IP_UNBAN_EVENT.invoker().onIpUnban((IpBanData) args[0], (PlayerData) args[1], (String) args[2]); + commonEvent = new CommonEvent(false, false); + break; + + case "IpMuteEvent": + silentValue = new BanManagerEvents.SilentValue((boolean) args[1]); + commonEvent = new CommonEvent(!BanManagerEvents.IP_MUTE_EVENT.invoker().onIpMute((IpMuteData) args[0], silentValue), silentValue.isSilent()); + break; + case "IpMutedEvent": + silentValue = new BanManagerEvents.SilentValue((boolean) args[1]); + BanManagerEvents.IP_MUTED_EVENT.invoker().onIpMuted((IpMuteData) args[0], silentValue.isSilent()); + commonEvent = new CommonEvent(false, silentValue.isSilent()); + break; + case "IpUnmutedEvent": + BanManagerEvents.IP_UNMUTED_EVENT.invoker().onIpUnmuted((IpMuteData) args[0], (PlayerData) args[1], (String) args[2]); + commonEvent = new CommonEvent(false, false); + break; + + case "PlayerKickedEvent": + silentValue = new BanManagerEvents.SilentValue((boolean) args[1]); + BanManagerEvents.PLAYER_KICKED_EVENT.invoker().onPlayerKicked((PlayerKickData) args[0], silentValue.isSilent()); + commonEvent = new CommonEvent(false, silentValue.isSilent()); + break; + + case "PlayerNoteCreatedEvent": + BanManagerEvents.PLAYER_NOTE_CREATED_EVENT.invoker().onPlayerNoteCreated((PlayerNoteData) args[0]); + commonEvent = new CommonEvent(false, false); + break; + + case "PlayerReportEvent": + silentValue = new BanManagerEvents.SilentValue((boolean) args[1]); + commonEvent = new CommonEvent(!BanManagerEvents.PLAYER_REPORT_EVENT.invoker().onPlayerReport((PlayerReportData) args[0], silentValue), silentValue.isSilent()); + break; + case "PlayerReportedEvent": + silentValue = new BanManagerEvents.SilentValue((boolean) args[1]); + BanManagerEvents.PLAYER_REPORTED_EVENT.invoker().onPlayerReported((PlayerReportData) args[0], silentValue.isSilent()); + commonEvent = new CommonEvent(false, silentValue.isSilent()); + break; + case "PlayerReportDeletedEvent": + BanManagerEvents.PLAYER_REPORT_DELETED_EVENT.invoker().onPlayerReportDeleted((PlayerReportData) args[0]); + commonEvent = new CommonEvent(false, false); + break; + + case "NameBanEvent": + silentValue = new BanManagerEvents.SilentValue((boolean) args[1]); + commonEvent = new CommonEvent(!BanManagerEvents.NAME_BAN_EVENT.invoker().onNameBan((NameBanData) args[0], silentValue), silentValue.isSilent()); + break; + case "NameBannedEvent": + silentValue = new BanManagerEvents.SilentValue((boolean) args[1]); + BanManagerEvents.NAME_BANNED_EVENT.invoker().onNameBanned((NameBanData) args[0], silentValue.isSilent()); + commonEvent = new CommonEvent(false, silentValue.isSilent()); + break; + case "NameUnbanEvent": + BanManagerEvents.NAME_UNBAN_EVENT.invoker().onNameUnban((NameBanData) args[0], (PlayerData) args[1], (String) args[2]); + commonEvent = new CommonEvent(false, false); + break; + + case "PlayerWarnEvent": + silentValue = new BanManagerEvents.SilentValue((boolean) args[1]); + commonEvent = new CommonEvent(!BanManagerEvents.PLAYER_WARN_EVENT.invoker().onPlayerWarn((PlayerWarnData) args[0], silentValue), silentValue.isSilent()); + break; + case "PlayerWarnedEvent": + silentValue = new BanManagerEvents.SilentValue((boolean) args[1]); + BanManagerEvents.PLAYER_WARNED_EVENT.invoker().onPlayerWarned((PlayerWarnData) args[0], silentValue.isSilent()); + commonEvent = new CommonEvent(false, silentValue.isSilent()); + break; + + case "IpRangeBanEvent": + silentValue = new BanManagerEvents.SilentValue((boolean) args[1]); + commonEvent = new CommonEvent(!BanManagerEvents.IP_RANGE_BAN_EVENT.invoker().onIpRangeBan((IpRangeBanData) args[0], silentValue), silentValue.isSilent()); + break; + case "IpRangeBannedEvent": + silentValue = new BanManagerEvents.SilentValue((boolean) args[1]); + BanManagerEvents.IP_RANGE_BANNED_EVENT.invoker().onIpRangeBanned((IpRangeBanData) args[0], silentValue.isSilent()); + commonEvent = new CommonEvent(false, silentValue.isSilent()); + break; + case "IpRangeUnbanEvent": + BanManagerEvents.IP_RANGE_UNBAN_EVENT.invoker().onIpRangeUnban((IpRangeBanData) args[0], (PlayerData) args[1], (String) args[2]); + commonEvent = new CommonEvent(false, false); + break; + + case "PlayerMuteEvent": + silentValue = new BanManagerEvents.SilentValue((boolean) args[1]); + commonEvent = new CommonEvent(!BanManagerEvents.PLAYER_MUTE_EVENT.invoker().onPlayerMute((PlayerMuteData) args[0], silentValue), silentValue.isSilent()); + break; + case "PlayerMutedEvent": + silentValue = new BanManagerEvents.SilentValue((boolean) args[1]); + BanManagerEvents.PLAYER_MUTED_EVENT.invoker().onPlayerMuted((PlayerMuteData) args[0], silentValue.isSilent()); + commonEvent = new CommonEvent(false, silentValue.isSilent()); + break; + case "PlayerUnmuteEvent": + BanManagerEvents.PLAYER_UNMUTE_EVENT.invoker().onPlayerUnmute((PlayerMuteData) args[0], (PlayerData) args[1], (String) args[2]); + commonEvent = new CommonEvent(false, false); + break; + + case "PluginReloadedEvent": + BanManagerEvents.PLUGIN_RELOADED_EVENT.invoker().onPluginReloaded((PlayerData) args[0]); + commonEvent = new CommonEvent(false, false); + break; + + case "PlayerDeniedEvent": + BanManagerEvents.PLAYER_DENIED_EVENT.invoker().onPlayerDenied((PlayerData) args[0], (Message) args[1]); + commonEvent = new CommonEvent(false, false); + break; + + default: + commonEvent = new CommonEvent(false, false); + break; + } + + return commonEvent; + } + + public CommonExternalCommand getPluginCommand(String commandName) { + CommandNode node = null; + + // Not overly efficient but it's only on startup and seems to find aliases correctly for blocking + for (CommandNode commandNode : this.server.getCommandManager().getDispatcher().getRoot().getChildren()) { + if (commandNode.getName().equals(commandName)) { + node = commandNode; + break; + } + if (commandNode instanceof LiteralCommandNode) { + LiteralCommandNode literalNode = (LiteralCommandNode) commandNode; + for (CommandNode child : literalNode.getChildren()) { + if (child.getName().equals(commandName)) { + node = child; + break; + } + } + if (node == null) { + CommandNode redirectNode = literalNode.getRedirect(); + if (redirectNode != null && redirectNode.getName().equals(commandName)) { + node = redirectNode; + break; + } + } + } + } + + if (node == null) return null; + + List redirects = new ArrayList<>(); + + for (CommandNode commandNode : this.server.getCommandManager().getDispatcher().getRoot().getChildren()) { + if (commandNode instanceof LiteralCommandNode) { + LiteralCommandNode literalNode = (LiteralCommandNode) commandNode; + for (CommandNode child : literalNode.getChildren()) { + if (child.getName().equals(node.getName())) { + collectRedirects(child, redirects); + } + } + CommandNode redirectNode = literalNode.getRedirect(); + if (redirectNode != null && redirectNode.getName().equals(node.getName())) { + redirects.add(literalNode.getName()); + + collectRedirects(redirectNode, redirects); + } + } + } + + return new CommonExternalCommand(node.getName(), node.getName(), redirects); + } + + private void collectRedirects(CommandNode node, List redirects) { + if (node instanceof LiteralCommandNode) { + LiteralCommandNode literalNode = (LiteralCommandNode) node; + CommandNode redirectNode = literalNode.getRedirect(); + + if (redirectNode != null) { + redirects.add(redirectNode.getName()); + collectRedirects(redirectNode, redirects); + } + for (CommandNode child : literalNode.getChildren()) { + collectRedirects(child, redirects); + } + } + } + + public static Text formatMessage(String message) { + return formatMessage(LegacyComponentSerializer.legacy('&').deserialize(message)); + } + + public static Text formatMessage(Message message) { + return formatMessage(message.toString()); + } + + public static Text formatMessage(TextComponent message) { + return TextCodecs.CODEC + .decode(JsonOps.INSTANCE, JsonParser.parseString(GsonComponentSerializer.gson().serialize(message))) + .getOrThrow() + .getFirst(); + } + + public static Text formatJsonMessage(String message) { + return TextCodecs.CODEC + .decode(JsonOps.INSTANCE, JsonParser.parseString(message)) + .getOrThrow() + .getFirst(); + } +} diff --git a/fabric/src/main/java/me/confuser/banmanager/fabric/PluginLogger.java b/fabric/src/main/java/me/confuser/banmanager/fabric/PluginLogger.java new file mode 100644 index 000000000..9e6fd0fc2 --- /dev/null +++ b/fabric/src/main/java/me/confuser/banmanager/fabric/PluginLogger.java @@ -0,0 +1,29 @@ +package me.confuser.banmanager.fabric; + +import org.apache.logging.log4j.Logger; + +import me.confuser.banmanager.common.CommonLogger; + +public class PluginLogger implements CommonLogger { + + private final Logger logger; + + public PluginLogger(Logger logger) { + this.logger = logger; + } + + @Override + public void info(String msg) { + logger.info(msg); + } + + @Override + public void warning(String msg) { + logger.warn(msg); + } + + @Override + public void severe(String msg) { + logger.error(msg); + } +} diff --git a/fabric/src/main/java/me/confuser/banmanager/fabric/listeners/BanListener.java b/fabric/src/main/java/me/confuser/banmanager/fabric/listeners/BanListener.java new file mode 100644 index 000000000..fc5404df4 --- /dev/null +++ b/fabric/src/main/java/me/confuser/banmanager/fabric/listeners/BanListener.java @@ -0,0 +1,36 @@ +package me.confuser.banmanager.fabric.listeners; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.listeners.CommonBanListener; +import me.confuser.banmanager.fabric.BanManagerEvents; +import me.confuser.banmanager.common.data.*; + +public class BanListener { + + private final CommonBanListener listener; + + public BanListener(BanManagerPlugin plugin) { + this.listener = new CommonBanListener(plugin); + + BanManagerEvents.PLAYER_BANNED_EVENT.register(this::notifyOnBan); + BanManagerEvents.IP_BANNED_EVENT.register(this::notifyOnIpBan); + BanManagerEvents.IP_RANGE_BANNED_EVENT.register(this::notifyOnIpRangeBan); + BanManagerEvents.NAME_BANNED_EVENT.register(this::notifyOnNameBan); + } + + private void notifyOnBan(PlayerBanData banData, boolean silent) { + listener.notifyOnBan(banData, silent); + } + + private void notifyOnIpBan(IpBanData banData, boolean silent) { + listener.notifyOnBan(banData, silent); + } + + private void notifyOnIpRangeBan(IpRangeBanData banData, boolean silent) { + listener.notifyOnBan(banData, silent); + } + + private void notifyOnNameBan(NameBanData banData, boolean silent) { + listener.notifyOnBan(banData, silent); + } +} diff --git a/fabric/src/main/java/me/confuser/banmanager/fabric/listeners/ChatListener.java b/fabric/src/main/java/me/confuser/banmanager/fabric/listeners/ChatListener.java new file mode 100644 index 000000000..b7041ef89 --- /dev/null +++ b/fabric/src/main/java/me/confuser/banmanager/fabric/listeners/ChatListener.java @@ -0,0 +1,45 @@ +package me.confuser.banmanager.fabric.listeners; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.CommonPlayer; +import me.confuser.banmanager.common.listeners.CommonChatHandler; +import me.confuser.banmanager.common.listeners.CommonChatListener; +import net.fabricmc.fabric.api.message.v1.ServerMessageEvents; + +public class ChatListener { + private final CommonChatListener listener; + + public ChatListener(BanManagerPlugin plugin) { + this.listener = new CommonChatListener(plugin); + + ServerMessageEvents.ALLOW_CHAT_MESSAGE.register((message, sender, params) -> { + if (!sender.isPlayer()) { + return true; + } + + CommonPlayer player = plugin.getServer().getPlayer(sender.getUuid()); + ChatHandler handler = new ChatHandler(); + boolean cancelled = listener.onPlayerChat(player, handler, message.getSignedContent()) || listener.onIpChat(player, player.getAddress(), handler, message.getSignedContent()); + + if (handler.isSoftMuted()) { + sender.sendMessageToClient(params.applyChatDecoration(message.getContent()), false); + return false; + } + + return cancelled ? false : true; + }); + } + + @RequiredArgsConstructor + private class ChatHandler implements CommonChatHandler { + @Getter + private boolean isSoftMuted = false; + + @Override + public void handleSoftMute() { + isSoftMuted = true; + } + } +} diff --git a/fabric/src/main/java/me/confuser/banmanager/fabric/listeners/DiscordListener.java b/fabric/src/main/java/me/confuser/banmanager/fabric/listeners/DiscordListener.java new file mode 100644 index 000000000..0cfa1821b --- /dev/null +++ b/fabric/src/main/java/me/confuser/banmanager/fabric/listeners/DiscordListener.java @@ -0,0 +1,100 @@ +package me.confuser.banmanager.fabric.listeners; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.listeners.CommonDiscordListener; +import me.confuser.banmanager.fabric.BanManagerEvents; +import me.confuser.banmanager.common.data.*; + +public class DiscordListener { + + private final CommonDiscordListener listener; + + public DiscordListener(BanManagerPlugin plugin) { + this.listener = new CommonDiscordListener(plugin); + + BanManagerEvents.PLAYER_BANNED_EVENT.register(this::notifyOnBan); + BanManagerEvents.PLAYER_MUTED_EVENT.register(this::notifyOnMute); + BanManagerEvents.IP_BANNED_EVENT.register(this::notifyOnBan); + BanManagerEvents.PLAYER_KICKED_EVENT.register(this::notifyOnKick); + BanManagerEvents.PLAYER_WARNED_EVENT.register(this::notifyOnWarn); + BanManagerEvents.PLAYER_UNBAN_EVENT.register(this::notifyOnUnban); + BanManagerEvents.IP_UNBAN_EVENT.register(this::notifyOnUnban); + BanManagerEvents.PLAYER_UNMUTE_EVENT.register(this::notifyOnUnmute); + BanManagerEvents.PLAYER_REPORTED_EVENT.register(this::notifyOnReport); + } + + private void notifyOnBan(PlayerBanData banData, boolean silent) { + Object[] data = listener.notifyOnBan(banData); + + if (silent && (boolean) data[2]) return; + + send(data); + } + + private void notifyOnMute(PlayerMuteData muteData, boolean silent) { + Object[] data = listener.notifyOnMute(muteData); + + if (silent && (boolean) data[2]) return; + + send(data); + } + + private void notifyOnBan(IpBanData banData, boolean silent) { + Object[] data = listener.notifyOnBan(banData); + + if (silent && (boolean) data[2]) return; + + send(data); + } + + private void notifyOnKick(PlayerKickData kickData, boolean silent) { + Object[] data = listener.notifyOnKick(kickData); + + if (silent && (boolean) data[2]) return; + + send(data); + } + + private void notifyOnWarn(PlayerWarnData warnData, boolean silent) { + Object[] data = listener.notifyOnWarn(warnData); + + if (silent && (boolean) data[2]) return; + + send(data); + } + + private void notifyOnUnban(PlayerBanData banData, PlayerData actor, String reason) { + Object[] data = listener.notifyOnUnban(banData, actor, reason); + + send(data); + } + + private void notifyOnUnban(IpBanData banData, PlayerData actor, String reason) { + Object[] data = listener.notifyOnUnban(banData, actor, reason); + + send(data); + } + + private void notifyOnUnmute(PlayerMuteData muteData, PlayerData actor, String reason) { + Object[] data = listener.notifyOnUnmute(muteData, actor, reason); + + send(data); + } + + private void notifyOnReport(PlayerReportData reportData, boolean silent) { + Object[] data = listener.notifyOnReport(reportData, reportData.getActor(), reportData.getReason()); + + if (silent && (boolean) data[2]) return; + + send(data); + } + + private void send(Object[] data) { + String url = (String) data[0]; + String payload = (String) data[1]; + + if (url == null || payload == null || url.isEmpty() || payload.isEmpty()) return; + + listener.send(url, payload); + } +} diff --git a/fabric/src/main/java/me/confuser/banmanager/fabric/listeners/HookListener.java b/fabric/src/main/java/me/confuser/banmanager/fabric/listeners/HookListener.java new file mode 100644 index 000000000..5ce33c4b8 --- /dev/null +++ b/fabric/src/main/java/me/confuser/banmanager/fabric/listeners/HookListener.java @@ -0,0 +1,107 @@ +package me.confuser.banmanager.fabric.listeners; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.listeners.CommonHooksListener; +import me.confuser.banmanager.fabric.BanManagerEvents; +import me.confuser.banmanager.common.data.*; + +public class HookListener { + + private final CommonHooksListener listener; + + public HookListener(BanManagerPlugin plugin) { + this.listener = new CommonHooksListener(plugin); + + BanManagerEvents.PLAYER_BAN_EVENT.register(this::onBan); + BanManagerEvents.PLAYER_BANNED_EVENT.register(this::onBan); + BanManagerEvents.PLAYER_UNBAN_EVENT.register(this::onUnban); + BanManagerEvents.PLAYER_MUTE_EVENT.register(this::onMute); + BanManagerEvents.PLAYER_MUTED_EVENT.register(this::onMute); + BanManagerEvents.PLAYER_UNMUTE_EVENT.register(this::onUnmute); + BanManagerEvents.IP_BAN_EVENT.register(this::onBan); + BanManagerEvents.IP_BANNED_EVENT.register(this::onBan); + BanManagerEvents.IP_UNBAN_EVENT.register(this::onUnban); + BanManagerEvents.IP_RANGE_BAN_EVENT.register(this::onBan); + BanManagerEvents.IP_RANGE_BANNED_EVENT.register(this::onBan); + BanManagerEvents.IP_RANGE_UNBAN_EVENT.register(this::onUnban); + BanManagerEvents.PLAYER_WARN_EVENT.register(this::onWarn); + BanManagerEvents.PLAYER_WARNED_EVENT.register(this::onWarn); + BanManagerEvents.PLAYER_NOTE_CREATED_EVENT.register(this::onNote); + BanManagerEvents.PLAYER_REPORT_EVENT.register(this::onReport); + BanManagerEvents.PLAYER_REPORTED_EVENT.register(this::onReport); + } + + private boolean onBan(PlayerBanData banData, BanManagerEvents.SilentValue silent) { + listener.onBan(banData, silent.isSilent()); + return true; + } + + private void onBan(PlayerBanData banData, boolean silent) { + listener.onBan(banData, silent); + } + + private void onUnban(PlayerBanData banData, PlayerData actor, String reason) { + listener.onUnban(banData, actor, reason); + } + + private boolean onMute(PlayerMuteData muteData, BanManagerEvents.SilentValue silent) { + listener.onMute(muteData, silent.isSilent()); + return true; + } + + private void onMute(PlayerMuteData muteData, boolean silent) { + listener.onMute(muteData, silent); + } + + private void onUnmute(PlayerMuteData muteData, PlayerData actor, String reason) { + listener.onUnmute(muteData, actor, reason); + } + + private boolean onBan(IpBanData banData, BanManagerEvents.SilentValue silent) { + listener.onBan(banData, silent.isSilent()); + return true; + } + + private void onBan(IpBanData banData, boolean silent) { + listener.onBan(banData, silent); + } + + private void onUnban(IpBanData banData, PlayerData actor, String reason) { + listener.onUnban(banData, actor, reason); + } + + private boolean onBan(IpRangeBanData banData, BanManagerEvents.SilentValue silent) { + listener.onBan(banData, silent.isSilent()); + return true; + } + + private void onBan(IpRangeBanData banData, boolean silent) { + listener.onBan(banData, silent); + } + + private void onUnban(IpRangeBanData banData, PlayerData actor, String reason) { + listener.onUnban(banData, actor, reason); + } + + private boolean onWarn(PlayerWarnData warnData, BanManagerEvents.SilentValue silent) { + listener.onWarn(warnData, silent.isSilent()); + return true; + } + + private void onWarn(PlayerWarnData warnData, boolean silent) { + listener.onWarn(warnData, silent); + } + + private void onNote(PlayerNoteData noteData) { + listener.onNote(noteData); + } + + private boolean onReport(PlayerReportData reportData, BanManagerEvents.SilentValue silent) { + listener.onReport(reportData, silent.isSilent()); + return true; + } + + private void onReport(PlayerReportData reportData, boolean silent) { + listener.onReport(reportData, silent); + } +} diff --git a/fabric/src/main/java/me/confuser/banmanager/fabric/listeners/JoinListener.java b/fabric/src/main/java/me/confuser/banmanager/fabric/listeners/JoinListener.java new file mode 100644 index 000000000..7702f7370 --- /dev/null +++ b/fabric/src/main/java/me/confuser/banmanager/fabric/listeners/JoinListener.java @@ -0,0 +1,88 @@ +package me.confuser.banmanager.fabric.listeners; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.listeners.CommonJoinHandler; +import me.confuser.banmanager.common.listeners.CommonJoinListener; +import me.confuser.banmanager.common.util.IPUtils; +import me.confuser.banmanager.common.util.Message; +import me.confuser.banmanager.fabric.FabricPlayer; +import me.confuser.banmanager.fabric.FabricServer; +import net.fabricmc.fabric.api.networking.v1.ServerLoginConnectionEvents; +import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents; +import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.network.ServerLoginNetworkHandler; +import net.minecraft.server.network.ServerPlayNetworkHandler; +import net.minecraft.text.Text; + +public class JoinListener { + private final CommonJoinListener listener; + private BanManagerPlugin plugin; + + public JoinListener(BanManagerPlugin plugin) { + this.plugin = plugin; + this.listener = new CommonJoinListener(plugin); + + ServerPlayConnectionEvents.INIT.register((handler, server) -> { + BanJoinHandler banJoinHandler = new BanJoinHandler(plugin, handler); + + listener.banCheck(handler.getPlayer().getUuid(), handler.getPlayer().getName().getString(), + IPUtils.toIPAddress(handler.getPlayer().getIp()), banJoinHandler); + + if (!banJoinHandler.isDenied()) { + listener.onPreJoin(handler.getPlayer().getUuid(), handler.getPlayer().getName().getString(), + IPUtils.toIPAddress(handler.getPlayer().getIp())); + } + }); + + ServerPlayConnectionEvents.JOIN.register((handler, sender, server) -> { + listener.onJoin( + new FabricPlayer(handler.getPlayer(), handler.getPlayer().getServer(), plugin.getConfig().isOnlineMode())); + + listener.onPlayerLogin( + new FabricPlayer(handler.getPlayer(), handler.getPlayer().getServer(), plugin.getConfig().isOnlineMode()), + new LoginHandler(handler.getPlayer())); + }); + } + + @RequiredArgsConstructor + private class BanJoinHandler implements CommonJoinHandler { + private final BanManagerPlugin plugin; + private final ServerPlayNetworkHandler handler; + @Getter + private boolean isDenied = false; + + @Override + public void handlePlayerDeny(PlayerData player, Message message) { + plugin.getServer().callEvent("PlayerDeniedEvent", player, message); + + handleDeny(message); + } + + @Override + public void handleDeny(Message message) { + isDenied = true; + + handler.disconnect(FabricServer.formatMessage(message)); + } + } + + @RequiredArgsConstructor + private class LoginHandler implements CommonJoinHandler { + private final ServerPlayerEntity player; + + @Override + public void handlePlayerDeny(PlayerData player, Message message) { + handleDeny(message); + } + + @Override + public void handleDeny(Message message) { + player.networkHandler.disconnect(FabricServer.formatMessage(message)); + } + } +} diff --git a/fabric/src/main/java/me/confuser/banmanager/fabric/listeners/LeaveListener.java b/fabric/src/main/java/me/confuser/banmanager/fabric/listeners/LeaveListener.java new file mode 100644 index 000000000..efca55d2c --- /dev/null +++ b/fabric/src/main/java/me/confuser/banmanager/fabric/listeners/LeaveListener.java @@ -0,0 +1,19 @@ +package me.confuser.banmanager.fabric.listeners; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.listeners.CommonLeaveListener; +import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents; +import net.minecraft.server.network.ServerPlayerEntity; + +public class LeaveListener { + private final CommonLeaveListener listener; + + public LeaveListener(BanManagerPlugin plugin) { + this.listener = new CommonLeaveListener(plugin); + + ServerPlayConnectionEvents.DISCONNECT.register((handler, server) -> { + ServerPlayerEntity player = handler.getPlayer(); + listener.onLeave(player.getUuid(), player.getName().getString()); + }); + } +} diff --git a/fabric/src/main/java/me/confuser/banmanager/fabric/listeners/MuteListener.java b/fabric/src/main/java/me/confuser/banmanager/fabric/listeners/MuteListener.java new file mode 100644 index 000000000..d2d0a31c2 --- /dev/null +++ b/fabric/src/main/java/me/confuser/banmanager/fabric/listeners/MuteListener.java @@ -0,0 +1,26 @@ +package me.confuser.banmanager.fabric.listeners; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.listeners.CommonMuteListener; +import me.confuser.banmanager.fabric.BanManagerEvents; +import me.confuser.banmanager.common.data.*; + +public class MuteListener { + + private final CommonMuteListener listener; + + public MuteListener(BanManagerPlugin plugin) { + this.listener = new CommonMuteListener(plugin); + + BanManagerEvents.PLAYER_MUTED_EVENT.register(this::notifyOnMute); + BanManagerEvents.IP_MUTED_EVENT.register(this::notifyOnIpMute); + } + + private void notifyOnMute(PlayerMuteData muteData, boolean silent) { + listener.notifyOnMute(muteData, silent); + } + + private void notifyOnIpMute(IpMuteData muteData, boolean silent) { + listener.notifyOnMute(muteData, silent); + } +} diff --git a/fabric/src/main/java/me/confuser/banmanager/fabric/listeners/NoteListener.java b/fabric/src/main/java/me/confuser/banmanager/fabric/listeners/NoteListener.java new file mode 100644 index 000000000..eb04b94a1 --- /dev/null +++ b/fabric/src/main/java/me/confuser/banmanager/fabric/listeners/NoteListener.java @@ -0,0 +1,21 @@ +package me.confuser.banmanager.fabric.listeners; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.listeners.CommonNoteListener; +import me.confuser.banmanager.fabric.BanManagerEvents; +import me.confuser.banmanager.common.data.PlayerNoteData; + +public class NoteListener { + + private final CommonNoteListener listener; + + public NoteListener(BanManagerPlugin plugin) { + this.listener = new CommonNoteListener(plugin); + + BanManagerEvents.PLAYER_NOTE_CREATED_EVENT.register(this::notifyOnNote); + } + + private void notifyOnNote(PlayerNoteData noteData) { + listener.notifyOnNote(noteData); + } +} diff --git a/fabric/src/main/java/me/confuser/banmanager/fabric/listeners/ReportListener.java b/fabric/src/main/java/me/confuser/banmanager/fabric/listeners/ReportListener.java new file mode 100644 index 000000000..a8b35993b --- /dev/null +++ b/fabric/src/main/java/me/confuser/banmanager/fabric/listeners/ReportListener.java @@ -0,0 +1,70 @@ +package me.confuser.banmanager.fabric.listeners; + +import java.sql.SQLException; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.CommonPlayer; +import me.confuser.banmanager.common.listeners.CommonReportListener; +import me.confuser.banmanager.common.util.UUIDUtils; +import me.confuser.banmanager.fabric.BMFabricPlugin; +import me.confuser.banmanager.fabric.BanManagerEvents; +import me.confuser.banmanager.fabric.FabricServer; +import me.confuser.banmanager.fabric.BanManagerEvents.SilentValue; +import net.minecraft.server.network.ServerPlayerEntity; +import me.confuser.banmanager.common.data.*; + +public class ReportListener { + + private final CommonReportListener listener; + private FabricServer server; + private BanManagerPlugin plugin; + + public ReportListener(BanManagerPlugin plugin, FabricServer server) { + this.listener = new CommonReportListener(plugin); + this.plugin = plugin; + this.server = server; + + BanManagerEvents.PLAYER_REPORT_EVENT.register(this::notifyOnReport); + BanManagerEvents.PLAYER_REPORTED_EVENT.register(this::notifyOnReported); + BanManagerEvents.PLAYER_REPORT_DELETED_EVENT.register(this::notifyOnReportDeleted); + } + + private boolean notifyOnReport(PlayerReportData data, SilentValue silent) { + listener.notifyOnReport(data); + + return true; + } + + private void notifyOnReported(PlayerReportData reportData, boolean silent) { + ServerPlayerEntity player = this.server.getServer().getPlayerManager().getPlayer(reportData.getPlayer().getUUID()); + ServerPlayerEntity actor = this.server.getServer().getPlayerManager().getPlayer(reportData.getActor().getUUID()); + + try { + createLocation(reportData, player, reportData.getPlayer()); + } catch (SQLException e) { + e.printStackTrace(); + } + + try { + createLocation(reportData, actor, reportData.getActor()); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + private void notifyOnReportDeleted(PlayerReportData reportData) { + listener.deleteReferences(reportData); + } + + private void createLocation(PlayerReportData report, ServerPlayerEntity player, PlayerData playerData) + throws SQLException { + if (player == null || playerData == null) + return; + + plugin.getPlayerReportLocationStorage() + .create(new PlayerReportLocationData(report, playerData, + player.getWorld().getRegistryKey().getValue().toString(), player.getX(), player.getY(), player + .getZ(), + player.getPitch(), player.getYaw())); + } +} diff --git a/fabric/src/main/java/me/confuser/banmanager/fabric/mixin/BanCommandMixin.java b/fabric/src/main/java/me/confuser/banmanager/fabric/mixin/BanCommandMixin.java new file mode 100644 index 000000000..543791945 --- /dev/null +++ b/fabric/src/main/java/me/confuser/banmanager/fabric/mixin/BanCommandMixin.java @@ -0,0 +1,14 @@ +package me.confuser.banmanager.fabric.mixin; + +import net.minecraft.server.dedicated.command.BanCommand; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyArg; + +@Mixin(BanCommand.class) +public class BanCommandMixin { + @ModifyArg(method = "register", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/command/CommandManager;literal(Ljava/lang/String;)Lcom/mojang/brigadier/builder/LiteralArgumentBuilder;"), index = 0, require = 0) + private static String banManager_renameCommand(String def) { + return "minecraft:ban"; + } +} diff --git a/fabric/src/main/java/me/confuser/banmanager/fabric/mixin/BanIpCommandMixin.java b/fabric/src/main/java/me/confuser/banmanager/fabric/mixin/BanIpCommandMixin.java new file mode 100644 index 000000000..15bae64d2 --- /dev/null +++ b/fabric/src/main/java/me/confuser/banmanager/fabric/mixin/BanIpCommandMixin.java @@ -0,0 +1,14 @@ +package me.confuser.banmanager.fabric.mixin; + +import net.minecraft.server.dedicated.command.BanIpCommand; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyArg; + +@Mixin(BanIpCommand.class) +public class BanIpCommandMixin { + @ModifyArg(method = "register", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/command/CommandManager;literal(Ljava/lang/String;)Lcom/mojang/brigadier/builder/LiteralArgumentBuilder;"), index = 0, require = 0) + private static String banManager_renameCommand(String def) { + return "minecraft:ban-ip"; + } +} diff --git a/fabric/src/main/java/me/confuser/banmanager/fabric/mixin/KickCommandMixin.java b/fabric/src/main/java/me/confuser/banmanager/fabric/mixin/KickCommandMixin.java new file mode 100644 index 000000000..5747aff57 --- /dev/null +++ b/fabric/src/main/java/me/confuser/banmanager/fabric/mixin/KickCommandMixin.java @@ -0,0 +1,14 @@ +package me.confuser.banmanager.fabric.mixin; + +import net.minecraft.server.command.KickCommand; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyArg; + +@Mixin(KickCommand.class) +public class KickCommandMixin { + @ModifyArg(method = "register", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/command/CommandManager;literal(Ljava/lang/String;)Lcom/mojang/brigadier/builder/LiteralArgumentBuilder;"), index = 0, require = 0) + private static String banManager_renameCommand(String def) { + return "minecraft:kick"; + } +} diff --git a/fabric/src/main/java/me/confuser/banmanager/fabric/mixin/PardonCommandMixin.java b/fabric/src/main/java/me/confuser/banmanager/fabric/mixin/PardonCommandMixin.java new file mode 100644 index 000000000..680dfe32e --- /dev/null +++ b/fabric/src/main/java/me/confuser/banmanager/fabric/mixin/PardonCommandMixin.java @@ -0,0 +1,14 @@ +package me.confuser.banmanager.fabric.mixin; + +import net.minecraft.server.dedicated.command.PardonCommand; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyArg; + +@Mixin(PardonCommand.class) +public class PardonCommandMixin { + @ModifyArg(method = "register", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/command/CommandManager;literal(Ljava/lang/String;)Lcom/mojang/brigadier/builder/LiteralArgumentBuilder;"), index = 0, require = 0) + private static String banManager_renameCommand(String def) { + return "minecraft:pardon"; + } +} diff --git a/fabric/src/main/java/me/confuser/banmanager/fabric/mixin/ServerPlayerNetworkHandlerMixin.java b/fabric/src/main/java/me/confuser/banmanager/fabric/mixin/ServerPlayerNetworkHandlerMixin.java new file mode 100644 index 000000000..330ba8c62 --- /dev/null +++ b/fabric/src/main/java/me/confuser/banmanager/fabric/mixin/ServerPlayerNetworkHandlerMixin.java @@ -0,0 +1,38 @@ +package me.confuser.banmanager.fabric.mixin; + +import net.minecraft.network.message.LastSeenMessageList; +import net.minecraft.network.packet.c2s.play.ChatCommandSignedC2SPacket; +import net.minecraft.network.packet.c2s.play.ChatMessageC2SPacket; +import net.minecraft.network.packet.c2s.play.CommandExecutionC2SPacket; +import net.minecraft.server.network.ServerPlayNetworkHandler; +import net.minecraft.server.network.ServerPlayerEntity; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.listeners.CommonCommandListener; + +@Mixin(ServerPlayNetworkHandler.class) +public abstract class ServerPlayerNetworkHandlerMixin { + @Shadow + public ServerPlayerEntity player; + + @Shadow + public abstract ServerPlayerEntity getPlayer(); + + @Inject(method = "handleCommandExecution", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/message/SignedCommandArguments$Impl;(Ljava/util/Map;)V"), cancellable = true) + private void banManager_checkCommand(ChatCommandSignedC2SPacket packet, LastSeenMessageList lastSeenMessages, CallbackInfo ci) { + // Split the command + String[] args = packet.command().split(" ", 6); + // Get rid of the first / + String cmd = args[0].replace("/", "").toLowerCase(); + + if (new CommonCommandListener(BanManagerPlugin.getInstance()).onCommand(BanManagerPlugin.getInstance().getServer().getPlayer(player.getUuid()), cmd, args)) { + ci.cancel(); + } + } + +} diff --git a/fabric/src/main/resources/assets/banmanager/icon.png b/fabric/src/main/resources/assets/banmanager/icon.png new file mode 100644 index 000000000..e068fd5d0 Binary files /dev/null and b/fabric/src/main/resources/assets/banmanager/icon.png differ diff --git a/fabric/src/main/resources/banmanager.mixins.json b/fabric/src/main/resources/banmanager.mixins.json new file mode 100644 index 000000000..389079236 --- /dev/null +++ b/fabric/src/main/resources/banmanager.mixins.json @@ -0,0 +1,15 @@ +{ + "required": true, + "package": "me.confuser.banmanager.fabric.mixin", + "compatibilityLevel": "JAVA_8", + "mixins": [ + "BanCommandMixin", + "BanIpCommandMixin", + "KickCommandMixin", + "PardonCommandMixin", + "ServerPlayerNetworkHandlerMixin" + ], + "injectors": { + "defaultRequire": 1 + } +} diff --git a/fabric/src/main/resources/config.yml b/fabric/src/main/resources/config.yml new file mode 120000 index 000000000..0ec37eb0f --- /dev/null +++ b/fabric/src/main/resources/config.yml @@ -0,0 +1 @@ +../../../../common/src/main/resources/config.yml \ No newline at end of file diff --git a/fabric/src/main/resources/console.yml b/fabric/src/main/resources/console.yml new file mode 120000 index 000000000..a8f6e418d --- /dev/null +++ b/fabric/src/main/resources/console.yml @@ -0,0 +1 @@ +../../../../common/src/main/resources/console.yml \ No newline at end of file diff --git a/fabric/src/main/resources/discord.yml b/fabric/src/main/resources/discord.yml new file mode 120000 index 000000000..47e298730 --- /dev/null +++ b/fabric/src/main/resources/discord.yml @@ -0,0 +1 @@ +../../../../common/src/main/resources/discord.yml \ No newline at end of file diff --git a/fabric/src/main/resources/exemptions.yml b/fabric/src/main/resources/exemptions.yml new file mode 120000 index 000000000..1d233142d --- /dev/null +++ b/fabric/src/main/resources/exemptions.yml @@ -0,0 +1 @@ +../../../../common/src/main/resources/exemptions.yml \ No newline at end of file diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json new file mode 100644 index 000000000..0fb2312b3 --- /dev/null +++ b/fabric/src/main/resources/fabric.mod.json @@ -0,0 +1,43 @@ +{ + "schemaVersion": 1, + "id": "banmanager", + "version": "${internalVersion}", + "name": "BanManager", + "description": "A database driven punishment system", + "authors": [ + { + "name": "confuser", + "contact": { + "sources": "https://github.com/confuser", + "homepage": "https://banmanagement.com" + } + } + ], + "contact": { + "homepage": "https://banmanagement.com", + "sources": "https://github.com/BanManagement/BanManager", + "issues": "https://github.com/BanManagement/BanManager/issues" + }, + "icon": "assets/banmanager/icon.png", + "license": "CC-BY-NC-SA-2.0-UK", + "environment": "server", + "entrypoints": { + "server": [ + "${mainPath}" + ] + }, + "mixins": [ + "banmanager.mixins.json" + ], + "depends": { + "fabricloader": ">=0.9.0", + "fabric-api-base": "*", + "fabric-command-api-v2": "*", + "fabric-events-interaction-v0": "*", + "fabric-lifecycle-events-v1": "*", + "fabric-message-api-v1": "*", + "fabric-networking-api-v1": "*", + "fabric-permissions-api-v0": ">=0.3.1", + "minecraft": ">=1.21" + } +} diff --git a/fabric/src/main/resources/geoip.yml b/fabric/src/main/resources/geoip.yml new file mode 120000 index 000000000..513da3e88 --- /dev/null +++ b/fabric/src/main/resources/geoip.yml @@ -0,0 +1 @@ +../../../../common/src/main/resources/geoip.yml \ No newline at end of file diff --git a/fabric/src/main/resources/messages.yml b/fabric/src/main/resources/messages.yml new file mode 120000 index 000000000..2da3a2d0a --- /dev/null +++ b/fabric/src/main/resources/messages.yml @@ -0,0 +1 @@ +../../../../common/src/main/resources/messages.yml \ No newline at end of file diff --git a/fabric/src/main/resources/plugin.yml b/fabric/src/main/resources/plugin.yml new file mode 120000 index 000000000..f5f9ffb40 --- /dev/null +++ b/fabric/src/main/resources/plugin.yml @@ -0,0 +1 @@ +../../../../common/src/main/resources/plugin.yml \ No newline at end of file diff --git a/fabric/src/main/resources/reasons.yml b/fabric/src/main/resources/reasons.yml new file mode 120000 index 000000000..bc3554b6d --- /dev/null +++ b/fabric/src/main/resources/reasons.yml @@ -0,0 +1 @@ +../../../../common/src/main/resources/reasons.yml \ No newline at end of file diff --git a/fabric/src/main/resources/schedules.yml b/fabric/src/main/resources/schedules.yml new file mode 120000 index 000000000..bfc79950e --- /dev/null +++ b/fabric/src/main/resources/schedules.yml @@ -0,0 +1 @@ +../../../../common/src/main/resources/schedules.yml \ No newline at end of file diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 000000000..1de852dc0 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,6 @@ +group=me.confuser.banmanager +version=7.10.0-SNAPSHOT +org.gradle.parallel=true +description="The defacto plugin for Minecraft to manage punishments and moderate more effectively" + +org.gradle.jvmargs=-Xmx2G diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 000000000..7454180f2 Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 000000000..d6e308a63 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100755 index 000000000..1b6c78733 --- /dev/null +++ b/gradlew @@ -0,0 +1,234 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +APP_NAME="Gradle" +APP_BASE_NAME=${0##*/} + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100755 index 000000000..107acd32c --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/libs/build.gradle.kts b/libs/build.gradle.kts new file mode 100644 index 000000000..dfcc0bb2b --- /dev/null +++ b/libs/build.gradle.kts @@ -0,0 +1,110 @@ +import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar + +applyLibrariesConfiguration() + +dependencies { + "shade"("net.kyori:adventure-text-serializer-legacy:${Versions.ADVENTURE}") + "shade"("net.kyori:adventure-text-serializer-gson:${Versions.ADVENTURE}") + "shade"("net.kyori:adventure-api:${Versions.ADVENTURE}") + "shade"("net.kyori:examination-api:1.3.0") + + "shade"("com.j256.ormlite:ormlite-core:5.1") + "shade"("com.j256.ormlite:ormlite-jdbc:5.1") + + "shade"("com.zaxxer:HikariCP:4.0.3") + "shade"("org.mariadb.jdbc:mariadb-java-client:2.7.4") + "shade"("mysql:mysql-connector-java:8.0.27") + "shade"("com.googlecode.concurrent-trees:concurrent-trees:2.4.0") + "shade"("com.maxmind.db:maxmind-db-gson:2.0.3") + + "shade"("org.yaml:snakeyaml:1.29") + "shade"("com.google.code.gson:gson:2.3.1") + "shade"("com.github.spullara.cli-parser:cli-parser:1.1.5") + "shade"("com.google.guava:guava:21.0") + + "shade"("org.apache.commons:commons-compress:1.19") + "shade"("com.github.seancfoley:ipaddress:5.3.4") + "shade"("com.h2database:h2:1.4.200") +} + +tasks.withType() { + duplicatesStrategy = DuplicatesStrategy.WARN +} + +tasks.named("jar") { + duplicatesStrategy = DuplicatesStrategy.WARN + + dependencies { + relocate("net.kyori.adventure", "me.confuser.banmanager.common.kyori") { + include(dependency("net.kyori:adventure-text-serializer-legacy")) + include(dependency("net.kyori:adventure-text-serializer-gson")) + include(dependency("net.kyori:adventure-api")) + include(dependency("net.kyori:adventure-key")) + } + + relocate("net.kyori.examination", "me.confuser.banmanager.common.kyori.examination") { + include(dependency("net.kyori:examination-api")) + } + + relocate("org.yaml.snakeyaml", "me.confuser.banmanager.common.snakeyaml") { + include(dependency("org.yaml:snakeyaml")) + } + + relocate("inet.ipaddr", "me.confuser.banmanager.common.ipaddr") { + include(dependency("com.github.seancfoley:ipaddress")) + } + + relocate("org.h2", "me.confuser.banmanager.common.h2") { + include(dependency("com.h2database:h2")) + } + + relocate("com.j256.ormlite", "me.confuser.banmanager.common.ormlite") { + include(dependency("com.j256.ormlite:ormlite-core:5.1")) + include(dependency("com.j256.ormlite:ormlite-jdbc:5.1")) + } + + relocate("com.zaxxer.hikari", "me.confuser.banmanager.common.hikari") { + include(dependency("com.zaxxer:HikariCP")) + } + + relocate("org.mariadb.jdbc", "me.confuser.banmanager.common.mariadb") { + include(dependency("org.mariadb.jdbc:mariadb-java-client")) + } + + relocate("com.mysql", "me.confuser.banmanager.common.mysql") { + include(dependency("mysql:mysql-connector-java")) + } + + relocate("com.google.gson", "me.confuser.banmanager.common.gson") { + include(dependency("com.google.code.gson:gson")) + } + + relocate("org.apache.commons", "me.confuser.banmanager.common.apachecommons") { + include(dependency("org.apache.commons:commons-compress")) + } + + relocate("com.google.common", "me.confuser.banmanager.common.google.guava") { + include(dependency("com.google.guava:guava")) + } + + relocate("com.googlecode.concurrenttrees", "me.confuser.banmanager.common.google.concurrenttrees") { + include(dependency("com.googlecode.concurrent-trees:concurrent-trees")) + } + + relocate("com.sampullara.cli", "me.confuser.banmanager.common.cli") { + include(dependency("com.github.spullara.cli-parser:cli-parser")) + } + + relocate("com.maxmind", "me.confuser.banmanager.common.maxmind") { + include(dependency("com.maxmind.db:maxmind-db-gson")) + } + } + + exclude("GradleStart**") + exclude(".cache"); + exclude("LICENSE*") + exclude("META-INF/services/**") + exclude("META-INF/maven/**") + exclude("org/intellij/**") + exclude("org/jetbrains/**") +} diff --git a/pom.xml b/pom.xml deleted file mode 100644 index ae841a027..000000000 --- a/pom.xml +++ /dev/null @@ -1,237 +0,0 @@ - - 4.0.0 - me.confuser - BanManager - 6.0.0-SNAPSHOT - BanManager - A database driven ban system - - ${project.artifactId} - - - . - true - ${basedir}/src/main/resources/ - - *.yml - - - - - - org.apache.maven.plugins - maven-compiler-plugin - 2.3.2 - - 1.8 - 1.8 - - - - org.apache.maven.plugins - maven-shade-plugin - 2.4.3 - - - package - - shade - - - true - - - me.confuser.bukkitutil - me.confuser.banmanager.bukkitutil - - - com.j256.ormlite - me.confuser.banmanager.internal.ormlite - - - com.zaxxer.hikari - me.confuser.banmanager.internal.hikari - - - org.slf4j - me.confuser.banmanager.internal.sl4j - - - com.googlecode.concurrenttrees - me.confuser.banmanager.internal.concurrenttrees - - - net.gravitydevelopment.updater - me.confuser.banmanager.updater - - - com.google.gson - me.confuser.banmanager.internal.gson - - - org.apache.commons.net - me.confuser.banmanager.internal.commons.net - - - com.google.common - me.confuser.banmanager.internal.guava - - - com.sampullara.cli - me.confuser.banmanager.internal.cli - - - com.maxmind - me.confuser.banmanager.internal.maxmind - - - com.fasterxml.jackson - me.confuser.banmanager.internal.jackson - - - org.apache.http - me.confuser.banmanager.internal.http - - - org.apache.commons.codec - me.confuser.banmanager.internal.commons.codec - - - javax.annotation - me.confuser.banmanager.internal.jaxax.annotation - - - me.rayzr522.jsonmessage - me.confuser.banmanager.internal.jsonmessage - - - - - - - - - - - spigot-repo - https://hub.spigotmc.org/nexus/content/repositories/snapshots/ - - - dustplanet-releases - https://repo.dustplanet.de/artifactory/libs-release-local - - - confuser-repo - https://ci.frostcast.net/plugin/repository/everything - - - Central - https://repo1.maven.org/maven2 - - - rayzr-repo - https://cdn.rawgit.com/Rayzr522/maven-repo/master/ - - - - - com.google.guava - guava - 17.0 - - - org.bukkit - bukkit - 1.8-R0.1-SNAPSHOT - provided - - - com.j256.ormlite - ormlite-core - 4.48 - - - com.j256.ormlite - ormlite-jdbc - 4.48 - - - com.zaxxer - HikariCP - 3.3.1 - - - org.slf4j - slf4j-simple - 1.6.4 - - - me.confuser - BukkitPluginUtil - 1.7.0 - - - com.googlecode.concurrent-trees - concurrent-trees - 2.4.0 - - - org.projectlombok - lombok - 1.18.6 - provided - - - net.gravitydevelopment.updater - updater - 3.0.3 - - - com.google.code.gson - gson - 2.3.1 - - - commons-net - commons-net - 3.3 - - - com.github.spullara.cli-parser - cli-parser - 1.1.2 - - - com.maxmind.geoip2 - geoip2 - 2.2.0 - - - me.rayzr522 - jsonmessage - 1.0.0 - - - junit - junit - 4.12 - test - - - org.powermock - powermock-module-junit4 - 2.0.2 - test - - - org.powermock - powermock-api-mockito2 - 2.0.2 - test - - - - UTF-8 - - diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 000000000..ff07cc403 --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,17 @@ +rootProject.name = "BanManager" + +include(":BanManagerCommon") +include(":BanManagerBukkit") +include(":BanManagerBungee") +include(":BanManagerSponge") +include(":BanManagerLibs") +include(":BanManagerVelocity") +include(":BanManagerFabric") + +project(":BanManagerCommon").projectDir = file("common") +project(":BanManagerBukkit").projectDir = file("bukkit") +project(":BanManagerBungee").projectDir = file("bungee") +project(":BanManagerSponge").projectDir = file("sponge") +project(":BanManagerLibs").projectDir = file("libs") +project(":BanManagerVelocity").projectDir = file("velocity") +project(":BanManagerFabric").projectDir = file("fabric") diff --git a/sponge/build.gradle.kts b/sponge/build.gradle.kts new file mode 100644 index 000000000..ab2f83d0f --- /dev/null +++ b/sponge/build.gradle.kts @@ -0,0 +1,180 @@ +import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar +import org.spongepowered.gradle.plugin.config.PluginLoaders +import org.spongepowered.plugin.metadata.model.PluginDependency + + +plugins { + `java-library` + id("org.spongepowered.gradle.plugin") + id("net.kyori.blossom") version "1.2.0" + `maven-publish` + signing +} + +applyPlatformAndCoreConfiguration() +applyShadowConfiguration() + +publishing { + publications { + create("mavenJava") { + from(components["java"]) + + pom { + name.set("BanManagerSponge") + description.set("BanManager for Sponge") + url.set("https://github.com/BanManagement/BanManager/") + licenses { + license { + name.set("Creative Commons Attribution-NonCommercial-ShareAlike 2.0 UK: England & Wales") + url.set("https://github.com/BanManagement/BanManager/blob/master/LICENCE") + } + } + developers { + developer { + id.set("confuser>") + name.set("James Mortemore") + email.set("jamesmortemore@gmail.com") + } + } + scm { + connection.set("scm:git:git://github.com/BanManagement/BanManager.git") + developerConnection.set("scm:git:ssh://git@github.com/BanManagement/BanManager.git") + url.set("https://github.com/BanManagement/BanManager/") + } + } + } + } +} + +signing { + if (project.findProperty("signingKey")?.toString()?.toBoolean() == true) { + useInMemoryPgpKeys(findProperty("signingKey")?.toString(), findProperty("signingPassword")?.toString()) + + sign(publishing.publications["mavenJava"]) + } +} + +blossom { + replaceToken("@projectVersion@", project.ext["internalVersion"]) +} + +sponge { + apiVersion("7.2.0") + loader { + name(PluginLoaders.JAVA_PLAIN) + version("1.0") + } + + license("Creative Commons Attribution-NonCommercial-ShareAlike 2.0 UK: England & Wales") + + plugin("banmanager") { + displayName("BanManager") + entrypoint("me.confuser.banmanager.sponge.BMSpongePlugin") + description("A database driven punishment system") + links { + homepage("https://banmanagement.com/") + source("https://github.com/BanManagment/BanManager") + issues("https://github.com/BanManagment/BanManager") + } + contributor("confuser") { + description("Lead Developer") + } + dependency("spongeapi") { + loadOrder(PluginDependency.LoadOrder.AFTER) + optional(false) + version("7.2.0") + } + } +} + +repositories { + maven { + name = "sponge" + url = uri("https://repo.spongepowered.org/maven/") + } + maven { + name = "jitpack" + url = uri("https://jitpack.io/") + metadataSources { + artifact() //Look directly for artifact + } + } + maven { + name = "jcenter" + url = uri("https://jcenter.bintray.com/") + } +} + +configurations { + compileClasspath.get().extendsFrom(create("shadeOnly")) +} + +dependencies { + compileOnly("org.spongepowered:spongeapi:7.2.0") + + api(project(":BanManagerCommon")) { + isTransitive = true + } + "shadeOnly"("org.bstats:bstats-sponge:2.2.1") +} + +val javaTarget = 8 // Sponge targets a minimum of Java 8 +java { + sourceCompatibility = JavaVersion.toVersion(javaTarget) + targetCompatibility = JavaVersion.toVersion(javaTarget) +} + +tasks.named("processResources") { + val internalVersion = project.ext["internalVersion"] + + inputs.property("internalVersion", internalVersion) + + filesMatching("plugin.yml") { + expand("internalVersion" to internalVersion, "mainPath" to "me.confuser.banmanager.sponge.BMSpongePlugin") + } +} + +tasks.named("jar") { + val projectVersion = project.version + inputs.property("projectVersion", projectVersion) + manifest { + attributes("Implementation-Version" to projectVersion) + } +} + +tasks.named("shadowJar") { + configurations = listOf(project.configurations["shadeOnly"], project.configurations["runtimeClasspath"]) + + archiveBaseName.set("BanManagerSponge") + archiveClassifier.set("") + archiveVersion.set("") + + dependencies { + include(dependency(":BanManagerCommon")) + include(dependency(":BanManagerLibs")) + include(dependency("org.bstats:.*:.*")) + + relocate("org.bstats", "me.confuser.banmanager.common.bstats") + } + + exclude("GradleStart**") + exclude(".cache"); + exclude("LICENSE*") + exclude("META-INF/services/**") + exclude("META-INF/maven/**") + exclude("META-INF/versions/**") + exclude("org/intellij/**") + exclude("org/jetbrains/**") + exclude("**/module-info.class") + exclude("*.yml") + exclude("assets/banmanager/bungeecord.yml") + exclude("assets/banmanager/velocity.yml") + + minimize { + exclude(dependency("org.bstats:.*:.*")) + } +} + +tasks.named("assemble").configure { + dependsOn("shadowJar") +} diff --git a/sponge/src/main/java/me/confuser/banmanager/sponge/BMSpongePlugin.java b/sponge/src/main/java/me/confuser/banmanager/sponge/BMSpongePlugin.java new file mode 100644 index 000000000..5d487c22b --- /dev/null +++ b/sponge/src/main/java/me/confuser/banmanager/sponge/BMSpongePlugin.java @@ -0,0 +1,247 @@ +package me.confuser.banmanager.sponge; + +import com.google.inject.Inject; +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.CommonLogger; +import me.confuser.banmanager.common.commands.CommonCommand; +import me.confuser.banmanager.common.configs.PluginInfo; +import me.confuser.banmanager.common.configuration.ConfigurationSection; +import me.confuser.banmanager.common.configuration.file.YamlConfiguration; +import me.confuser.banmanager.common.runnables.*; +import me.confuser.banmanager.sponge.listeners.*; +import org.bstats.sponge.Metrics; +import org.slf4j.Logger; +import org.spongepowered.api.Sponge; +import org.spongepowered.api.config.ConfigDir; +import org.spongepowered.api.event.Listener; +import org.spongepowered.api.event.Order; +import org.spongepowered.api.event.game.state.GameLoadCompleteEvent; +import org.spongepowered.api.event.game.state.GamePreInitializationEvent; +import org.spongepowered.api.event.game.state.GameStoppingServerEvent; +import org.spongepowered.api.event.message.MessageChannelEvent; +import org.spongepowered.api.plugin.Plugin; +import org.spongepowered.api.plugin.PluginContainer; +import org.spongepowered.api.plugin.Dependency; + +import java.io.File; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.Reader; +import java.nio.file.Path; +import java.util.HashMap; + +@Plugin( + id = "banmanager", + name = "BanManager", + version = "@projectVersion@", + authors = "confuser", + description = "A punishment plugin", + url = "https://banmanagement.com", + dependencies = {} +) +public class BMSpongePlugin { + + private CommonLogger logger; + private BanManagerPlugin plugin; + private Metrics metrics; + + @Inject + @ConfigDir(sharedRoot = false) + private Path dataFolder; + + @Inject + private PluginContainer pluginContainer; + + private String[] configs = new String[]{ + "config.yml", + "console.yml", + "discord.yml", + "exemptions.yml", + "geoip.yml", + "messages.yml", + "reasons.yml", + "schedules.yml" + }; + + @Inject + public BMSpongePlugin(Logger logger, Metrics.Factory metrics) { + this.logger = new PluginLogger(logger); + this.metrics = metrics.make(6413); + } + + @Listener + public void onDisable(GameStoppingServerEvent event) { + // @TODO Disable scheduled tasks somehow + + if (plugin != null) plugin.disable(); + } + + @Listener + public void onEnable(GamePreInitializationEvent event) { + SpongeServer server = new SpongeServer(); + PluginInfo pluginInfo; + try { + pluginInfo = setupConfigs(); + } catch (IOException e) { + e.printStackTrace(); + return; + } + + this.plugin = new BanManagerPlugin(pluginInfo, this.logger, dataFolder.toFile(), new SpongeScheduler(this), server, new SpongeMetrics(metrics)); + + server.enable(plugin); + + try { + plugin.enable(); + } catch (Exception e) { + logger.severe("Unable to start BanManager"); + e.printStackTrace(); + return; + } + + + setupListeners(); + setupCommands(); + setupRunnables(); + } + + @Listener + public void onStart(GameLoadCompleteEvent event) { + plugin.getLogger().info("The following commands are blocked whilst muted:"); + plugin.getConfig().handleBlockedCommands(plugin, plugin.getConfig().getMutedBlacklistCommands()); + + plugin.getLogger().info("The following commands are blocked whilst soft muted:"); + plugin.getConfig().handleBlockedCommands(plugin, plugin.getConfig().getSoftMutedBlacklistCommands()); + } + + public CommonLogger getLogger() { + return logger; + } + + private PluginInfo setupConfigs() throws IOException { + for (String name : configs) { + File file = new File(dataFolder.toFile(), name); + if (file.exists()) { + // YAMLConfigurationLoader messes with format and makes it unreadable + Reader defConfigStream = new InputStreamReader(pluginContainer.getAsset(name).get().getUrl().openStream()); + + YamlConfiguration conf = YamlConfiguration.loadConfiguration(file); + YamlConfiguration defConfig = YamlConfiguration.loadConfiguration(defConfigStream); + conf.setDefaults(defConfig); + conf.options().copyDefaults(true); + conf.save(file); + } else { + pluginContainer.getAsset(name).get().copyToDirectory(dataFolder); + } + } + + // Load plugin.yml + PluginInfo pluginInfo = new PluginInfo(); + Reader defConfigStream = new InputStreamReader(pluginContainer.getAsset("plugin.yml").get().getUrl().openStream()); + YamlConfiguration conf = YamlConfiguration.loadConfiguration(defConfigStream); + ConfigurationSection commands = conf.getConfigurationSection("commands"); + String pluginName = conf.getString("name"); + + if (!pluginName.equals("BanManager")) { + throw new IOException("Unable to start BanManager as " + pluginName + " has broken resource loading forcing BanManager to load their plugin.yml file; please alert the author to resolve this issue"); + } + + for (String command : commands.getKeys(false)) { + ConfigurationSection cmd = commands.getConfigurationSection(command); + + pluginInfo.setCommand(new PluginInfo.CommandInfo(command, cmd.getString("permission"), cmd.getString("usage"), cmd.getStringList("aliases"))); + } + + return pluginInfo; + } + + public void setupListeners() { + registerEvent(new JoinListener(plugin)); + registerEvent(new LeaveListener(plugin)); + registerEvent(new CommandListener(plugin)); + registerEvent(new HookListener(plugin)); + + String chatPriority = plugin.getConfig().getChatPriority(); + if(!chatPriority.equals("NONE")) { + ChatListener chatListener = new ChatListener(plugin); + + // Map Bukkit EventPriority to Sponge Order + HashMap orders = new HashMap() {{ + put("LOWEST", Order.FIRST); + put("LOW", Order.EARLY); + put("NORMAL", Order.DEFAULT); + put("HIGH", Order.LATE); + put("HIGHEST", Order.LATE); + put("MONITOR", Order.LAST); + }}; + + Order priority = orders.getOrDefault(chatPriority, Order.DEFAULT); + + Sponge.getEventManager().registerListener(this, MessageChannelEvent.Chat.class, priority, chatListener); + } + + if (plugin.getConfig().isDisplayNotificationsEnabled()) { + registerEvent(new BanListener(plugin)); + registerEvent(new MuteListener(plugin)); + registerEvent(new NoteListener(plugin)); + registerEvent(new ReportListener(plugin)); + } + + if (plugin.getDiscordConfig().isHooksEnabled()) { + registerEvent(new DiscordListener(plugin)); + } + } + + private void registerEvent(Object listener) { + Sponge.getEventManager().registerListeners(this, listener); + } + + public void setupCommands() { + for (CommonCommand cmd : plugin.getCommands()) { + new SpongeCommand(this, cmd); + } + + if (plugin.getGlobalConn() != null) { + for (CommonCommand cmd : plugin.getGlobalCommands()) { + new SpongeCommand(this, cmd); + } + } + } + + public void setupRunnables() { + Runner syncRunner; + + if (plugin.getGlobalConn() == null) { + syncRunner = new Runner(new BanSync(plugin), new MuteSync(plugin), new IpSync(plugin), new IpRangeSync(plugin), new ExpiresSync(plugin), + new WarningSync(plugin), new RollbackSync(plugin), new NameSync(plugin)); + } else { + syncRunner = new Runner(new BanSync(plugin), new MuteSync(plugin), new IpSync(plugin), new IpRangeSync(plugin), new ExpiresSync(plugin), + new WarningSync(plugin), new RollbackSync(plugin), new NameSync(plugin), + new GlobalBanSync(plugin), new GlobalMuteSync(plugin), new GlobalIpSync(plugin), new GlobalNoteSync(plugin)); + } + + plugin.setSyncRunner(syncRunner); + + setupAsyncRunnable(10L, syncRunner); + + /* + * This task should be ran last with a 1L offset as it gets modified + * above. + */ + setupAsyncRunnable((plugin.getSchedulesConfig() + .getSchedule("saveLastChecked") * 20L) + 1L, new SaveLastChecked(plugin)); + + // Purge + plugin.getScheduler().runAsync(new Purge(plugin)); + + if (!plugin.getConfig().isCheckForUpdates()) return; + + // @TODO Update checker logic here + } + + private void setupAsyncRunnable(long length, Runnable runnable) { + if (length <= 0) return; + + Sponge.getGame().getScheduler().createTaskBuilder().async().execute(runnable).intervalTicks(length).submit(this); + } +} diff --git a/sponge/src/main/java/me/confuser/banmanager/sponge/PluginLogger.java b/sponge/src/main/java/me/confuser/banmanager/sponge/PluginLogger.java new file mode 100644 index 000000000..82d4a5332 --- /dev/null +++ b/sponge/src/main/java/me/confuser/banmanager/sponge/PluginLogger.java @@ -0,0 +1,25 @@ +package me.confuser.banmanager.sponge; + +import me.confuser.banmanager.common.CommonLogger; +import org.slf4j.Logger; + +public class PluginLogger implements CommonLogger { + + private final Logger logger; + + public PluginLogger(Logger logger) { + this.logger = logger; + } + + public void info(String msg) { + logger.info(msg); + } + + public void warning(String msg) { + logger.warn(msg); + } + + public void severe(String msg) { + logger.error(msg); + } +} diff --git a/sponge/src/main/java/me/confuser/banmanager/sponge/SpongeCommand.java b/sponge/src/main/java/me/confuser/banmanager/sponge/SpongeCommand.java new file mode 100644 index 000000000..f69d9d174 --- /dev/null +++ b/sponge/src/main/java/me/confuser/banmanager/sponge/SpongeCommand.java @@ -0,0 +1,106 @@ +package me.confuser.banmanager.sponge; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.commands.CommonCommand; +import me.confuser.banmanager.common.commands.CommonSender; +import org.spongepowered.api.Sponge; +import org.spongepowered.api.command.CommandCallable; +import org.spongepowered.api.command.CommandResult; +import org.spongepowered.api.command.CommandSource; +import org.spongepowered.api.command.args.ArgumentParseException; +import org.spongepowered.api.command.args.parsing.InputTokenizer; +import org.spongepowered.api.command.args.parsing.SingleArg; +import org.spongepowered.api.entity.living.player.Player; +import org.spongepowered.api.text.Text; +import org.spongepowered.api.world.Location; +import org.spongepowered.api.world.World; + +import java.lang.reflect.InvocationTargetException; +import java.util.Collections; +import java.util.List; +import java.util.Optional; + +public class SpongeCommand implements CommandCallable { + + private BMSpongePlugin plugin; + private CommonCommand command; + private static final InputTokenizer tokeniser = InputTokenizer.spaceSplitString(); + + public SpongeCommand(BMSpongePlugin plugin, CommonCommand command) { + this.plugin = plugin; + this.command = command; + + register(); + } + + public void register() { + Sponge.getCommandManager().register(plugin, this, command.getCommandName()); + } + + @Override + public CommandResult process(CommandSource source, String arguments) { + CommonSender sender = getSender(source); + boolean result = execute(sender, arguments); + + if (!result) { + sender.sendMessage(command.getUsage()); + return CommandResult.empty(); + } + + return CommandResult.success(); + } + + private boolean execute(CommonSender sender, String arguments) { + try { + if (sender.hasPermission(command.getPermission())) { + return this.command.onCommand(sender, this.command.getParser(parseArgs(arguments))); + } else { + sender.sendMessage("&cYou do not have permission to use this command"); + return true; + } + } catch (NoSuchMethodException | IllegalAccessException | InstantiationException | InvocationTargetException | ArgumentParseException e) { + e.printStackTrace(); + } + + return false; + } + + private String[] parseArgs(String arguments) throws ArgumentParseException { + return tokeniser.tokenize(arguments, false).stream().map(SingleArg::getValue).toArray(String[]::new); + } + + @Override + public List getSuggestions(CommandSource source, String arguments, Location targetPosition) { + if (!command.isEnableTabCompletion()) return Collections.emptyList(); + + return command.handlePlayerNameTabComplete(getSender(source), arguments.split(" ")); + } + + private CommonSender getSender(CommandSource source) { + if (source instanceof Player) { + return new SpongePlayer((Player) source, BanManagerPlugin.getInstance().getConfig().isOnlineMode()); + } else { + return new SpongeSender(BanManagerPlugin.getInstance(), source); + } + } + + @Override + public boolean testPermission(CommandSource source) { + return source.hasPermission(command.getPermission()); + } + + @Override + public Optional getShortDescription(CommandSource source) { + return Optional.empty(); + } + + @Override + public Optional getHelp(CommandSource source) { + return Optional.empty(); + } + + @Override + public Text getUsage(CommandSource source) { + return Text.of(command.getUsage()); + } +} diff --git a/sponge/src/main/java/me/confuser/banmanager/sponge/SpongeMetrics.java b/sponge/src/main/java/me/confuser/banmanager/sponge/SpongeMetrics.java new file mode 100755 index 000000000..0be630656 --- /dev/null +++ b/sponge/src/main/java/me/confuser/banmanager/sponge/SpongeMetrics.java @@ -0,0 +1,60 @@ +package me.confuser.banmanager.sponge; + +import me.confuser.banmanager.common.CommonMetrics; +import org.bstats.charts.DrilldownPie; +import org.bstats.charts.SimplePie; +import org.bstats.sponge.Metrics; + +import java.util.HashMap; +import java.util.Map; + +public class SpongeMetrics implements CommonMetrics { + private final Metrics metrics; + + public SpongeMetrics(Metrics metrics) { + this.metrics = metrics; + } + + @Override + public void submitOnlineMode(boolean online) { + metrics.addCustomChart((new SimplePie("banmanagerMode", () -> online ? "online" : "offline"))); + } + + @Override + public void submitStorageType(String storageType) { + metrics.addCustomChart((new SimplePie("storageType", () -> storageType))); + } + + @Override + public void submitStorageVersion(String version) { + metrics.addCustomChart((new DrilldownPie("storageVersion", () -> { + Map> map = new HashMap<>(); + + Map entry = new HashMap<>(); + entry.put(version, 1); + + if (version.contains("Maria")) { + map.put("MariaDB", entry); + } else { + map.put("MySQL", entry); + } + + return map; + }))); + } + + @Override + public void submitGlobalMode(boolean enabled) { + metrics.addCustomChart((new SimplePie("globalMode", () -> enabled ? "enabled" : "disabled"))); + } + + @Override + public void submitGeoMode(boolean enabled) { + metrics.addCustomChart((new SimplePie("geoMode", () -> enabled ? "enabled" : "disabled"))); + } + + @Override + public void submitDiscordMode(boolean enabled) { + metrics.addCustomChart((new SimplePie("discordMode", () -> enabled ? "enabled" : "disabled"))); + } +} diff --git a/sponge/src/main/java/me/confuser/banmanager/sponge/SpongePlayer.java b/sponge/src/main/java/me/confuser/banmanager/sponge/SpongePlayer.java new file mode 100644 index 000000000..3a6040b97 --- /dev/null +++ b/sponge/src/main/java/me/confuser/banmanager/sponge/SpongePlayer.java @@ -0,0 +1,156 @@ +package me.confuser.banmanager.sponge; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.CommonPlayer; +import me.confuser.banmanager.common.CommonWorld; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.kyori.text.TextComponent; +import me.confuser.banmanager.common.kyori.text.serializer.gson.GsonComponentSerializer; +import me.confuser.banmanager.common.util.Message; +import me.confuser.banmanager.common.util.UUIDUtils; +import org.spongepowered.api.Sponge; +import org.spongepowered.api.entity.living.player.Player; +import org.spongepowered.api.entity.living.player.User; +import org.spongepowered.api.text.serializer.TextSerializers; +import org.spongepowered.api.world.Location; +import org.spongepowered.api.world.World; + +import java.net.InetAddress; +import java.sql.SQLException; +import java.util.Optional; +import java.util.UUID; + +public class SpongePlayer implements CommonPlayer { + private User user; + private final UUID uuid; + private final boolean onlineMode; + private InetAddress address; + + public SpongePlayer(UUID uuid, String name, boolean onlineMode) { + this.uuid = uuid; + this.onlineMode = onlineMode; + } + + public SpongePlayer(Player player, boolean onlineMode) { + this(player.getUniqueId(), player.getName(), onlineMode); + } + + public SpongePlayer(User user, boolean onlineMode, InetAddress address) { + this(user.getUniqueId(), user.getName(), onlineMode); + + this.user = user; + this.address = address; + } + + @Override + public void kick(String message) { + getPlayer().kick(SpongeServer.formatMessage(message)); + } + + @Override + public void sendMessage(String message) { + if(message.isEmpty()) return; + + if(Message.isJSONMessage(message)) { + sendJSONMessage(message); + } else { + getPlayer().sendMessage(SpongeServer.formatMessage(message)); + } + } + + @Override + public void sendMessage(Message message) { + sendMessage(message.toString()); + } + + @Override + public void sendJSONMessage(TextComponent jsonString) { + getPlayer().sendMessage(TextSerializers.JSON.deserialize(GsonComponentSerializer.gson().serialize(jsonString))); + } + + @Override + public void sendJSONMessage(String jsonString) { + getPlayer().sendMessage(TextSerializers.JSON.deserialize(jsonString)); + } + + @Override + public boolean isConsole() { + return false; + } + + @Override + public PlayerData getData() { + try { + return BanManagerPlugin.getInstance().getPlayerStorage().queryForId(UUIDUtils.toBytes(getUniqueId())); + } catch (SQLException e) { + e.printStackTrace(); + sendMessage(Message.get("sender.error.exception").toString()); + return null; + } + } + + @Override + public boolean isOnlineMode() { + return onlineMode; + } + + public boolean isOnline() { + return getPlayer() != null; + } + + @Override + public boolean hasPermission(String permission) { + if (user != null) return user.hasPermission(permission); + + return getPlayer().hasPermission(permission); + } + + @Override + public String getDisplayName() { + return getPlayer().getDisplayNameData().displayName().get().toPlain(); + } + + @Override + public String getName() { + return getPlayer().getName(); + } + + @Override + public InetAddress getAddress() { + if (address != null) return address; + return getPlayer().getConnection().getAddress().getAddress(); + } + + public UUID getUniqueId() { + return uuid; + } + + public boolean teleport(CommonWorld world, double x, double y, double z, float pitch, float yaw) { + Location location = Sponge.getServer().getWorld(world.getName()).get().getLocation(x, y, z); + + return getPlayer().setLocation(location); + } + + @Override + public boolean canSee(CommonPlayer player) { + return getPlayer().canSee(Sponge.getServer().getPlayer(player.getUniqueId()).get()); + } + + private Player getPlayer() { + if (isOnlineMode()) { + Optional player = Sponge.getServer().getPlayer(uuid); + + if (player.isPresent()) { + return player.get(); + } else { + return null; + } + } + + for (Player onlinePlayer : Sponge.getServer().getOnlinePlayers()) { + if (UUIDUtils.createOfflineUUID(onlinePlayer.getName()).equals(uuid)) return onlinePlayer; + } + + return null; + } +} diff --git a/sponge/src/main/java/me/confuser/banmanager/sponge/SpongeScheduler.java b/sponge/src/main/java/me/confuser/banmanager/sponge/SpongeScheduler.java new file mode 100644 index 000000000..ad7ee2d15 --- /dev/null +++ b/sponge/src/main/java/me/confuser/banmanager/sponge/SpongeScheduler.java @@ -0,0 +1,37 @@ +package me.confuser.banmanager.sponge; + +import me.confuser.banmanager.common.CommonScheduler; +import org.spongepowered.api.Sponge; +import org.spongepowered.api.scheduler.Task; + +public class SpongeScheduler implements CommonScheduler { + private Object plugin; + + public SpongeScheduler(Object plugin) { + this.plugin = plugin; + } + + @Override + public void runAsync(Runnable task) { + Task.Builder builder = Sponge.getGame().getScheduler().createTaskBuilder(); + builder.async().execute(task).submit(plugin); + } + + @Override + public void runAsyncLater(Runnable task, long delay) { + Task.Builder builder = Sponge.getGame().getScheduler().createTaskBuilder(); + builder.async().execute(task).delayTicks(delay).submit(plugin); + } + + @Override + public void runSync(Runnable task) { + Task.Builder builder = Sponge.getGame().getScheduler().createTaskBuilder(); + builder.execute(task).submit(plugin); + } + + @Override + public void runSyncLater(Runnable task, long delay) { + Task.Builder builder = Sponge.getGame().getScheduler().createTaskBuilder(); + builder.execute(task).delayTicks(delay).submit(plugin); + } +} diff --git a/sponge/src/main/java/me/confuser/banmanager/sponge/SpongeSender.java b/sponge/src/main/java/me/confuser/banmanager/sponge/SpongeSender.java new file mode 100644 index 000000000..d55c7b358 --- /dev/null +++ b/sponge/src/main/java/me/confuser/banmanager/sponge/SpongeSender.java @@ -0,0 +1,60 @@ +package me.confuser.banmanager.sponge; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.commands.CommonSender; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.util.Message; +import me.confuser.banmanager.common.util.UUIDUtils; +import org.spongepowered.api.command.CommandSource; +import org.spongepowered.api.entity.living.player.Player; + +import java.sql.SQLException; + +public class SpongeSender implements CommonSender { + + private BanManagerPlugin plugin; + private CommandSource sender; + + public SpongeSender(BanManagerPlugin plugin, CommandSource sender) { + this.plugin = plugin; + this.sender = sender; + } + + @Override + public String getName() { + return sender.getName(); + } + + @Override + public boolean hasPermission(String permission) { + return sender.hasPermission(permission); + } + + @Override + public void sendMessage(String message) { + sender.sendMessage(SpongeServer.formatMessage(message)); + } + + @Override + public void sendMessage(Message message) { + sendMessage(message.toString()); + } + + @Override + public boolean isConsole() { + return !(sender instanceof Player); + } + + @Override + public PlayerData getData() { + if (isConsole()) return plugin.getPlayerStorage().getConsole(); + + try { + return plugin.getPlayerStorage().queryForId(UUIDUtils.toBytes(((Player) sender).getUniqueId())); + } catch (SQLException e) { + e.printStackTrace(); + sender.sendMessage(SpongeServer.formatMessage(Message.get("sender.error.exception").toString())); + return null; + } + } +} diff --git a/sponge/src/main/java/me/confuser/banmanager/sponge/SpongeServer.java b/sponge/src/main/java/me/confuser/banmanager/sponge/SpongeServer.java new file mode 100644 index 000000000..eb62800e8 --- /dev/null +++ b/sponge/src/main/java/me/confuser/banmanager/sponge/SpongeServer.java @@ -0,0 +1,232 @@ +package me.confuser.banmanager.sponge; + +import me.confuser.banmanager.common.*; +import me.confuser.banmanager.common.api.events.CommonEvent; +import me.confuser.banmanager.common.commands.CommonSender; +import me.confuser.banmanager.common.data.*; +import me.confuser.banmanager.common.kyori.text.TextComponent; +import me.confuser.banmanager.common.util.Message; +import me.confuser.banmanager.sponge.api.events.*; +import org.spongepowered.api.Sponge; +import org.spongepowered.api.command.CommandMapping; +import org.spongepowered.api.entity.living.player.Player; +import org.spongepowered.api.text.Text; +import org.spongepowered.api.text.serializer.TextSerializers; +import org.spongepowered.api.world.World; + +import java.util.*; +import java.util.stream.Collectors; + +public class SpongeServer implements CommonServer { + private BanManagerPlugin plugin; + + public void enable(BanManagerPlugin plugin) { + this.plugin = plugin; + } + + @Override + public CommonPlayer getPlayer(UUID uniqueId) { + Optional player = Sponge.getGame().getServer().getPlayer(uniqueId); + + return player.map(value -> new SpongePlayer(value, plugin.getConfig().isOnlineMode())).orElse(null); + + } + + @Override + public CommonPlayer getPlayer(String name) { + Optional player = Sponge.getGame().getServer().getPlayer(name); + + return player.map(value -> new SpongePlayer(value, plugin.getConfig().isOnlineMode())).orElse(null); + + } + + @Override + public CommonPlayer[] getOnlinePlayers() { + return Sponge.getServer().getOnlinePlayers().stream() + .map(player -> new SpongePlayer(player, plugin.getConfig().isOnlineMode())) + .collect(Collectors.toList()).toArray(new CommonPlayer[0]); + } + + @Override + public void broadcast(String message, String permission) { + if(message.isEmpty()) return; + + // @TODO can't figure out how to get message channels to work ¯\_(ツ)_/¯ + // MessageChannel.permission(permission).send(Sponge.getServer().getConsole(), Text.of(message)); + Arrays.stream(getOnlinePlayers()).forEach(player -> { + if (player.hasPermission(permission)) player.sendMessage(message); + }); + + Sponge.getServer().getConsole().sendMessage(Text.of(message)); + } + + @Override + public void broadcastJSON(TextComponent message, String permission) { + Arrays.stream(getOnlinePlayers()).forEach(player -> { + if (player.hasPermission(permission)) player.sendJSONMessage(message); + }); + } + + public void broadcast(String message, String permission, CommonSender sender) { + broadcast(message, permission); + + if (!sender.hasPermission(permission)) sender.sendMessage(message); + } + + public static Text formatMessage(String message) { + return TextSerializers.FORMATTING_CODE.deserialize(message); + } + + public CommonSender getConsoleSender() { + return new SpongeSender(plugin, Sponge.getServer().getConsole()); + } + + public boolean dispatchCommand(CommonSender sender, String command) { + if (sender.isConsole()) { + Sponge.getCommandManager().process(Sponge.getServer().getConsole(), command); + } else { + Sponge.getCommandManager().process(Sponge.getServer().getPlayer(sender.getName()).get(), command); + } + + return true; + } + + public CommonWorld getWorld(String name) { + Optional world = Sponge.getServer().getWorld(name); + + if (!world.isPresent()) return null; + + return new CommonWorld(name); + } + + @Override + public CommonEvent callEvent(String name, Object... args) { + // @TODO replace with a cleaner implementation + CustomEvent event = null; + CommonEvent commonEvent = new CommonEvent(false, true); + + switch (name) { + case "PlayerBanEvent": + event = new PlayerBanEvent((PlayerBanData) args[0], (boolean) args[1]); + break; + case "PlayerBannedEvent": + event = new PlayerBannedEvent((PlayerBanData) args[0], (boolean) args[1]); + break; + case "PlayerUnbanEvent": + event = new PlayerUnbanEvent((PlayerBanData) args[0], (PlayerData) args[1], (String) args[2]); + break; + + case "IpBanEvent": + event = new IpBanEvent((IpBanData) args[0], (boolean) args[1]); + break; + case "IpBannedEvent": + event = new IpBannedEvent((IpBanData) args[0], (boolean) args[1]); + break; + case "IpUnbanEvent": + event = new IpUnbanEvent((IpBanData) args[0], (PlayerData) args[1], (String) args[2]); + break; + + case "IpMuteEvent": + event = new IpMuteEvent((IpMuteData) args[0], (boolean) args[1]); + break; + case "IpMutedEvent": + event = new IpMutedEvent((IpMuteData) args[0], (boolean) args[1]); + break; + case "IpUnmutedEvent": + event = new IpUnmutedEvent((IpMuteData) args[0], (PlayerData) args[1], (String) args[2]); + break; + + case "PlayerKickedEvent": + event = new PlayerKickedEvent((PlayerKickData) args[0], (boolean) args[1]); + break; + + case "PlayerNoteCreatedEvent": + event = new PlayerNoteCreatedEvent((PlayerNoteData) args[0]); + break; + + case "PlayerReportEvent": + event = new PlayerReportEvent((PlayerReportData) args[0], (boolean) args[1]); + break; + case "PlayerReportedEvent": + event = new PlayerReportedEvent((PlayerReportData) args[0], (boolean) args[1]); + break; + case "PlayerReportDeletedEvent": + event = new PlayerReportDeletedEvent((PlayerReportData) args[0]); + break; + + case "NameBanEvent": + event = new NameBanEvent((NameBanData) args[0], (boolean) args[1]); + break; + case "NameBannedEvent": + event = new NameBannedEvent((NameBanData) args[0], (boolean) args[1]); + break; + case "NameUnbanEvent": + event = new NameUnbanEvent((NameBanData) args[0], (PlayerData) args[1], (String) args[2]); + break; + + case "PlayerWarnEvent": + event = new PlayerWarnEvent((PlayerWarnData) args[0], (boolean) args[1]); + break; + case "PlayerWarnedEvent": + event = new PlayerWarnedEvent((PlayerWarnData) args[0], (boolean) args[1]); + break; + + case "IpRangeBanEvent": + event = new IpRangeBanEvent((IpRangeBanData) args[0], (boolean) args[1]); + break; + case "IpRangeBannedEvent": + event = new IpRangeBannedEvent((IpRangeBanData) args[0], (boolean) args[1]); + break; + case "IpRangeUnbanEvent": + event = new IpRangeUnbanEvent((IpRangeBanData) args[0], (PlayerData) args[1], (String) args[2]); + break; + + case "PlayerMuteEvent": + event = new PlayerMuteEvent((PlayerMuteData) args[0], (boolean) args[1]); + break; + case "PlayerMutedEvent": + event = new PlayerMutedEvent((PlayerMuteData) args[0], (boolean) args[1]); + break; + case "PlayerUnmuteEvent": + event = new PlayerUnmuteEvent((PlayerMuteData) args[0], (PlayerData) args[1], (String) args[2]); + break; + + case "PluginReloadedEvent": + event = new PluginReloadedEvent((PlayerData) args[0]); + break; + + case "PlayerDeniedEvent": + event = new PlayerDeniedEvent((PlayerData) args[0], (Message) args[1]); + break; + } + + if (event == null) { + plugin.getLogger().warning("Unable to call missing event " + name); + + return commonEvent; + } + + Sponge.getEventManager().post(event); + + if (event instanceof SilentCancellableEvent) { + commonEvent = new CommonEvent(((SilentCancellableEvent) event).isCancelled(), ((SilentCancellableEvent) event).isSilent()); + } else if (event instanceof SilentEvent) { + commonEvent = new CommonEvent(false, ((SilentEvent) event).isSilent()); + } else if (event instanceof CustomCancellableEvent) { + commonEvent = new CommonEvent(((CustomCancellableEvent) event).isCancelled(), true); + } + + return commonEvent; + } + + @Override + public CommonExternalCommand getPluginCommand(String commandName) { + Optional commandMapping = Sponge.getCommandManager().get(commandName); + + if (!commandMapping.isPresent()) return null; + + CommandMapping cmd = commandMapping.get(); + + return new CommonExternalCommand(null, cmd.getPrimaryAlias(), new ArrayList<>(cmd.getAllAliases())); + } +} diff --git a/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/CustomCancellableEvent.java b/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/CustomCancellableEvent.java new file mode 100644 index 000000000..1f2e4d763 --- /dev/null +++ b/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/CustomCancellableEvent.java @@ -0,0 +1,16 @@ +package me.confuser.banmanager.sponge.api.events; + +import lombok.Getter; +import lombok.Setter; +import org.spongepowered.api.event.Cancellable; + +public abstract class CustomCancellableEvent extends CustomEvent implements Cancellable { + + @Getter + @Setter + private boolean cancelled = false; + + public CustomCancellableEvent() { + super(); + } +} diff --git a/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/CustomEvent.java b/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/CustomEvent.java new file mode 100644 index 000000000..f3e3314c1 --- /dev/null +++ b/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/CustomEvent.java @@ -0,0 +1,21 @@ +package me.confuser.banmanager.sponge.api.events; + +import lombok.Getter; +import org.spongepowered.api.Sponge; +import org.spongepowered.api.event.cause.Cause; +import org.spongepowered.api.event.cause.EventContext; +import org.spongepowered.api.event.cause.EventContextKeys; +import org.spongepowered.api.event.impl.AbstractEvent; +import org.spongepowered.api.plugin.PluginContainer; + +public abstract class CustomEvent extends AbstractEvent { + @Getter + private final Cause cause; + + public CustomEvent() { + PluginContainer plugin = Sponge.getPluginManager().getPlugin("banmanager").get(); + EventContext eventContext = EventContext.builder().add(EventContextKeys.PLUGIN, plugin).build(); + + this.cause = Cause.of(eventContext, plugin); + } +} diff --git a/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/IpBanEvent.java b/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/IpBanEvent.java new file mode 100644 index 000000000..e0b758d90 --- /dev/null +++ b/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/IpBanEvent.java @@ -0,0 +1,16 @@ +package me.confuser.banmanager.sponge.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.IpBanData; + +public class IpBanEvent extends SilentCancellableEvent { + + @Getter + private IpBanData ban; + + public IpBanEvent(IpBanData ban, boolean silent) { + super(silent); + + this.ban = ban; + } +} diff --git a/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/IpBannedEvent.java b/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/IpBannedEvent.java new file mode 100644 index 000000000..c63dca9fd --- /dev/null +++ b/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/IpBannedEvent.java @@ -0,0 +1,15 @@ +package me.confuser.banmanager.sponge.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.IpBanData; + +public class IpBannedEvent extends SilentEvent { + + @Getter + private IpBanData ban; + + public IpBannedEvent(IpBanData ban, boolean silent) { + super(silent); + this.ban = ban; + } +} diff --git a/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/IpMuteEvent.java b/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/IpMuteEvent.java new file mode 100644 index 000000000..5f99f8f89 --- /dev/null +++ b/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/IpMuteEvent.java @@ -0,0 +1,15 @@ +package me.confuser.banmanager.sponge.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.IpMuteData; + +public class IpMuteEvent extends SilentCancellableEvent { + + @Getter + private IpMuteData mute; + + public IpMuteEvent(IpMuteData mute, boolean silent) { + super(silent); + this.mute = mute; + } +} diff --git a/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/IpMutedEvent.java b/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/IpMutedEvent.java new file mode 100644 index 000000000..9b772d29b --- /dev/null +++ b/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/IpMutedEvent.java @@ -0,0 +1,15 @@ +package me.confuser.banmanager.sponge.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.IpMuteData; + +public class IpMutedEvent extends SilentEvent { + + @Getter + private IpMuteData mute; + + public IpMutedEvent(IpMuteData mute, boolean silent) { + super(silent); + this.mute = mute; + } +} diff --git a/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/IpRangeBanEvent.java b/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/IpRangeBanEvent.java new file mode 100644 index 000000000..8ebb1d0c6 --- /dev/null +++ b/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/IpRangeBanEvent.java @@ -0,0 +1,15 @@ +package me.confuser.banmanager.sponge.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.IpRangeBanData; + +public class IpRangeBanEvent extends SilentCancellableEvent { + + @Getter + private IpRangeBanData ban; + + public IpRangeBanEvent(IpRangeBanData ban, boolean silent) { + super(silent); + this.ban = ban; + } +} diff --git a/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/IpRangeBannedEvent.java b/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/IpRangeBannedEvent.java new file mode 100644 index 000000000..073562232 --- /dev/null +++ b/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/IpRangeBannedEvent.java @@ -0,0 +1,16 @@ +package me.confuser.banmanager.sponge.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.IpRangeBanData; + + +public class IpRangeBannedEvent extends SilentEvent { + + @Getter + private IpRangeBanData ban; + + public IpRangeBannedEvent(IpRangeBanData ban, boolean silent) { + super(silent); + this.ban = ban; + } +} diff --git a/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/IpRangeUnbanEvent.java b/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/IpRangeUnbanEvent.java new file mode 100644 index 000000000..73a65f1a8 --- /dev/null +++ b/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/IpRangeUnbanEvent.java @@ -0,0 +1,24 @@ +package me.confuser.banmanager.sponge.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.IpRangeBanData; +import me.confuser.banmanager.common.data.PlayerData; + + +public class IpRangeUnbanEvent extends CustomCancellableEvent { + + @Getter + private IpRangeBanData ban; + @Getter + private PlayerData actor; + @Getter + private String reason; + + public IpRangeUnbanEvent(IpRangeBanData ban, PlayerData actor, String reason) { + super(); + + this.ban = ban; + this.actor = actor; + this.reason = reason; + } +} diff --git a/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/IpUnbanEvent.java b/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/IpUnbanEvent.java new file mode 100644 index 000000000..5ae23051b --- /dev/null +++ b/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/IpUnbanEvent.java @@ -0,0 +1,24 @@ +package me.confuser.banmanager.sponge.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.IpBanData; +import me.confuser.banmanager.common.data.PlayerData; + + +public class IpUnbanEvent extends CustomCancellableEvent { + + @Getter + private IpBanData ban; + @Getter + private PlayerData actor; + @Getter + private String reason; + + public IpUnbanEvent(IpBanData ban, PlayerData actor, String reason) { + super(); + + this.ban = ban; + this.actor = actor; + this.reason = reason; + } +} diff --git a/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/IpUnmutedEvent.java b/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/IpUnmutedEvent.java new file mode 100644 index 000000000..794762691 --- /dev/null +++ b/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/IpUnmutedEvent.java @@ -0,0 +1,24 @@ +package me.confuser.banmanager.sponge.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.IpMuteData; +import me.confuser.banmanager.common.data.PlayerData; + + +public class IpUnmutedEvent extends CustomCancellableEvent { + + @Getter + private IpMuteData mute; + @Getter + private PlayerData actor; + @Getter + private String reason; + + public IpUnmutedEvent(IpMuteData mute, PlayerData actor, String reason) { + super(); + + this.mute = mute; + this.actor = actor; + this.reason = reason; + } +} diff --git a/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/NameBanEvent.java b/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/NameBanEvent.java new file mode 100644 index 000000000..da3fcaffb --- /dev/null +++ b/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/NameBanEvent.java @@ -0,0 +1,17 @@ +package me.confuser.banmanager.sponge.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.NameBanData; + + +public class NameBanEvent extends SilentCancellableEvent { + + @Getter + private NameBanData ban; + + public NameBanEvent(NameBanData ban, boolean isSilent) { + super(isSilent); + this.ban = ban; + } + +} diff --git a/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/NameBannedEvent.java b/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/NameBannedEvent.java new file mode 100644 index 000000000..334e1d4a6 --- /dev/null +++ b/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/NameBannedEvent.java @@ -0,0 +1,16 @@ +package me.confuser.banmanager.sponge.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.NameBanData; + +public class NameBannedEvent extends SilentEvent { + + @Getter + private NameBanData ban; + + public NameBannedEvent(NameBanData ban, boolean isSilent) { + super(isSilent); + this.ban = ban; + } + +} diff --git a/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/NameUnbanEvent.java b/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/NameUnbanEvent.java new file mode 100644 index 000000000..bd9a52be6 --- /dev/null +++ b/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/NameUnbanEvent.java @@ -0,0 +1,25 @@ +package me.confuser.banmanager.sponge.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.NameBanData; +import me.confuser.banmanager.common.data.PlayerData; + + +public class NameUnbanEvent extends CustomCancellableEvent { + + @Getter + private NameBanData ban; + @Getter + private PlayerData actor; + @Getter + private String reason; + + public NameUnbanEvent(NameBanData ban, PlayerData actor, String reason) { + super(); + + this.ban = ban; + this.actor = actor; + this.reason = reason; + } + +} diff --git a/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/PlayerBanEvent.java b/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/PlayerBanEvent.java new file mode 100644 index 000000000..bf8ad864e --- /dev/null +++ b/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/PlayerBanEvent.java @@ -0,0 +1,17 @@ +package me.confuser.banmanager.sponge.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.PlayerBanData; + + +public class PlayerBanEvent extends SilentCancellableEvent { + + @Getter + private PlayerBanData ban; + + public PlayerBanEvent(PlayerBanData ban, boolean isSilent) { + super(isSilent); + this.ban = ban; + } + +} diff --git a/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/PlayerBannedEvent.java b/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/PlayerBannedEvent.java new file mode 100644 index 000000000..b36e52fa0 --- /dev/null +++ b/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/PlayerBannedEvent.java @@ -0,0 +1,17 @@ +package me.confuser.banmanager.sponge.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.PlayerBanData; + + +public class PlayerBannedEvent extends SilentEvent { + + @Getter + private PlayerBanData ban; + + public PlayerBannedEvent(PlayerBanData ban, boolean isSilent) { + super(isSilent); + this.ban = ban; + } + +} diff --git a/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/PlayerDeniedEvent.java b/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/PlayerDeniedEvent.java new file mode 100644 index 000000000..48cf5c59f --- /dev/null +++ b/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/PlayerDeniedEvent.java @@ -0,0 +1,24 @@ +package me.confuser.banmanager.sponge.api.events; + +import lombok.Getter; +import lombok.Setter; +import me.confuser.banmanager.common.util.Message; +import me.confuser.banmanager.common.data.PlayerData; + + +public class PlayerDeniedEvent extends CustomCancellableEvent { + + @Getter + @Setter + private Message message; + + @Getter + private PlayerData player; + + public PlayerDeniedEvent(PlayerData player, Message message) { + super(); + + this.player = player; + this.message = message; + } +} diff --git a/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/PlayerKickedEvent.java b/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/PlayerKickedEvent.java new file mode 100644 index 000000000..0cceb9407 --- /dev/null +++ b/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/PlayerKickedEvent.java @@ -0,0 +1,15 @@ +package me.confuser.banmanager.sponge.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.PlayerKickData; + +public class PlayerKickedEvent extends SilentEvent { + + @Getter + private PlayerKickData kick; + + public PlayerKickedEvent(PlayerKickData kick, boolean isSilent) { + super(isSilent); + this.kick = kick; + } +} diff --git a/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/PlayerMuteEvent.java b/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/PlayerMuteEvent.java new file mode 100644 index 000000000..3b99b37d6 --- /dev/null +++ b/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/PlayerMuteEvent.java @@ -0,0 +1,16 @@ +package me.confuser.banmanager.sponge.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.PlayerMuteData; + + +public class PlayerMuteEvent extends SilentCancellableEvent { + + @Getter + private PlayerMuteData mute; + + public PlayerMuteEvent(PlayerMuteData mute, boolean silent) { + super(silent); + this.mute = mute; + } +} diff --git a/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/PlayerMutedEvent.java b/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/PlayerMutedEvent.java new file mode 100644 index 000000000..ecbf8cc41 --- /dev/null +++ b/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/PlayerMutedEvent.java @@ -0,0 +1,16 @@ +package me.confuser.banmanager.sponge.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.PlayerMuteData; + + +public class PlayerMutedEvent extends SilentEvent { + + @Getter + private PlayerMuteData mute; + + public PlayerMutedEvent(PlayerMuteData mute, boolean silent) { + super(silent); + this.mute = mute; + } +} diff --git a/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/PlayerNoteCreatedEvent.java b/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/PlayerNoteCreatedEvent.java new file mode 100644 index 000000000..6e8845561 --- /dev/null +++ b/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/PlayerNoteCreatedEvent.java @@ -0,0 +1,16 @@ +package me.confuser.banmanager.sponge.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.PlayerNoteData; + + +public class PlayerNoteCreatedEvent extends CustomCancellableEvent { + + @Getter + private PlayerNoteData note; + + public PlayerNoteCreatedEvent(PlayerNoteData note) { + super(); + this.note = note; + } +} diff --git a/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/PlayerReportDeletedEvent.java b/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/PlayerReportDeletedEvent.java new file mode 100644 index 000000000..fcf11424b --- /dev/null +++ b/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/PlayerReportDeletedEvent.java @@ -0,0 +1,15 @@ +package me.confuser.banmanager.sponge.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.PlayerReportData; + +public class PlayerReportDeletedEvent extends CustomEvent { + + @Getter + private PlayerReportData report; + + public PlayerReportDeletedEvent(PlayerReportData report) { + super(); + this.report = report; + } +} diff --git a/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/PlayerReportEvent.java b/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/PlayerReportEvent.java new file mode 100644 index 000000000..49ecfa57e --- /dev/null +++ b/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/PlayerReportEvent.java @@ -0,0 +1,17 @@ +package me.confuser.banmanager.sponge.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.PlayerReportData; + + +public class PlayerReportEvent extends SilentCancellableEvent { + + @Getter + private PlayerReportData report; + + public PlayerReportEvent(PlayerReportData report, boolean isSilent) { + super(isSilent); + this.report = report; + } + +} diff --git a/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/PlayerReportedEvent.java b/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/PlayerReportedEvent.java new file mode 100644 index 000000000..f0a48e2ae --- /dev/null +++ b/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/PlayerReportedEvent.java @@ -0,0 +1,17 @@ +package me.confuser.banmanager.sponge.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.PlayerReportData; + + +public class PlayerReportedEvent extends SilentEvent { + + @Getter + private PlayerReportData report; + + public PlayerReportedEvent(PlayerReportData report, boolean isSilent) { + super(isSilent); + this.report = report; + } + +} diff --git a/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/PlayerUnbanEvent.java b/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/PlayerUnbanEvent.java new file mode 100644 index 000000000..1cd1e68a6 --- /dev/null +++ b/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/PlayerUnbanEvent.java @@ -0,0 +1,25 @@ +package me.confuser.banmanager.sponge.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.PlayerBanData; +import me.confuser.banmanager.common.data.PlayerData; + + +public class PlayerUnbanEvent extends CustomCancellableEvent { + + @Getter + private PlayerBanData ban; + @Getter + private PlayerData actor; + @Getter + private String reason; + + public PlayerUnbanEvent(PlayerBanData ban, PlayerData actor, String reason) { + super(); + + this.ban = ban; + this.actor = actor; + this.reason = reason; + } + +} diff --git a/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/PlayerUnmuteEvent.java b/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/PlayerUnmuteEvent.java new file mode 100644 index 000000000..4aa588085 --- /dev/null +++ b/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/PlayerUnmuteEvent.java @@ -0,0 +1,24 @@ +package me.confuser.banmanager.sponge.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.data.PlayerMuteData; + + +public class PlayerUnmuteEvent extends CustomCancellableEvent { + + @Getter + private PlayerMuteData mute; + @Getter + private PlayerData actor; + @Getter + private String reason; + + public PlayerUnmuteEvent(PlayerMuteData mute, PlayerData actor, String reason) { + super(); + + this.mute = mute; + this.actor = actor; + this.reason = reason; + } +} diff --git a/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/PlayerWarnEvent.java b/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/PlayerWarnEvent.java new file mode 100644 index 000000000..8f219ed4e --- /dev/null +++ b/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/PlayerWarnEvent.java @@ -0,0 +1,16 @@ +package me.confuser.banmanager.sponge.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.PlayerWarnData; + + +public class PlayerWarnEvent extends SilentEvent { + + @Getter + private PlayerWarnData warning; + + public PlayerWarnEvent(PlayerWarnData warning, boolean silent) { + super(silent); + this.warning = warning; + } +} diff --git a/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/PlayerWarnedEvent.java b/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/PlayerWarnedEvent.java new file mode 100644 index 000000000..d241d2d4a --- /dev/null +++ b/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/PlayerWarnedEvent.java @@ -0,0 +1,16 @@ +package me.confuser.banmanager.sponge.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.PlayerWarnData; + + +public class PlayerWarnedEvent extends SilentEvent { + + @Getter + private PlayerWarnData warning; + + public PlayerWarnedEvent(PlayerWarnData warning, boolean silent) { + super(silent); + this.warning = warning; + } +} diff --git a/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/PluginReloadedEvent.java b/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/PluginReloadedEvent.java new file mode 100644 index 000000000..2206c9289 --- /dev/null +++ b/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/PluginReloadedEvent.java @@ -0,0 +1,17 @@ +package me.confuser.banmanager.sponge.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.PlayerData; + + +public class PluginReloadedEvent extends CustomCancellableEvent { + + @Getter + private PlayerData actor; + + public PluginReloadedEvent(PlayerData actor) { + super(); + + this.actor = actor; + } +} diff --git a/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/SilentCancellableEvent.java b/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/SilentCancellableEvent.java new file mode 100644 index 000000000..3c8fe0200 --- /dev/null +++ b/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/SilentCancellableEvent.java @@ -0,0 +1,18 @@ +package me.confuser.banmanager.sponge.api.events; + +import lombok.Getter; +import lombok.Setter; + +public abstract class SilentCancellableEvent extends CustomCancellableEvent { + + @Getter + @Setter + private boolean silent; + + public SilentCancellableEvent(boolean silent) { + super(); + + this.silent = silent; + } + +} diff --git a/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/SilentEvent.java b/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/SilentEvent.java new file mode 100644 index 000000000..9dbf85763 --- /dev/null +++ b/sponge/src/main/java/me/confuser/banmanager/sponge/api/events/SilentEvent.java @@ -0,0 +1,16 @@ +package me.confuser.banmanager.sponge.api.events; + +import lombok.Getter; +import lombok.Setter; + +public abstract class SilentEvent extends CustomEvent { + @Getter + @Setter + private boolean silent; + + public SilentEvent(boolean silent) { + super(); + this.silent = silent; + } + +} diff --git a/sponge/src/main/java/me/confuser/banmanager/sponge/listeners/BanListener.java b/sponge/src/main/java/me/confuser/banmanager/sponge/listeners/BanListener.java new file mode 100644 index 000000000..a7ce0e28a --- /dev/null +++ b/sponge/src/main/java/me/confuser/banmanager/sponge/listeners/BanListener.java @@ -0,0 +1,52 @@ +package me.confuser.banmanager.sponge.listeners; + + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.CommonPlayer; +import me.confuser.banmanager.common.data.*; +import me.confuser.banmanager.common.listeners.CommonBanListener; +import me.confuser.banmanager.common.util.DateUtils; +import me.confuser.banmanager.common.util.IPUtils; +import me.confuser.banmanager.common.util.Message; +import me.confuser.banmanager.sponge.api.events.IpBannedEvent; +import me.confuser.banmanager.sponge.api.events.IpRangeBannedEvent; +import me.confuser.banmanager.sponge.api.events.NameBannedEvent; +import me.confuser.banmanager.sponge.api.events.PlayerBannedEvent; +import org.spongepowered.api.event.Listener; +import org.spongepowered.api.event.Order; +import org.spongepowered.api.event.filter.IsCancelled; +import org.spongepowered.api.util.Tristate; + +import java.util.List; + +public class BanListener { + private final CommonBanListener listener; + + public BanListener(BanManagerPlugin plugin) { + this.listener = new CommonBanListener(plugin); + } + + @IsCancelled(Tristate.UNDEFINED) + @Listener(order = Order.POST) + public void notifyOnBan(PlayerBannedEvent event) { + listener.notifyOnBan(event.getBan(), event.isSilent()); + } + + @IsCancelled(Tristate.UNDEFINED) + @Listener(order = Order.POST) + public void notifyOnIpBan(IpBannedEvent event) { + listener.notifyOnBan(event.getBan(), event.isSilent()); + } + + @IsCancelled(Tristate.UNDEFINED) + @Listener(order = Order.POST) + public void notifyOnIpRangeBan(IpRangeBannedEvent event) { + listener.notifyOnBan(event.getBan(), event.isSilent()); + } + + @IsCancelled(Tristate.UNDEFINED) + @Listener(order = Order.POST) + public void notifyOnNameBan(NameBannedEvent event) { + listener.notifyOnBan(event.getBan(), event.isSilent()); + } +} diff --git a/sponge/src/main/java/me/confuser/banmanager/sponge/listeners/ChatListener.java b/sponge/src/main/java/me/confuser/banmanager/sponge/listeners/ChatListener.java new file mode 100644 index 000000000..78f4e299d --- /dev/null +++ b/sponge/src/main/java/me/confuser/banmanager/sponge/listeners/ChatListener.java @@ -0,0 +1,62 @@ +package me.confuser.banmanager.sponge.listeners; + + +import java.util.Optional; + +import org.spongepowered.api.entity.living.player.Player; +import org.spongepowered.api.event.EventListener; +import org.spongepowered.api.event.message.MessageChannelEvent; + +import lombok.RequiredArgsConstructor; +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.CommonPlayer; +import me.confuser.banmanager.common.listeners.CommonChatHandler; +import me.confuser.banmanager.common.listeners.CommonChatListener; + +public class ChatListener implements EventListener { + + private final CommonChatListener listener; + private BanManagerPlugin plugin; + + public ChatListener(BanManagerPlugin plugin) { + this.plugin = plugin; + this.listener = new CommonChatListener(plugin); + } + + public void onPlayerChat(MessageChannelEvent.Chat event, Player player) { + CommonPlayer commonPlayer = plugin.getServer().getPlayer(player.getUniqueId()); + + if (listener.onPlayerChat(commonPlayer, new ChatHandler(event, player), event.getMessage().toPlain())) { + event.setCancelled(true); + } + } + + public void onIpChat(MessageChannelEvent.Chat event, Player player) { + CommonPlayer commonPlayer = plugin.getServer().getPlayer(player.getUniqueId()); + + if (listener.onIpChat(commonPlayer, player.getConnection().getAddress().getAddress(), new ChatHandler(event, player), event.getMessage().toPlain())) { + event.setCancelled(true); + } + } + + @Override + public void handle(MessageChannelEvent.Chat event) throws Exception { + Optional firstPlayer = event.getCause().first(Player.class); + + if (!firstPlayer.isPresent()) return; + + onPlayerChat(event, firstPlayer.get()); + onIpChat(event, firstPlayer.get()); + } + + @RequiredArgsConstructor + private class ChatHandler implements CommonChatHandler { + private final MessageChannelEvent.Chat event; + private final Player player; + + @Override + public void handleSoftMute() { + event.setChannel(player.getMessageChannel()); + } + } +} diff --git a/sponge/src/main/java/me/confuser/banmanager/sponge/listeners/CommandListener.java b/sponge/src/main/java/me/confuser/banmanager/sponge/listeners/CommandListener.java new file mode 100644 index 000000000..8204cd5df --- /dev/null +++ b/sponge/src/main/java/me/confuser/banmanager/sponge/listeners/CommandListener.java @@ -0,0 +1,34 @@ +package me.confuser.banmanager.sponge.listeners; + + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.CommonPlayer; +import me.confuser.banmanager.common.listeners.CommonCommandListener; +import org.spongepowered.api.entity.living.player.Player; +import org.spongepowered.api.event.Listener; +import org.spongepowered.api.event.Order; +import org.spongepowered.api.event.command.SendCommandEvent; +import org.spongepowered.api.event.filter.cause.First; + +public class CommandListener { + + private final CommonCommandListener listener; + private BanManagerPlugin plugin; + + public CommandListener(BanManagerPlugin plugin) { + this.plugin = plugin; + this.listener = new CommonCommandListener(plugin); + } + + @Listener(order = Order.FIRST, beforeModifications = true) + public void onCommand(SendCommandEvent event, @First Player player) { + CommonPlayer commonPlayer = plugin.getServer().getPlayer(player.getUniqueId()); + // Split the command + String[] args = event.getArguments().split(" ", 6); + String cmd = event.getCommand().toLowerCase(); + + if (listener.onCommand(commonPlayer, cmd, args)) { + event.setCancelled(true); + } + } +} diff --git a/sponge/src/main/java/me/confuser/banmanager/sponge/listeners/DiscordListener.java b/sponge/src/main/java/me/confuser/banmanager/sponge/listeners/DiscordListener.java new file mode 100644 index 000000000..b5ff0ab5e --- /dev/null +++ b/sponge/src/main/java/me/confuser/banmanager/sponge/listeners/DiscordListener.java @@ -0,0 +1,104 @@ +package me.confuser.banmanager.sponge.listeners; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.listeners.CommonDiscordListener; +import me.confuser.banmanager.sponge.api.events.*; +import org.spongepowered.api.event.Listener; +import org.spongepowered.api.event.Order; +import org.spongepowered.api.event.filter.IsCancelled; +import org.spongepowered.api.util.Tristate; + +public class DiscordListener { + private CommonDiscordListener listener; + + public DiscordListener(BanManagerPlugin plugin) { + this.listener = new CommonDiscordListener(plugin); + } + + @IsCancelled(Tristate.UNDEFINED) + @Listener(order = Order.POST) + public void notifyOnBan(PlayerBannedEvent event) { + Object[] data = listener.notifyOnBan(event.getBan()); + + if (event.isSilent() && (boolean) data[2]) return; + + send(data); + } + + @IsCancelled(Tristate.UNDEFINED) + @Listener(order = Order.POST) + public void notifyOnMute(PlayerMutedEvent event) { + Object[] data = listener.notifyOnMute(event.getMute()); + + if (event.isSilent() && (boolean) data[2]) return; + + send(data); + } + + @IsCancelled(Tristate.UNDEFINED) + @Listener(order = Order.POST) + public void notifyOnWarn(PlayerWarnedEvent event) { + Object[] data = listener.notifyOnWarn(event.getWarning()); + + if (event.isSilent() && (boolean) data[2]) return; + + send(data); + } + + @IsCancelled(Tristate.UNDEFINED) + @Listener(order = Order.POST) + public void notifyOnBan(IpBannedEvent event) { + Object[] data = listener.notifyOnBan(event.getBan()); + + if (event.isSilent() && (boolean) data[2]) return; + + send(data); + } + + @IsCancelled(Tristate.UNDEFINED) + @Listener(order = Order.POST) + public void notifyOnKick(PlayerKickedEvent event) { + Object[] data = listener.notifyOnKick(event.getKick()); + + if (event.isSilent() && (boolean) data[2]) return; + + send(data); + } + + @IsCancelled(Tristate.UNDEFINED) + @Listener(order = Order.POST) + public void notifyOnUnban(PlayerUnbanEvent event) { + send(listener.notifyOnUnban(event.getBan(), event.getActor(), event.getReason())); + } + + @IsCancelled(Tristate.UNDEFINED) + @Listener(order = Order.POST) + public void notifyOnUnban(IpUnbanEvent event) { + send(listener.notifyOnUnban(event.getBan(), event.getActor(), event.getReason())); + } + + @IsCancelled(Tristate.UNDEFINED) + @Listener(order = Order.POST) + public void notifyOnUnmute(PlayerUnmuteEvent event) { + send(listener.notifyOnUnmute(event.getMute(), event.getActor(), event.getReason())); + } + + @IsCancelled(Tristate.UNDEFINED) + @Listener(order = Order.POST) + public void notifyOnReport(PlayerReportedEvent event) { + Object[] data = listener.notifyOnReport(event.getReport(), event.getReport().getActor(), event.getReport().getReason()); + + if (event.isSilent() && (boolean) data[2]) return; + + send(data); + } + + private void send(Object[] data) { + String url = (String) data[0]; + String payload = (String) data[1]; + + if (url == null || payload == null || url.isEmpty() || payload.isEmpty()) return; + + listener.send(url, payload); + } +} diff --git a/sponge/src/main/java/me/confuser/banmanager/sponge/listeners/HookListener.java b/sponge/src/main/java/me/confuser/banmanager/sponge/listeners/HookListener.java new file mode 100644 index 000000000..86ddee71f --- /dev/null +++ b/sponge/src/main/java/me/confuser/banmanager/sponge/listeners/HookListener.java @@ -0,0 +1,100 @@ +package me.confuser.banmanager.sponge.listeners; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.listeners.CommonHooksListener; +import me.confuser.banmanager.sponge.api.events.*; +import org.spongepowered.api.event.Listener; +import org.spongepowered.api.event.Order; + +public class HookListener { + private final CommonHooksListener listener; + + public HookListener(BanManagerPlugin plugin) { + this.listener = new CommonHooksListener(plugin); + } + + @Listener(order = Order.POST) + public void onBan(final PlayerBanEvent event) { + listener.onBan(event.getBan(), true); + } + + @Listener(order = Order.POST) + public void onBan(final PlayerBannedEvent event) { + listener.onBan(event.getBan(), false); + } + + @Listener(order = Order.POST) + public void onUnban(final PlayerUnbanEvent event) { + listener.onUnban(event.getBan(), event.getActor(), event.getReason()); + } + + @Listener(order = Order.POST) + public void onMute(final PlayerMuteEvent event) { + listener.onMute(event.getMute(), true); + } + + @Listener(order = Order.POST) + public void onMute(final PlayerMutedEvent event) { + listener.onMute(event.getMute(), false); + } + + @Listener(order = Order.POST) + public void onUnmute(final PlayerUnmuteEvent event) { + listener.onUnmute(event.getMute(), event.getActor(), event.getReason()); + } + + @Listener(order = Order.POST) + public void onBan(final IpBanEvent event) { + listener.onBan(event.getBan(), true); + } + + @Listener(order = Order.POST) + public void onBan(final IpBannedEvent event) { + listener.onBan(event.getBan(), false); + } + + @Listener(order = Order.POST) + public void onUnban(final IpUnbanEvent event) { + listener.onUnban(event.getBan(), event.getActor(), event.getReason()); + } + + @Listener(order = Order.POST) + public void onBan(final IpRangeBanEvent event) { + listener.onBan(event.getBan(), true); + } + + @Listener(order = Order.POST) + public void onBan(final IpRangeBannedEvent event) { + listener.onBan(event.getBan(), false); + } + + @Listener(order = Order.POST) + public void onUnban(final IpRangeUnbanEvent event) { + listener.onUnban(event.getBan(), event.getActor(), event.getReason()); + } + + @Listener(order = Order.POST) + public void onWarn(final PlayerWarnEvent event) { + listener.onWarn(event.getWarning(), true); + } + + @Listener(order = Order.POST) + public void onWarn(final PlayerWarnedEvent event) { + listener.onWarn(event.getWarning(), false); + } + + @Listener(order = Order.POST) + public void onNote(final PlayerNoteCreatedEvent event) { + listener.onNote(event.getNote()); + } + + @Listener(order = Order.POST) + public void onReport(final PlayerReportEvent event) { + listener.onReport(event.getReport(), true); + } + + @Listener(order = Order.POST) + public void onReport(final PlayerReportedEvent event) { + listener.onReport(event.getReport(), false); + } +} diff --git a/sponge/src/main/java/me/confuser/banmanager/sponge/listeners/JoinListener.java b/sponge/src/main/java/me/confuser/banmanager/sponge/listeners/JoinListener.java new file mode 100644 index 000000000..a3664d6d8 --- /dev/null +++ b/sponge/src/main/java/me/confuser/banmanager/sponge/listeners/JoinListener.java @@ -0,0 +1,87 @@ +package me.confuser.banmanager.sponge.listeners; + +import lombok.RequiredArgsConstructor; +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.listeners.CommonJoinHandler; +import me.confuser.banmanager.common.listeners.CommonJoinListener; +import me.confuser.banmanager.common.util.*; +import me.confuser.banmanager.sponge.SpongePlayer; +import me.confuser.banmanager.sponge.SpongeServer; +import org.spongepowered.api.entity.living.player.User; +import org.spongepowered.api.event.Listener; +import org.spongepowered.api.event.Order; +import org.spongepowered.api.event.network.ClientConnectionEvent; + +import java.net.InetAddress; + +public class JoinListener { + private final CommonJoinListener listener; + private BanManagerPlugin plugin; + + public JoinListener(BanManagerPlugin plugin) { + this.plugin = plugin; + this.listener = new CommonJoinListener(plugin); + } + + @Listener(order = Order.LAST) + public void banCheck(final ClientConnectionEvent.Auth event) { + InetAddress address = event.getConnection().getAddress().getAddress(); + String name = event.getProfile().getName().get(); + + listener.banCheck(event.getProfile().getUniqueId(), name, IPUtils.toIPAddress(address), new BanJoinHandler(plugin, event)); + } + + @Listener(order = Order.LAST) + public void onJoin(ClientConnectionEvent.Auth event) { + if (event.isCancelled()) return; + + this.listener.onPreJoin(event.getProfile().getUniqueId(), event.getProfile().getName().get(), IPUtils.toIPAddress(event.getConnection().getAddress().getAddress())); + } + + @Listener(order = Order.LAST) + public void onJoin(final ClientConnectionEvent.Join event) { + listener.onJoin(new SpongePlayer(event.getTargetEntity(), plugin.getConfig().isOnlineMode())); + } + + @Listener(order = Order.LAST) + public void onPlayerLogin(final ClientConnectionEvent.Login event) { + User user = event.getTargetUser(); + listener.onPlayerLogin(new SpongePlayer(user, plugin.getConfig().isOnlineMode(), event.getConnection().getAddress().getAddress()), new LoginHandler(event)); + } + + @RequiredArgsConstructor + private class BanJoinHandler implements CommonJoinHandler { + private final BanManagerPlugin plugin; + private final ClientConnectionEvent.Auth event; + + @Override + public void handlePlayerDeny(PlayerData player, Message message) { + plugin.getServer().callEvent("PlayerDeniedEvent", player, message); + + handleDeny(message); + } + + @Override + public void handleDeny(Message message) { + event.setCancelled(true); + event.setMessage(SpongeServer.formatMessage(message.toString())); + } + } + + @RequiredArgsConstructor + private class LoginHandler implements CommonJoinHandler { + private final ClientConnectionEvent.Login event; + + @Override + public void handlePlayerDeny(PlayerData player, Message message) { + handleDeny(message); + } + + @Override + public void handleDeny(Message message) { + event.setMessage(SpongeServer.formatMessage(message.toString())); + event.setCancelled(true); + } + } +} diff --git a/sponge/src/main/java/me/confuser/banmanager/sponge/listeners/LeaveListener.java b/sponge/src/main/java/me/confuser/banmanager/sponge/listeners/LeaveListener.java new file mode 100644 index 000000000..701f01134 --- /dev/null +++ b/sponge/src/main/java/me/confuser/banmanager/sponge/listeners/LeaveListener.java @@ -0,0 +1,20 @@ +package me.confuser.banmanager.sponge.listeners; + + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.listeners.CommonLeaveListener; +import org.spongepowered.api.event.Listener; +import org.spongepowered.api.event.network.ClientConnectionEvent; + +public class LeaveListener { + private final CommonLeaveListener listener; + + public LeaveListener(BanManagerPlugin plugin) { + this.listener = new CommonLeaveListener(plugin); + } + + @Listener + public void onLeave(ClientConnectionEvent.Disconnect event) { + listener.onLeave(event.getTargetEntity().getUniqueId(), event.getTargetEntity().getName()); + } +} diff --git a/sponge/src/main/java/me/confuser/banmanager/sponge/listeners/MuteListener.java b/sponge/src/main/java/me/confuser/banmanager/sponge/listeners/MuteListener.java new file mode 100644 index 000000000..02389b0d9 --- /dev/null +++ b/sponge/src/main/java/me/confuser/banmanager/sponge/listeners/MuteListener.java @@ -0,0 +1,67 @@ +package me.confuser.banmanager.sponge.listeners; + + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.listeners.CommonMuteListener; +import me.confuser.banmanager.sponge.api.events.IpMutedEvent; +import me.confuser.banmanager.sponge.api.events.PlayerMutedEvent; +import org.spongepowered.api.entity.living.player.Player; +import org.spongepowered.api.event.Listener; +import org.spongepowered.api.event.Order; +import org.spongepowered.api.event.block.tileentity.ChangeSignEvent; +import org.spongepowered.api.event.filter.IsCancelled; +import org.spongepowered.api.event.filter.cause.Root; +import org.spongepowered.api.util.Tristate; + +public class MuteListener { + private final BanManagerPlugin plugin; + private final CommonMuteListener listener; + + public MuteListener(BanManagerPlugin plugin) { + this.plugin = plugin; + this.listener = new CommonMuteListener(plugin); + } + + @IsCancelled(Tristate.UNDEFINED) + @Listener(order = Order.POST) + public void notifyOnMute(PlayerMutedEvent event) { + listener.notifyOnMute(event.getMute(), event.isSilent()); + } + + @IsCancelled(Tristate.UNDEFINED) + @Listener(order = Order.POST) + public void notifyOnMute(IpMutedEvent event) { + listener.notifyOnMute(event.getMute(), event.isSilent()); + } + + @Listener(order = Order.DEFAULT) + public void blockOnPlayerMute(ChangeSignEvent event, @Root Player player) { + if (plugin.getPlayerMuteStorage().isMuted(player.getUniqueId()) && player.hasPermission("bm.block.muted.sign")) { + event.getTargetTile().getLocation().removeBlock(); + event.setCancelled(true); + } + } + + @Listener(order = Order.DEFAULT) + public void blockOnIpMute(ChangeSignEvent event, @Root Player player) { + if (plugin.getIpMuteStorage().isMuted(player.getConnection().getAddress().getAddress()) && player.hasPermission("bm.block.ipmuted.sign")) { + event.getTargetTile().getLocation().removeBlock(); + event.setCancelled(true); + } + } + + // Book events unsupported by Sponge API +// @Listener(order = Order.DEFAULT) +// public void blockOnPlayerMute(PlayerEditBookEvent event, @Root Player player) { +// if (plugin.getPlayerMuteStorage().isMuted(player.getUniqueId()) && player.hasPermission("bm.block.muted.book")) { +// event.setCancelled(true); +// } +// } +// +// @Listener(order = Order.DEFAULT) +// public void blockOnIpMute(PlayerEditBookEvent event, @Root Player player) { +// if (plugin.getIpMuteStorage().isMuted(player.getConnection().getAddress().getAddress()) && player.hasPermission("bm.block.ipmuted.book")) { +// event.setCancelled(true); +// } +// } +} diff --git a/sponge/src/main/java/me/confuser/banmanager/sponge/listeners/NoteListener.java b/sponge/src/main/java/me/confuser/banmanager/sponge/listeners/NoteListener.java new file mode 100644 index 000000000..2c3b63443 --- /dev/null +++ b/sponge/src/main/java/me/confuser/banmanager/sponge/listeners/NoteListener.java @@ -0,0 +1,25 @@ +package me.confuser.banmanager.sponge.listeners; + + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.listeners.CommonNoteListener; +import me.confuser.banmanager.sponge.api.events.PlayerNoteCreatedEvent; +import org.spongepowered.api.event.Listener; +import org.spongepowered.api.event.Order; +import org.spongepowered.api.event.filter.IsCancelled; +import org.spongepowered.api.util.Tristate; + +public class NoteListener { + private final CommonNoteListener listener; + + public NoteListener(BanManagerPlugin plugin) { + this.listener = new CommonNoteListener(plugin); + } + + @IsCancelled(Tristate.UNDEFINED) + @Listener(order = Order.POST) + public void notifyOnNote(PlayerNoteCreatedEvent event) { + listener.notifyOnNote(event.getNote()); + } + +} diff --git a/sponge/src/main/java/me/confuser/banmanager/sponge/listeners/ReportListener.java b/sponge/src/main/java/me/confuser/banmanager/sponge/listeners/ReportListener.java new file mode 100644 index 000000000..35ec00908 --- /dev/null +++ b/sponge/src/main/java/me/confuser/banmanager/sponge/listeners/ReportListener.java @@ -0,0 +1,73 @@ +package me.confuser.banmanager.sponge.listeners; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.data.PlayerReportData; +import me.confuser.banmanager.common.data.PlayerReportLocationData; +import me.confuser.banmanager.common.listeners.CommonReportListener; +import me.confuser.banmanager.common.util.UUIDUtils; +import me.confuser.banmanager.sponge.api.events.PlayerReportDeletedEvent; +import me.confuser.banmanager.sponge.api.events.PlayerReportedEvent; +import org.spongepowered.api.Sponge; +import org.spongepowered.api.entity.living.player.Player; +import org.spongepowered.api.event.Listener; +import org.spongepowered.api.event.Order; +import org.spongepowered.api.event.filter.IsCancelled; +import org.spongepowered.api.util.Tristate; +import org.spongepowered.api.world.Location; +import org.spongepowered.api.world.World; + +import java.sql.SQLException; +import java.util.Optional; + +public class ReportListener { + private final CommonReportListener listener; + private BanManagerPlugin plugin; + + public ReportListener(BanManagerPlugin plugin) { + this.plugin = plugin; + this.listener = new CommonReportListener(plugin); + } + + @IsCancelled(Tristate.UNDEFINED) + @Listener(order = Order.POST) + public void notifyOnReport(PlayerReportedEvent event) { + listener.notifyOnReport(event.getReport()); + } + + @IsCancelled(Tristate.UNDEFINED) + @Listener(order = Order.POST) + public void storeLocation(PlayerReportedEvent event) { + PlayerReportData report = event.getReport(); + + Optional player = Sponge.getServer().getPlayer(report.getPlayer().getUUID()); + Optional actor = Sponge.getServer().getPlayer(report.getActor().getUUID()); + + try { + if (player.isPresent()) createLocation(report, player.get()); + } catch (SQLException e) { + e.printStackTrace(); + } + + try { + if (actor.isPresent()) createLocation(report, actor.get()); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + private void createLocation(PlayerReportData report, Player player) throws SQLException { + if (player == null) return; + + PlayerData playerData = plugin.getPlayerStorage().queryForId(UUIDUtils.toBytes(player.getUniqueId())); + Location loc = player.getLocation(); + + plugin.getPlayerReportLocationStorage() + .create(new PlayerReportLocationData(report, playerData, player.getWorld().getName(), loc.getX(), loc.getY(), loc.getZ(), 0, 0)); + } + + @Listener + public void deleteReferences(PlayerReportDeletedEvent event) { + listener.deleteReferences(event.getReport()); + } +} diff --git a/sponge/src/main/resources/assets/banmanager b/sponge/src/main/resources/assets/banmanager new file mode 120000 index 000000000..c1bc36e37 --- /dev/null +++ b/sponge/src/main/resources/assets/banmanager @@ -0,0 +1 @@ +../../../../../common/src/main/resources \ No newline at end of file diff --git a/src/main/java/me/confuser/banmanager/BanManager.java b/src/main/java/me/confuser/banmanager/BanManager.java deleted file mode 100644 index a7a5f8b58..000000000 --- a/src/main/java/me/confuser/banmanager/BanManager.java +++ /dev/null @@ -1,462 +0,0 @@ -package me.confuser.banmanager; - -import com.j256.ormlite.jdbc.DataSourceConnectionSource; -import com.j256.ormlite.logger.LocalLog; -import com.j256.ormlite.support.ConnectionSource; -import com.zaxxer.hikari.HikariDataSource; -import lombok.Getter; -import me.confuser.banmanager.commands.*; -import me.confuser.banmanager.commands.global.*; -import me.confuser.banmanager.configs.*; -import me.confuser.banmanager.listeners.*; -import me.confuser.banmanager.runnables.*; -import me.confuser.banmanager.storage.*; -import me.confuser.banmanager.storage.global.*; -import me.confuser.banmanager.storage.mysql.ConvertMyISAMToInnoDb; -import me.confuser.banmanager.storage.mysql.MySQLDatabase; -import me.confuser.banmanager.util.DateUtils; -import me.confuser.banmanager.util.UpdateUtils; -import me.confuser.bukkitutil.BukkitPlugin; -import org.bukkit.event.Event; -import org.bukkit.event.EventException; -import org.bukkit.event.Listener; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.plugin.EventExecutor; - -import java.io.IOException; -import java.sql.SQLException; - -public class BanManager extends BukkitPlugin { - - @Getter - public static BanManager plugin; - @Getter - private ConnectionSource localConn; - private ConnectionSource globalConn; - - @Getter - private PlayerBanStorage playerBanStorage; - @Getter - private PlayerBanRecordStorage playerBanRecordStorage; - @Getter - private PlayerKickStorage playerKickStorage; - @Getter - private PlayerMuteStorage playerMuteStorage; - @Getter - private PlayerMuteRecordStorage playerMuteRecordStorage; - @Getter - private PlayerStorage playerStorage; - @Getter - private PlayerWarnStorage playerWarnStorage; - @Getter - private PlayerNoteStorage playerNoteStorage; - @Getter - private ActivityStorage activityStorage; - @Getter - private HistoryStorage historyStorage; - @Getter - private PlayerHistoryStorage playerHistoryStorage; - @Getter - private PlayerReportStorage playerReportStorage; - @Getter - private PlayerReportLocationStorage playerReportLocationStorage; - @Getter - private ReportStateStorage reportStateStorage; - @Getter - private PlayerReportCommandStorage playerReportCommandStorage; - @Getter - private PlayerReportCommentStorage playerReportCommentStorage; - @Getter - private RollbackStorage rollbackStorage; - - @Getter - private NameBanStorage nameBanStorage; - @Getter - private NameBanRecordStorage nameBanRecordStorage; - - @Getter - private IpBanStorage ipBanStorage; - @Getter - private IpBanRecordStorage ipBanRecordStorage; - @Getter - private IpMuteStorage ipMuteStorage; - @Getter - private IpMuteRecordStorage ipMuteRecordStorage; - @Getter - private IpRangeBanStorage ipRangeBanStorage; - @Getter - private IpRangeBanRecordStorage ipRangeBanRecordStorage; - - @Getter - private GlobalPlayerBanStorage globalPlayerBanStorage; - @Getter - private GlobalPlayerBanRecordStorage globalPlayerBanRecordStorage; - @Getter - private GlobalPlayerMuteStorage globalPlayerMuteStorage; - @Getter - private GlobalPlayerMuteRecordStorage globalPlayerMuteRecordStorage; - @Getter - private GlobalPlayerNoteStorage globalPlayerNoteStorage; - - @Getter - private GlobalIpBanStorage globalIpBanStorage; - @Getter - private GlobalIpBanRecordStorage globalIpBanRecordStorage; - - @Getter - private DefaultConfig configuration; - @Getter - private ConsoleConfig consoleConfig; - @Getter - private SchedulesConfig schedulesConfig; - @Getter - private ExemptionsConfig exemptionsConfig; - @Getter - private ReasonsConfig reasonsConfig; - @Getter - private GeoIpConfig geoIpConfig; - - @Getter - private Runner syncRunner; - - @Override - public void onEnable() { - plugin = this; - - setupConfigs(); - try { - if (!configuration.isDebugEnabled()) { - disableDatabaseLogging(); - } - - if (!setupConnections()) { - return; - } - - setupStorages(); - } catch (SQLException e) { - getLogger().warning("An error occurred attempting to make a database connection, please see stack trace below"); - plugin.getPluginLoader().disablePlugin(this); - e.printStackTrace(); - return; - } - - try { - long timeDiff = DateUtils.findTimeDiff(); - - if (timeDiff > 1) { - getLogger() - .severe("The time on your server and MySQL database are out by " + timeDiff + " seconds, this may cause syncing issues."); - } - } catch (SQLException e) { - getLogger().warning("An error occurred attempting to find the time difference, please see stack trace below"); - plugin.getPluginLoader().disablePlugin(this); - e.printStackTrace(); - } - - setupListeners(); - setupCommands(); - setupRunnables(); - } - - @Override - public void onDisable() { - getServer().getScheduler().cancelTasks(plugin); - - if (localConn != null) { - // Save all player histories - if (configuration.isLogIpsEnabled() && playerHistoryStorage != null) { - playerHistoryStorage.save(); - } - - localConn.closeQuietly(); - } - - if (globalConn != null) { - globalConn.closeQuietly(); - } - - } - - private void disableDatabaseLogging() { - System.setProperty(LocalLog.LOCAL_LOG_LEVEL_PROPERTY, "INFO"); - } - - @Override - public String getPermissionBase() { - return "bm"; - } - - @Override - public String getPluginFriendlyName() { - return "BanManager"; - } - - @Override - public void setupCommands() { - // Player bans - new BanCommand().register(); - new TempBanCommand().register(); - new UnbanCommand().register(); - - // Player mutes - new MuteCommand().register(); - new TempMuteCommand().register(); - new UnmuteCommand().register(); - - // IP Bans - new BanIpCommand().register(); - new TempIpBanCommand().register(); - new UnbanIpCommand().register(); - new BanIpRangeCommand().register(); - new TempIpRangeBanCommand().register(); - new UnbanIpRangeCommand().register(); - - // IP Mutes - new MuteIpCommand().register(); - new TempIpMuteCommand().register(); - new UnmuteIpCommand().register(); - - // Misc - new ExportCommand().register(); - new ImportCommand().register(); - new FindAltsCommand().register(); - new ReloadCommand().register(); - new InfoCommand().register(); - new BanListCommand().register(); - new ActivityCommand().register(); - - // Reports - new ReportCommand().register(); - new ReportsCommand().register(); - - // Kicks - new KickCommand().register(); - new LoglessKickCommand().register(); - - new BanNameCommand().register(); - new TempNameBanCommand().register(); - new UnbanNameCommand().register(); - - new WarnCommand().register(); - new TempWarnCommand().register(); - new DeleteLastWarningCommand().register(); - - new AddNoteCommand().register(); - new NotesCommand().register(); - - new ClearCommand().register(); - new DeleteCommand().register(); - new RollbackCommand().register(); - - new SyncCommand().register(); - - new ReasonsCommand().register(); - - new UtilsCommand().register(); - - if (globalConn == null) return; - - new BanAllCommand().register(); - new TempBanAllCommand().register(); - new UnbanAllCommand().register(); - - new MuteAllCommand().register(); - new TempMuteAllCommand().register(); - new UnmuteAllCommand().register(); - - new BanIpAllCommand().register(); - new TempBanIpAllCommand().register(); - new UnbanIpAllCommand().register(); - - new AddNoteAllCommand().register(); - } - - @Override - public void setupConfigs() { - new MessagesConfig().load(); - - configuration = new DefaultConfig(); - configuration.load(); - - consoleConfig = new ConsoleConfig(); - consoleConfig.load(); - - schedulesConfig = new SchedulesConfig(); - schedulesConfig.load(); - - exemptionsConfig = new ExemptionsConfig(); - exemptionsConfig.load(); - - reasonsConfig = new ReasonsConfig(); - reasonsConfig.load(); - - geoIpConfig = new GeoIpConfig(); - geoIpConfig.load(); - } - - public boolean setupConnections() throws SQLException { - if (!configuration.getLocalDb().isEnabled()) { - getLogger().warning("Local Database is not enabled, disabling plugin"); - plugin.getPluginLoader().disablePlugin(this); - return false; - } - - localConn = setupConnection(configuration.getLocalDb(), "bm-local"); - - if (configuration.getGlobalDb().isEnabled()) { - globalConn = setupConnection(configuration.getGlobalDb(), "bm-global"); - } - - return true; - } - - private ConnectionSource setupConnection(DatabaseConfig dbConfig, String type) throws SQLException { - HikariDataSource ds = new HikariDataSource(); - - if (!dbConfig.getUser().isEmpty()) { - ds.setUsername(dbConfig.getUser()); - } - if (!dbConfig.getPassword().isEmpty()) { - ds.setPassword(dbConfig.getPassword()); - } - - ds.setJdbcUrl(dbConfig.getJDBCUrl()); - ds.setMaximumPoolSize(dbConfig.getMaxConnections()); - ds.setMinimumIdle(2); - ds.setPoolName(type); - - if (dbConfig.getLeakDetection() != 0) ds.setLeakDetectionThreshold(dbConfig.getLeakDetection()); - - ds.addDataSourceProperty("prepStmtCacheSize", "250"); - ds.addDataSourceProperty("prepStmtCacheSqlLimit", "2048"); - ds.addDataSourceProperty("cachePrepStmts", "true"); - - return new DataSourceConnectionSource(ds, new MySQLDatabase()); - } - - @SuppressWarnings("unchecked") - public void setupStorages() throws SQLException { - // TODO Refactor this - new ConvertMyISAMToInnoDb(localConn, getConfiguration().getLocalDb().getTables()); // Convert to InnoDb if MyISAM - - playerStorage = new PlayerStorage(localConn); - playerBanStorage = new PlayerBanStorage(localConn); - playerBanRecordStorage = new PlayerBanRecordStorage(localConn); - playerMuteStorage = new PlayerMuteStorage(localConn); - playerMuteRecordStorage = new PlayerMuteRecordStorage(localConn); - playerWarnStorage = new PlayerWarnStorage(localConn); - playerKickStorage = new PlayerKickStorage(localConn); - playerNoteStorage = new PlayerNoteStorage(localConn); - playerHistoryStorage = new PlayerHistoryStorage(localConn); - reportStateStorage = new ReportStateStorage(localConn); - playerReportCommandStorage = new PlayerReportCommandStorage(localConn); - playerReportCommentStorage = new PlayerReportCommentStorage(localConn); - playerReportStorage = new PlayerReportStorage(localConn); - playerReportLocationStorage = new PlayerReportLocationStorage(localConn); - - ipBanStorage = new IpBanStorage(localConn); - ipBanRecordStorage = new IpBanRecordStorage(localConn); - ipMuteStorage = new IpMuteStorage(localConn); - ipMuteRecordStorage = new IpMuteRecordStorage(localConn); - ipRangeBanStorage = new IpRangeBanStorage(localConn); - ipRangeBanRecordStorage = new IpRangeBanRecordStorage(localConn); - - activityStorage = new ActivityStorage(localConn); - historyStorage = new HistoryStorage(localConn); - rollbackStorage = new RollbackStorage(localConn); - - nameBanStorage = new NameBanStorage(localConn); - nameBanRecordStorage = new NameBanRecordStorage(localConn); - - if (globalConn == null) { - return; - } - - new ConvertMyISAMToInnoDb(globalConn, getConfiguration().getGlobalDb().getTables()); // Convert to InnoDb if MyISAM - - globalPlayerBanStorage = new GlobalPlayerBanStorage(globalConn); - globalPlayerBanRecordStorage = new GlobalPlayerBanRecordStorage(globalConn); - globalPlayerMuteStorage = new GlobalPlayerMuteStorage(globalConn); - globalPlayerMuteRecordStorage = new GlobalPlayerMuteRecordStorage(globalConn); - globalPlayerNoteStorage = new GlobalPlayerNoteStorage(globalConn); - globalIpBanStorage = new GlobalIpBanStorage(globalConn); - globalIpBanRecordStorage = new GlobalIpBanRecordStorage(globalConn); - } - - @Override - public void setupListeners() { - new JoinListener().register(); - new LeaveListener().register(); - new CommandListener().register(); - new HookListener().register(); - - ChatListener chatListener = new ChatListener(); - - // Set custom priority - getServer().getPluginManager().registerEvent(AsyncPlayerChatEvent.class, chatListener, configuration - .getChatPriority(), new EventExecutor() { - - @Override - public void execute(Listener listener, Event event) throws EventException { - ((ChatListener) listener).onPlayerChat((AsyncPlayerChatEvent) event); - ((ChatListener) listener).onIpChat((AsyncPlayerChatEvent) event); - } - }, plugin); - - if (configuration.isDisplayNotificationsEnabled()) { - new BanListener().register(); - new MuteListener().register(); - new NoteListener().register(); - new ReportListener().register(); - } - } - - @Override - public void setupRunnables() { - if (globalConn == null) { - syncRunner = new Runner(new BanSync(), new MuteSync(), new IpSync(), new IpRangeSync(), new ExpiresSync(), - new WarningSync(), new RollbackSync(), new NameSync()); - } else { - syncRunner = new Runner(new BanSync(), new MuteSync(), new IpSync(), new IpRangeSync(), new ExpiresSync(), - new WarningSync(), new RollbackSync(), new NameSync(), - new GlobalBanSync(), new GlobalMuteSync(), new GlobalIpSync(), new GlobalNoteSync()); - } - - setupAsyncRunnable(10L, syncRunner); - - /* - * This task should be ran last with a 1L offset as it gets modified - * above. - */ - setupAsyncRunnable((schedulesConfig.getSchedule("saveLastChecked") * 20L) + 1L, new SaveLastChecked()); - - // Purge - getServer().getScheduler().runTaskAsynchronously(plugin, new Purge()); - - // TODO Refactor - if (!getConfiguration().isCheckForUpdates()) return; - - getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() { - - @Override - public void run() { - if (UpdateUtils.isUpdateAvailable(getFile())) { - getServer().getScheduler().runTask(plugin, new Runnable() { - - @Override - public void run() { - new UpdateListener().register(); - } - }); - } - } - }); - } - - private void setupAsyncRunnable(long length, Runnable runnable) { - if (length <= 0) return; - - getServer().getScheduler().runTaskTimerAsynchronously(plugin, runnable, length, length); - } -} diff --git a/src/main/java/me/confuser/banmanager/BmAPI.java b/src/main/java/me/confuser/banmanager/BmAPI.java deleted file mode 100644 index cc447d916..000000000 --- a/src/main/java/me/confuser/banmanager/BmAPI.java +++ /dev/null @@ -1,682 +0,0 @@ -package me.confuser.banmanager; - -import com.j256.ormlite.dao.CloseableIterator; -import com.j256.ormlite.support.ConnectionSource; -import me.confuser.banmanager.data.*; -import me.confuser.banmanager.util.IPUtils; -import me.confuser.banmanager.util.UUIDUtils; -import me.confuser.bukkitutil.Message; -import org.bukkit.entity.Player; - -import java.sql.SQLException; -import java.util.UUID; - -/** - * This is a static API for BanManager. - * No methods are thread safe unless stated otherwise. - *

- * Note: The API does not handle the notifications to players - * nor permission checks for exemptions. - * - * @author James Mortemore - */ -public class BmAPI { - - private static BanManager plugin = BanManager.getPlugin(); - - /** - * @param uuid - * - * @return PlayerData - * - * @throws SQLException - */ - public static PlayerData getPlayer(UUID uuid) throws SQLException { - return plugin.getPlayerStorage().queryForId(UUIDUtils.toBytes(uuid)); - } - - /** - * @param player - * - * @return PlayerData - * - * @throws SQLException - */ - public static PlayerData getPlayer(Player player) throws SQLException { - return getPlayer(UUIDUtils.getUUID(player)); - } - - /** - * @param name - * - * @return PlayerData - * - * @throws SQLException - */ - public static PlayerData getPlayer(String name) throws SQLException { - return plugin.getPlayerStorage().retrieve(name, false); - } - - /** - * Get the console for use as an actor - * - * @return - */ - public static PlayerData getConsole() { - return plugin.getPlayerStorage().getConsole(); - } - - /** - * Convert an ip string of x.x.x.x to long - * - * @param ip - * - * @return - */ - public static long ipToStr(String ip) { - return IPUtils.toLong(ip); - } - - /** - * Permanently ban a player. - * You must handle kicking the player if they are online. - * - * @param ban - PlayerBanData - * @param silent - * - * @throws SQLException - */ - public static boolean ban(PlayerBanData ban, boolean silent) throws SQLException { - return plugin.getPlayerBanStorage().ban(ban, silent); - } - - /** - * Permanently ban a player. - * You must handle kicking the player if they are online. - * - * @param ban - PlayerBanData - * - * @throws SQLException - */ - public static boolean ban(PlayerBanData ban) throws SQLException { - return ban(ban, false); - } - - /** - * Permanently ban a player. - * You must handle kicking the player if they are online. - * - * @param player - Player to ban - * @param actor - Who the ban is by - * @param reason - Why they are banned - * - * @throws SQLException - */ - public static boolean ban(PlayerData player, PlayerData actor, String reason) throws SQLException { - return ban(new PlayerBanData(player, actor, reason)); - } - - /** - * Permanently ban a player. - * You must handle kicking the player if they are online. - * - * @param player - Player to ban - * @param actor - Who the ban is by - * @param reason - Why they are banned - * @param silent - * - * @throws SQLException - */ - public static boolean ban(PlayerData player, PlayerData actor, String reason, boolean silent) throws SQLException { - return ban(new PlayerBanData(player, actor, reason), silent); - } - - /** - * Temporarily ban a player - * You must handle kicking the player if they are online. - * - * @param player - Player to ban - * @param actor - Who the ban is by - * @param reason - Why they are banned - * @param expires - Unix Timestamp stating the time of when the ban ends - * - * @throws SQLException - */ - public static boolean ban(PlayerData player, PlayerData actor, String reason, long expires) throws SQLException { - return ban(new PlayerBanData(player, actor, reason, expires)); - } - - /** - * Temporarily ban a player - * You must handle kicking the player if they are online. - * - * @param player - Player to ban - * @param actor - Who the ban is by - * @param reason - Why they are banned - * @param expires - Unix Timestamp stating the time of when the ban ends - * @param silent - * - * @throws SQLException - */ - public static boolean ban(PlayerData player, PlayerData actor, String reason, long expires, boolean silent) throws - SQLException { - return ban(new PlayerBanData(player, actor, reason, expires), silent); - } - - /** - * @param ban - * @param actor - * - * @return - * - * @throws SQLException - */ - public static boolean unban(PlayerBanData ban, PlayerData actor) throws SQLException { - return plugin.getPlayerBanStorage().unban(ban, actor); - } - - /** - * Thread safe - * - * @param uuid - * - * @return - */ - public static boolean isBanned(UUID uuid) { - return plugin.getPlayerBanStorage().isBanned(uuid); - } - - /** - * Thread safe - * - * @param player - * - * @return - */ - public static boolean isBanned(Player player) { - return isBanned(UUIDUtils.getUUID(player)); - } - - /** - * Thread safe - * - * @param name - * - * @return - */ - public static boolean isBanned(String name) { - return plugin.getPlayerBanStorage().isBanned(name); - } - - - /** - * Thread safe - * - * @param name - * - * @return - */ - public static PlayerBanData getCurrentBan(String name) { - return plugin.getPlayerBanStorage().getBan(name); - } - - /** - * Thread safe - * - * @param uuid - * - * @return - */ - public static PlayerBanData getCurrentBan(UUID uuid) { - return plugin.getPlayerBanStorage().getBan(uuid); - } - - /** - * Thread safe - * - * @param uuid - * - * @return - */ - public static PlayerBanData getCurrentBan(Player player) { - return plugin.getPlayerBanStorage().getBan(UUIDUtils.getUUID(player)); - } - - - /** - * @param player - * - * @return - * - * @throws SQLException - */ - public static CloseableIterator getBanRecords(PlayerData player) throws SQLException { - return plugin.getPlayerBanRecordStorage().getRecords(player); - } - - /** - * Permanently mute a player. - * You must handle kicking the player if they are online. - * - * @param mute - PlayerMuteData - * - * @throws SQLException - */ - public static boolean mute(PlayerMuteData mute) throws SQLException { - return mute(mute, false); - } - - /** - * Permanently mute a player. - * You must handle kicking the player if they are online. - * - * @param mute - PlayerMuteData - * @param silent - * - * @throws SQLException - */ - public static boolean mute(PlayerMuteData mute, boolean silent) throws SQLException { - return plugin.getPlayerMuteStorage().mute(mute, silent); - } - - /** - * Permanently mute a player. - * You must handle kicking the player if they are online. - * - * @param player - Player to mute - * @param actor - Who the mute is by - * @param reason - Why they are mutened - * - * @throws SQLException - */ - public static boolean mute(PlayerData player, PlayerData actor, String reason) throws SQLException { - return mute(new PlayerMuteData(player, actor, reason, false)); - } - - /** - * Permanently mute a player. - * You must handle kicking the player if they are online. - * - * @param player - Player to mute - * @param actor - Who the mute is by - * @param reason - Why they are mutened - * @param silent - * - * @throws SQLException - */ - public static boolean mute(PlayerData player, PlayerData actor, String reason, boolean silent) throws SQLException { - return mute(new PlayerMuteData(player, actor, reason, false), silent); - } - - /** - * Permanently mute a player. - * You must handle kicking the player if they are online. - * - * @param player - Player to mute - * @param actor - Who the mute is by - * @param reason - Why they are mutened - * @param silent - * @param isSoft - * - * @throws SQLException - */ - public static boolean mute(PlayerData player, PlayerData actor, String reason, boolean silent, boolean isSoft) throws SQLException { - return mute(new PlayerMuteData(player, actor, reason, isSoft), silent); - } - - - /** - * Temporarily mute a player - * You must handle kicking the player if they are online. - * - * @param player - Player to mute - * @param actor - Who the mute is by - * @param reason - Why they are mutened - * @param expires - Unix Timestamp stating the time of when the mute ends - * - * @throws SQLException - */ - public static boolean mute(PlayerData player, PlayerData actor, String reason, long expires) throws SQLException { - return mute(new PlayerMuteData(player, actor, reason, false, expires)); - } - - /** - * Temporarily mute a player - * You must handle kicking the player if they are online. - * - * @param player - Player to mute - * @param actor - Who the mute is by - * @param reason - Why they are mutened - * @param expires - Unix Timestamp stating the time of when the mute ends - * @param silent - * - * @throws SQLException - */ - public static boolean mute(PlayerData player, PlayerData actor, String reason, long expires, boolean silent) throws - SQLException { - return mute(new PlayerMuteData(player, actor, reason, false, expires), silent); - } - - /** - * Temporarily mute a player - * You must handle kicking the player if they are online. - * - * @param player - Player to mute - * @param actor - Who the mute is by - * @param reason - Why they are mutened - * @param expires - Unix Timestamp stating the time of when the mute ends - * @param silent - * - * @throws SQLException - */ - public static boolean mute(PlayerData player, PlayerData actor, String reason, long expires, boolean silent, boolean isSoft) throws - SQLException { - return mute(new PlayerMuteData(player, actor, reason, isSoft, expires), silent); - } - - - /** - * @param mute - * @param actor - * - * @return - * - * @throws SQLException - */ - public static boolean unmute(PlayerMuteData mute, PlayerData actor) throws SQLException { - return plugin.getPlayerMuteStorage().unmute(mute, actor); - } - - /** - * Thread safe - * - * @param uuid - * - * @return - */ - public static boolean isMuted(UUID uuid) { - return plugin.getPlayerMuteStorage().isMuted(uuid); - } - - /** - * Thread safe - * - * @param player - * - * @return - */ - public static boolean isMuted(Player player) { - return isMuted(UUIDUtils.getUUID(player)); - } - - /** - * Thread safe - * - * @param name - * - * @return - */ - public static boolean isMuted(String name) { - return plugin.getPlayerMuteStorage().isMuted(name); - } - - - /** - * Thread safe - * - * @param name - * - * @return - */ - public static PlayerMuteData getCurrentMute(String name) { - return plugin.getPlayerMuteStorage().getMute(name); - } - - /** - * Thread safe - * - * @param uuid - * - * @return - */ - public static PlayerMuteData getCurrentMute(UUID uuid) { - return plugin.getPlayerMuteStorage().getMute(uuid); - } - - /** - * Thread safe - * - * @param uuid - * - * @return - */ - public static PlayerMuteData getCurrentMute(Player player) { - return plugin.getPlayerMuteStorage().getMute(UUIDUtils.getUUID(player)); - } - - - /** - * @param player - * - * @return - * - * @throws SQLException - */ - public static CloseableIterator getMuteRecords(PlayerData player) throws SQLException { - return plugin.getPlayerMuteRecordStorage().getRecords(player); - } - - /** - * Permanently ban an ip. - * You must handle kicking the player if they are online. - * - * @param ban - IpBanData - * @param silent - * - * @throws SQLException - */ - public static boolean ban(IpBanData ban, boolean silent) throws SQLException { - return plugin.getIpBanStorage().ban(ban, silent); - } - - /** - * Permanently ban an ip. - * You must handle kicking the player if they are online. - * - * @param ban - IpBanData - * - * @throws SQLException - */ - public static boolean ban(IpBanData ban) throws SQLException { - return ban(ban, false); - } - - /** - * Permanently ban an ip. - * You must handle kicking the player if they are online. - * - * @param ip - IP to ban, use ipToLong to convert x.x.x.x to Long - * @param actor - Who the ban is by - * @param reason - Why they are banned - * - * @throws SQLException - */ - public static boolean ban(long ip, PlayerData actor, String reason) throws SQLException { - return ban(new IpBanData(ip, actor, reason)); - } - - /** - * Permanently ban an ip. - * You must handle kicking the player if they are online. - * - * @param ip - IP to ban, use ipToLong to convert x.x.x.x to Long - * @param actor - Who the ban is by - * @param reason - Why they are banned - * @param silent - * - * @throws SQLException - */ - public static boolean ban(long ip, PlayerData actor, String reason, boolean silent) throws SQLException { - return ban(new IpBanData(ip, actor, reason), silent); - } - - /** - * Temporarily ban an ip - * You must handle kicking the player if they are online. - * - * @param ip - IP to ban, use ipToLong to convert x.x.x.x to Long - * @param actor - Who the ban is by - * @param reason - Why they are banned - * @param expires - Unix Timestamp stating the time of when the ban ends - * - * @throws SQLException - */ - public static boolean ban(long ip, PlayerData actor, String reason, long expires) throws SQLException { - return ban(new IpBanData(ip, actor, reason, expires)); - } - - /** - * Temporarily ban an ip - * You must handle kicking the player if they are online. - * - * @param ip - IP to ban, use ipToLong to convert x.x.x.x to Long - * @param actor - Who the ban is by - * @param reason - Why they are banned - * @param expires - Unix Timestamp stating the time of when the ban ends - * @param silent - * - * @throws SQLException - */ - public static boolean ban(long ip, PlayerData actor, String reason, long expires, boolean silent) throws - SQLException { - return ban(new IpBanData(ip, actor, reason, expires), silent); - } - - /** - * @param ban - * @param actor - * - * @return - * - * @throws SQLException - */ - public static boolean unban(IpBanData ban, PlayerData actor) throws SQLException { - return plugin.getIpBanStorage().unban(ban, actor); - } - - /** - * Thread safe - * - * @param ip - IP to ban, use ipToLong to convert x.x.x.x to Long - * - * @return - */ - public static boolean isBanned(long ip) { - return plugin.getIpBanStorage().isBanned(ip); - } - - /** - * Thread safe - * - * @param name - * - * @return - */ - public static IpBanData getCurrentBan(long ip) { - return plugin.getIpBanStorage().getBan(ip); - } - - /** - * @param player - * - * @return - * - * @throws SQLException - */ - public static CloseableIterator getBanRecords(long ip) throws SQLException { - return plugin.getIpBanRecordStorage().getRecords(ip); - } - - /** - * Warn a player. - * You must handle the notification to the warned player yourself. - * - * @param player - * @param actor - * @param reason - * @param read - * - * @throws SQLException - */ - public static void warn(PlayerData player, PlayerData actor, String reason, boolean read) throws SQLException { - warn(new PlayerWarnData(player, actor, reason, 1, read)); - } - - /** - * Warn a player. - * You must handle the notification to the warned player yourself. - * - * @param player - * @param actor - * @param reason - * @param read - * @param silent - * - * @throws SQLException - */ - public static void warn(PlayerData player, PlayerData actor, String reason, boolean read, boolean silent) throws - SQLException { - warn(new PlayerWarnData(player, actor, reason, 1, read), silent); - } - - /** - * Warn a player. - * You must handle the notification to the warned player yourself. - * - * @param data - * - * @throws SQLException - */ - public static void warn(PlayerWarnData data) throws SQLException { - warn(data, false); - } - - /** - * Warn a player. - * You must handle the notification to the warned player yourself. - * - * @param data - * - * @throws SQLException - */ - public static void warn(PlayerWarnData data, boolean silent) throws SQLException { - plugin.getPlayerWarnStorage().addWarning(data, silent); - } - - /** - * Retrieve past warnings of a player. - * This method is not thread safe and should not be called on the main thread. - * - * @param player - * - * @return ArrayList containing data on all warnings - * - * @throws SQLException - */ - public static CloseableIterator getWarnings(PlayerData player) throws SQLException { - return plugin.getPlayerWarnStorage().getWarnings(player); - } - - /** - * @param key - The message config node - * - * @return String - */ - public static Message getMessage(String key) { - return Message.get(key); - } - - public static ConnectionSource getLocalConnection() { - return plugin.getLocalConn(); - } -} diff --git a/src/main/java/me/confuser/banmanager/commands/ActivityCommand.java b/src/main/java/me/confuser/banmanager/commands/ActivityCommand.java deleted file mode 100644 index e68a48e41..000000000 --- a/src/main/java/me/confuser/banmanager/commands/ActivityCommand.java +++ /dev/null @@ -1,99 +0,0 @@ -package me.confuser.banmanager.commands; - -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.util.DateUtils; -import me.confuser.banmanager.util.UUIDUtils; -import me.confuser.bukkitutil.Message; -import org.apache.commons.lang.time.FastDateFormat; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; - -import java.sql.SQLException; -import java.util.List; -import java.util.Map; -import java.util.UUID; - -public class ActivityCommand extends AutoCompleteNameTabCommand { - - public ActivityCommand() { - super("bmactivity"); - } - - @Override - public boolean onCommand(final CommandSender sender, Command command, String commandName, final String[] args) { - - if (args.length == 0 || args.length > 2) { - return false; - } - - long sinceCheck; - - try { - sinceCheck = DateUtils.parseDateDiff(args[0], false); - } catch (Exception e1) { - sender.sendMessage(Message.get("time.error.invalid").toString()); - return true; - } - - final long since = sinceCheck; - - plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() { - - @Override - public void run() { - List> results; - String messageType = "bmactivity.row.all"; - - if (args.length == 2) { - messageType = "bmactivity.row.player"; - - PlayerData player = null; - final boolean isUUID = args[1].length() > 16; - - if (isUUID) { - try { - player = plugin.getPlayerStorage().queryForId(UUIDUtils.toBytes(UUID.fromString(args[1]))); - } catch (SQLException e) { - e.printStackTrace(); - } - } else { - player = plugin.getPlayerStorage().retrieve(args[1], false); - } - - if (player == null) { - sender.sendMessage(Message.get("sender.error.notFound").set("player", args[1]).toString()); - return; - } - - results = plugin.getActivityStorage().getSince(since, player); - } else { - results = plugin.getActivityStorage().getSince(since); - } - - if (results == null || results.size() == 0) { - Message.get("bmactivity.noResults").sendTo(sender); - return; - } - - String dateTimeFormat = Message.getString("bmactivity.row.dateTimeFormat"); - FastDateFormat dateFormatter = FastDateFormat.getInstance(dateTimeFormat); - - for (Map result : results) { - Message message = Message.get(messageType) - .set("player", (String) result.get("player")) - .set("type", (String) result.get("type")) - .set("created", dateFormatter - .format((long) result.get("created") * 1000L)); - - if (result.get("actor") != null) message.set("actor", (String) result.get("actor")); - - message.sendTo(sender); - } - } - - }); - - return true; - } -} diff --git a/src/main/java/me/confuser/banmanager/commands/AddNoteCommand.java b/src/main/java/me/confuser/banmanager/commands/AddNoteCommand.java deleted file mode 100644 index e79c4a32a..000000000 --- a/src/main/java/me/confuser/banmanager/commands/AddNoteCommand.java +++ /dev/null @@ -1,71 +0,0 @@ -package me.confuser.banmanager.commands; - -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.data.PlayerNoteData; -import me.confuser.banmanager.util.CommandUtils; -import me.confuser.banmanager.util.UUIDUtils; -import me.confuser.bukkitutil.Message; -import org.apache.commons.lang.StringUtils; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.sql.SQLException; -import java.util.UUID; - -public class AddNoteCommand extends AutoCompleteNameTabCommand { - - public AddNoteCommand() { - super("addnote"); - } - - @Override - public boolean onCommand(final CommandSender sender, Command command, String commandName, String[] args) { - if (args.length < 2) { - return false; - } - - if (CommandUtils.isValidNameDelimiter(args[0])) { - CommandUtils.handleMultipleNames(sender, commandName, args); - return true; - } - - if (args[0].equalsIgnoreCase(sender.getName())) { - sender.sendMessage(Message.getString("sender.error.noSelf")); - return true; - } - - // Check if UUID vs name - final String playerName = args[0]; - final boolean isUUID = playerName.length() > 16; - final String message = StringUtils.join(args, " ", 1, args.length); - - plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() { - - @Override - public void run() { - final PlayerData player = CommandUtils.getPlayer(sender, playerName); - - if (player == null) { - sender.sendMessage(Message.get("sender.error.notFound").set("player", playerName).toString()); - return; - } - - final PlayerData actor = CommandUtils.getActor(sender); - final PlayerNoteData warning = new PlayerNoteData(player, actor, message); - - try { - plugin.getPlayerNoteStorage().addNote(warning); - } catch (SQLException e) { - sender.sendMessage(Message.get("sender.error.exception").toString()); - e.printStackTrace(); - } - - } - - }); - - return true; - } -} diff --git a/src/main/java/me/confuser/banmanager/commands/AutoCompleteNameTabCommand.java b/src/main/java/me/confuser/banmanager/commands/AutoCompleteNameTabCommand.java deleted file mode 100644 index d12d97a99..000000000 --- a/src/main/java/me/confuser/banmanager/commands/AutoCompleteNameTabCommand.java +++ /dev/null @@ -1,63 +0,0 @@ -package me.confuser.banmanager.commands; - -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.util.CommandUtils; -import me.confuser.bukkitutil.commands.BukkitCommand; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.command.TabCompleter; -import org.bukkit.entity.Player; - -import java.util.ArrayList; -import java.util.List; - -public abstract class AutoCompleteNameTabCommand extends BukkitCommand implements TabCompleter { - - public AutoCompleteNameTabCommand(String name) { - super(name); - } - - @Override - public List onTabComplete(CommandSender sender, Command command, String commandName, String[] args) { - ArrayList mostLike = new ArrayList<>(); - - if (command.getPermission() == null || !sender.hasPermission(command.getPermission())) return mostLike; - if (args.length != 1) return mostLike; - - if (CommandUtils.isValidNameDelimiter(args[0])) { - String[] names = CommandUtils.splitNameDelimiter(args[0]); - - String lookup = names[names.length - 1]; - - if (plugin.getConfiguration().isOfflineAutoComplete()) { - for (CharSequence charSequence : plugin.getPlayerStorage().getAutoCompleteTree().getKeysStartingWith(lookup)) { - mostLike.add(args[0] + charSequence.toString().substring(lookup.length())); - } - } else { - Player senderPlayer = sender instanceof Player ? (Player) sender : null; - String lower = lookup.toLowerCase(); - for (Player player : plugin.getServer().getOnlinePlayers()) { - if ((senderPlayer == null || senderPlayer.canSee(player)) && player.getName().toLowerCase().startsWith(lower)) { - } - } - } - - } else if (plugin.getConfiguration().isOfflineAutoComplete()) { - for (CharSequence charSequence : plugin.getPlayerStorage().getAutoCompleteTree().getKeysStartingWith(args[0])) { - mostLike.add(charSequence.toString()); - } - } else { - Player senderPlayer = sender instanceof Player ? (Player) sender : null; - String lower = args[0].toLowerCase(); - for (Player player : plugin.getServer().getOnlinePlayers()) { - if ((senderPlayer == null || senderPlayer.canSee(player)) && player.getName().toLowerCase().startsWith(lower)) { - mostLike.add(player.getName()); - } - } - } - - if (mostLike.size() > 100) return mostLike.subList(0, 99); - - return mostLike; - } -} diff --git a/src/main/java/me/confuser/banmanager/commands/BanCommand.java b/src/main/java/me/confuser/banmanager/commands/BanCommand.java deleted file mode 100644 index e97d52a99..000000000 --- a/src/main/java/me/confuser/banmanager/commands/BanCommand.java +++ /dev/null @@ -1,174 +0,0 @@ -package me.confuser.banmanager.commands; - -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.PlayerBanData; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.util.CommandParser; -import me.confuser.banmanager.util.CommandUtils; -import me.confuser.banmanager.util.parsers.Reason; -import me.confuser.bukkitutil.Message; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.sql.SQLException; -import java.util.UUID; - -public class BanCommand extends AutoCompleteNameTabCommand { - - public BanCommand() { - super("ban"); - } - - @Override - public boolean onCommand(final CommandSender sender, Command command, String commandName, String[] args) { - CommandParser parser = new CommandParser(args, 1); - args = parser.getArgs(); - final boolean isSilent = parser.isSilent(); - - if (isSilent && !sender.hasPermission(command.getPermission() + ".silent")) { - sender.sendMessage(Message.getString("sender.error.noPermission")); - return true; - } - - if (args.length < 2) { - return false; - } - - if (CommandUtils.isValidNameDelimiter(args[0])) { - CommandUtils.handleMultipleNames(sender, commandName, args); - return true; - } - - if (args[0].equalsIgnoreCase(sender.getName())) { - sender.sendMessage(Message.getString("sender.error.noSelf")); - return true; - } - - // Check if UUID vs name - final String playerName = args[0]; - final boolean isUUID = playerName.length() > 16; - final boolean isBanned; - - if (isUUID) { - try { - isBanned = plugin.getPlayerBanStorage().isBanned(UUID.fromString(playerName)); - } catch (IllegalArgumentException e) { - sender.sendMessage(Message.get("sender.error.notFound").set("player", playerName).toString()); - return true; - } - } else { - isBanned = plugin.getPlayerBanStorage().isBanned(playerName); - } - - if (isBanned && !sender.hasPermission("bm.command.ban.override")) { - Message message = Message.get("ban.error.exists"); - message.set("player", playerName); - - sender.sendMessage(message.toString()); - return true; - } - - final Player onlinePlayer; - - if (isUUID) { - onlinePlayer = plugin.getServer().getPlayer(UUID.fromString(playerName)); - } else { - onlinePlayer = plugin.getServer().getPlayer(playerName); - } - - if (onlinePlayer == null) { - if (!sender.hasPermission("bm.command.ban.offline")) { - sender.sendMessage(Message.getString("sender.error.offlinePermission")); - return true; - } - } else if (!sender.hasPermission("bm.exempt.override.ban") && onlinePlayer.hasPermission("bm.exempt.ban")) { - Message.get("sender.error.exempt").set("player", onlinePlayer.getName()).sendTo(sender); - return true; - } - - final Reason reason = parser.getReason(); - - plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() { - - @Override - public void run() { - final PlayerData player = CommandUtils.getPlayer(sender, playerName); - - if (player == null) { - sender.sendMessage(Message.get("sender.error.notFound").set("player", playerName).toString()); - return; - } - - if (plugin.getExemptionsConfig().isExempt(player, "ban")) { - sender.sendMessage(Message.get("sender.error.exempt").set("player", playerName).toString()); - return; - } - - final PlayerData actor = CommandUtils.getActor(sender); - - if (actor == null) return; - - if (isBanned) { - PlayerBanData ban; - - if (isUUID) { - ban = plugin.getPlayerBanStorage().getBan(UUID.fromString(playerName)); - } else { - ban = plugin.getPlayerBanStorage().getBan(playerName); - } - - if (ban != null) { - try { - plugin.getPlayerBanStorage().unban(ban, actor); - } catch (SQLException e) { - sender.sendMessage(Message.get("sender.error.exception").toString()); - e.printStackTrace(); - return; - } - } - } - - final PlayerBanData ban = new PlayerBanData(player, actor, reason.getMessage()); - boolean created; - - try { - created = plugin.getPlayerBanStorage().ban(ban, isSilent); - } catch (SQLException e) { - CommandUtils.handlePunishmentCreateException(e, sender, Message.get("ban.error.exists").set("player", - playerName)); - return; - } - - if (!created) { - return; - } - - CommandUtils.handlePrivateNotes(player, actor, reason); - - plugin.getServer().getScheduler().runTask(plugin, new Runnable() { - - @Override - public void run() { - if (onlinePlayer == null) return; - - Message kickMessage = Message.get("ban.player.kick") - .set("displayName", onlinePlayer.getDisplayName()) - .set("player", player.getName()) - .set("playerId", player.getUUID().toString()) - .set("reason", ban.getReason()) - .set("actor", actor.getName()); - - onlinePlayer.kickPlayer(kickMessage.toString()); - } - }); - - } - - }); - - return true; - } - - -} diff --git a/src/main/java/me/confuser/banmanager/commands/BanIpCommand.java b/src/main/java/me/confuser/banmanager/commands/BanIpCommand.java deleted file mode 100644 index 9052f9f33..000000000 --- a/src/main/java/me/confuser/banmanager/commands/BanIpCommand.java +++ /dev/null @@ -1,143 +0,0 @@ -package me.confuser.banmanager.commands; - -import com.google.common.net.InetAddresses; -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.IpBanData; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.util.CommandParser; -import me.confuser.banmanager.util.CommandUtils; -import me.confuser.banmanager.util.IPUtils; -import me.confuser.banmanager.util.parsers.Reason; -import me.confuser.bukkitutil.Message; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.sql.SQLException; - -public class BanIpCommand extends AutoCompleteNameTabCommand { - - public BanIpCommand() { - super("banip"); - } - - @Override - public boolean onCommand(final CommandSender sender, Command command, String commandName, String[] args) { - CommandParser parser = new CommandParser(args, 1); - args = parser.getArgs(); - final boolean isSilent = parser.isSilent(); - - if (isSilent && !sender.hasPermission(command.getPermission() + ".silent")) { - sender.sendMessage(Message.getString("sender.error.noPermission")); - return true; - } - - if (args.length < 2) { - return false; - } - - if (CommandUtils.isValidNameDelimiter(args[0])) { - CommandUtils.handleMultipleNames(sender, commandName, args); - return true; - } - - final String ipStr = args[0]; - final boolean isName = !InetAddresses.isInetAddress(ipStr); - - if (isName && ipStr.length() > 16) { - Message message = Message.get("sender.error.invalidIp"); - message.set("ip", ipStr); - - sender.sendMessage(message.toString()); - return true; - } - - if (isName) { - Player onlinePlayer = plugin.getServer().getPlayer(ipStr); - - if (onlinePlayer != null && !sender.hasPermission("bm.exempt.override.banip") - && onlinePlayer.hasPermission("bm.exempt.banip")) { - Message.get("sender.error.exempt").set("player", onlinePlayer.getName()).sendTo(sender); - return true; - } - } - - final Reason reason = parser.getReason(); - - plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() { - - @Override - public void run() { - final Long ip = CommandUtils.getIp(ipStr); - - if (ip == null) { - sender.sendMessage(Message.get("sender.error.notFound").set("player", ipStr).toString()); - return; - } - - final boolean isBanned = plugin.getIpBanStorage().isBanned(ip); - - if (isBanned && !sender.hasPermission("bm.command.banip.override")) { - Message message = Message.get("banip.error.exists"); - message.set("ip", ipStr); - - sender.sendMessage(message.toString()); - return; - } - - final PlayerData actor = CommandUtils.getActor(sender); - - if (actor == null) return; - - if (isBanned) { - IpBanData ban = plugin.getIpBanStorage().getBan(ip); - - if (ban != null) { - try { - plugin.getIpBanStorage().unban(ban, actor); - } catch (SQLException e) { - sender.sendMessage(Message.get("sender.error.exception").toString()); - e.printStackTrace(); - return; - } - } - } - - final IpBanData ban = new IpBanData(ip, actor, reason.getMessage()); - boolean created; - - try { - created = plugin.getIpBanStorage().ban(ban, isSilent); - } catch (SQLException e) { - CommandUtils.handlePunishmentCreateException(e, sender, Message.get("banip.error.exists").set("ip", - ipStr)); - return; - } - - if (!created) { - return; - } - - // Find online players - plugin.getServer().getScheduler().runTask(plugin, new Runnable() { - - public void run() { - Message kickMessage = Message.get("banip.ip.kick") - .set("reason", ban.getReason()) - .set("actor", actor.getName()); - - for (Player onlinePlayer : plugin.getServer().getOnlinePlayers()) { - if (IPUtils.toLong(onlinePlayer.getAddress().getAddress()) == ip) { - onlinePlayer.kickPlayer(kickMessage.toString()); - } - } - } - }); - } - - }); - - return true; - } - -} diff --git a/src/main/java/me/confuser/banmanager/commands/BanIpRangeCommand.java b/src/main/java/me/confuser/banmanager/commands/BanIpRangeCommand.java deleted file mode 100644 index c4ffcb7b0..000000000 --- a/src/main/java/me/confuser/banmanager/commands/BanIpRangeCommand.java +++ /dev/null @@ -1,125 +0,0 @@ -package me.confuser.banmanager.commands; - -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.IpRangeBanData; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.util.CommandParser; -import me.confuser.banmanager.util.CommandUtils; -import me.confuser.banmanager.util.IPUtils; -import me.confuser.banmanager.util.UUIDUtils; -import me.confuser.banmanager.util.parsers.Reason; -import me.confuser.bukkitutil.Message; -import me.confuser.bukkitutil.commands.BukkitCommand; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.sql.SQLException; - -public class BanIpRangeCommand extends BukkitCommand { - - public BanIpRangeCommand() { - super("baniprange"); - } - - @Override - public boolean onCommand(final CommandSender sender, Command command, String commandName, String[] args) { - CommandParser parser = new CommandParser(args, 1); - args = parser.getArgs(); - final boolean isSilent = parser.isSilent(); - - if (isSilent && !sender.hasPermission(command.getPermission() + ".silent")) { - sender.sendMessage(Message.getString("sender.error.noPermission")); - return true; - } - - if (args.length < 2) { - return false; - } - - String ipStr = args[0]; - long[] range = null; - - if (ipStr.contains("*")) { - // Simple wildcard logic - range = IPUtils.getRangeFromWildcard(ipStr); - } else if (ipStr.contains("/")) { - // cidr notation - range = IPUtils.getRangeFromCidrNotation(ipStr); - } - - if (range == null) { - Message.get("baniprange.error.invalid").sendTo(sender); - return true; - } - - final long fromIp = range[0]; - final long toIp = range[1]; - - if (fromIp > toIp) { - Message.get("baniprange.error.minMax").sendTo(sender); - return true; - } - - if (plugin.getIpRangeBanStorage().isBanned(fromIp) || plugin.getIpRangeBanStorage().isBanned(toIp)) { - Message.get("baniprange.error.exists").sendTo(sender); - return true; - } - - final Reason reason = parser.getReason(); - - plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() { - - @Override - public void run() { - final PlayerData actor; - - if (sender instanceof Player) { - try { - actor = plugin.getPlayerStorage().queryForId(UUIDUtils.toBytes((Player) sender)); - } catch (SQLException e) { - sender.sendMessage(Message.get("sender.error.exception").toString()); - e.printStackTrace(); - return; - } - } else { - actor = plugin.getPlayerStorage().getConsole(); - } - - final IpRangeBanData ban = new IpRangeBanData(fromIp, toIp, actor, reason.getMessage()); - boolean created; - - try { - created = plugin.getIpRangeBanStorage().ban(ban, isSilent); - } catch (SQLException e) { - CommandUtils.handlePunishmentCreateException(e, sender, Message.get("baniprange.error.exists")); - return; - } - - if (!created) { - return; - } - - // Find online players - plugin.getServer().getScheduler().runTask(plugin, new Runnable() { - - public void run() { - Message kickMessage = Message.get("baniprange.ip.kick") - .set("reason", ban.getReason()) - .set("actor", actor.getName()); - - for (Player onlinePlayer : plugin.getServer().getOnlinePlayers()) { - if (ban.inRange(IPUtils.toLong(onlinePlayer.getAddress().getAddress()))) { - onlinePlayer.kickPlayer(kickMessage.toString()); - } - } - } - }); - } - }); - - return true; - - } - -} diff --git a/src/main/java/me/confuser/banmanager/commands/BanListCommand.java b/src/main/java/me/confuser/banmanager/commands/BanListCommand.java deleted file mode 100644 index d1fd0202e..000000000 --- a/src/main/java/me/confuser/banmanager/commands/BanListCommand.java +++ /dev/null @@ -1,81 +0,0 @@ -package me.confuser.banmanager.commands; - -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.IpBanData; -import me.confuser.banmanager.data.IpRangeBanData; -import me.confuser.banmanager.data.PlayerBanData; -import me.confuser.banmanager.util.IPUtils; -import me.confuser.bukkitutil.Message; -import me.confuser.bukkitutil.commands.BukkitCommand; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; - -public class BanListCommand extends BukkitCommand { - - public BanListCommand() { - super("banlist"); - } - - @Override - public boolean onCommand(CommandSender sender, Command command, String commandName, String[] args) { - if (args.length > 1) return false; - - String type = "players"; - - if (args.length == 1) { - type = args[0]; - } - - StringBuilder list = new StringBuilder(); - int total = 0; - - if (type.startsWith("play")) { - if (!sender.hasPermission(command.getPermission() + ".players")) { - sender.sendMessage(Message.getString("sender.error.noPermission")); - return true; - } - - for (PlayerBanData ban : plugin.getPlayerBanStorage().getBans().values()) { - list.append(ban.getPlayer().getName()); - list.append(", "); - - total++; - } - } else if (type.startsWith("ipr")) { - if (!sender.hasPermission(command.getPermission() + ".ipranges")) { - sender.sendMessage(Message.getString("sender.error.noPermission")); - return true; - } - - for (IpRangeBanData ban : plugin.getIpRangeBanStorage().getBans().values()) { - list.append(IPUtils.toString(ban.getFromIp())); - list.append(" - "); - list.append(IPUtils.toString(ban.getToIp())); - list.append(", "); - - total++; - } - } else if (type.startsWith("ip")) { - if (!sender.hasPermission(command.getPermission() + ".ips")) { - sender.sendMessage(Message.getString("sender.error.noPermission")); - return true; - } - - for (IpBanData ban : plugin.getIpBanStorage().getBans().values()) { - list.append(IPUtils.toString(ban.getIp())); - list.append(", "); - - total++; - } - } else { - return false; - } - - if (list.length() >= 2) list.setLength(list.length() - 2); - - Message.get("banlist.header").set("bans", total).set("type", type).sendTo(sender); - if (list.length() > 0) sender.sendMessage(list.toString()); - - return true; - } -} diff --git a/src/main/java/me/confuser/banmanager/commands/BanNameCommand.java b/src/main/java/me/confuser/banmanager/commands/BanNameCommand.java deleted file mode 100644 index ed9906ebe..000000000 --- a/src/main/java/me/confuser/banmanager/commands/BanNameCommand.java +++ /dev/null @@ -1,118 +0,0 @@ -package me.confuser.banmanager.commands; - -import com.google.common.net.InetAddresses; -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.IpBanData; -import me.confuser.banmanager.data.NameBanData; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.util.CommandParser; -import me.confuser.banmanager.util.CommandUtils; -import me.confuser.banmanager.util.IPUtils; -import me.confuser.banmanager.util.parsers.Reason; -import me.confuser.bukkitutil.Message; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.sql.SQLException; - -public class BanNameCommand extends AutoCompleteNameTabCommand { - - public BanNameCommand() { - super("banname"); - } - - @Override - public boolean onCommand(final CommandSender sender, Command command, String commandName, String[] args) { - CommandParser parser = new CommandParser(args, 1); - args = parser.getArgs(); - final boolean isSilent = parser.isSilent(); - - if (isSilent && !sender.hasPermission(command.getPermission() + ".silent")) { - sender.sendMessage(Message.getString("sender.error.noPermission")); - return true; - } - - if (args.length < 2) { - return false; - } - - if (CommandUtils.isValidNameDelimiter(args[0])) { - CommandUtils.handleMultipleNames(sender, commandName, args); - return true; - } - - final String name = args[0]; - final Reason reason = parser.getReason(); - - plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() { - - @Override - public void run() { - final boolean isBanned = plugin.getNameBanStorage().isBanned(name); - - if (isBanned && !sender.hasPermission("bm.command.banname.override")) { - Message message = Message.get("banname.error.exists"); - message.set("name", name); - - sender.sendMessage(message.toString()); - return; - } - - final PlayerData actor = CommandUtils.getActor(sender); - - if (actor == null) return; - - if (isBanned) { - NameBanData ban = plugin.getNameBanStorage().getBan(name); - - if (ban != null) { - try { - plugin.getNameBanStorage().unban(ban, actor); - } catch (SQLException e) { - sender.sendMessage(Message.get("sender.error.exception").toString()); - e.printStackTrace(); - return; - } - } - } - - final NameBanData ban = new NameBanData(name, actor, reason.getMessage()); - boolean created; - - try { - created = plugin.getNameBanStorage().ban(ban, isSilent); - } catch (SQLException e) { - CommandUtils.handlePunishmentCreateException(e, sender, Message.get("banname.error.exists").set("name", - name)); - return; - } - - if (!created) { - return; - } - - // Find online players - plugin.getServer().getScheduler().runTask(plugin, new Runnable() { - - public void run() { - Message kickMessage = Message.get("banname.name.kick") - .set("reason", ban.getReason()) - .set("actor", actor.getName()) - .set("name", name); - - for (Player onlinePlayer : plugin.getServer().getOnlinePlayers()) { - if (onlinePlayer.getName().equalsIgnoreCase(name)) { - onlinePlayer.kickPlayer(kickMessage.toString()); - } - } - } - }); - } - - }); - - return true; - } - -} diff --git a/src/main/java/me/confuser/banmanager/commands/ClearCommand.java b/src/main/java/me/confuser/banmanager/commands/ClearCommand.java deleted file mode 100644 index eac85e641..000000000 --- a/src/main/java/me/confuser/banmanager/commands/ClearCommand.java +++ /dev/null @@ -1,139 +0,0 @@ -package me.confuser.banmanager.commands; - -import com.j256.ormlite.stmt.DeleteBuilder; -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.util.CommandUtils; -import me.confuser.banmanager.util.UUIDUtils; -import me.confuser.bukkitutil.Message; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; - -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.UUID; - -public class ClearCommand extends AutoCompleteNameTabCommand { - - private static HashSet types = new HashSet() { - - { - add("banrecords"); - add("kicks"); - add("muterecords"); - add("notes"); - add("reports"); - add("warnings"); - } - }; - - public ClearCommand() { - super("bmclear"); - } - - @Override - public boolean onCommand(final CommandSender sender, Command command, String commandName, final String[] args) { - - if (args.length == 0) return false; - - if (CommandUtils.isValidNameDelimiter(args[0])) { - CommandUtils.handleMultipleNames(sender, commandName, args); - return true; - } - - // Check if UUID vs name - final String playerName = args[0]; - final boolean isUUID = playerName.length() > 16; - - plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() { - - @Override - public void run() { - final PlayerData player; - - if (isUUID) { - try { - player = plugin.getPlayerStorage().queryForId(UUIDUtils.toBytes(UUID.fromString(playerName))); - } catch (Exception e) { - sender.sendMessage(Message.get("sender.error.exception").toString()); - e.printStackTrace(); - return; - } - } else { - player = plugin.getPlayerStorage().retrieve(playerName, false); - } - - if (player == null) { - sender.sendMessage(Message.get("sender.error.notFound").set("player", playerName).toString()); - return; - } - - ArrayList types = new ArrayList<>(); - - if (args.length == 1) { - // Clear everything - for (String type : ClearCommand.types) { - if (!sender.hasPermission("bm.command.clear." + type)) { - Message.get("sender.error.noPermission").sendTo(sender); - return; - } - } - types.addAll(ClearCommand.types); - } else if (args.length == 2) { - String type = args[1].toLowerCase(); - - if (!ClearCommand.types.contains(type)) { - Message.get("bmclear.error.invalid").sendTo(sender); - return; - } else if (sender.hasPermission("bm.command.clear." + type)) { - types.add(type); - } - } - - for (String type : types) { - try { - switch (type) { - case "banrecords": - plugin.getPlayerBanRecordStorage().deleteAll(player); - break; - - case "kicks": - plugin.getPlayerKickStorage().deleteAll(player); - break; - - case "muterecords": - plugin.getPlayerMuteRecordStorage().deleteAll(player); - break; - - case "notes": - plugin.getPlayerNoteStorage().deleteAll(player); - break; - - case "reports": - plugin.getPlayerReportStorage().deleteAll(player); - break; - - case "warnings": - plugin.getPlayerWarnStorage().deleteAll(player); - break; - } - } catch (SQLException e) { - sender.sendMessage(Message.get("sender.error.exception").toString()); - e.printStackTrace(); - return; - } - - Message.get("bmclear.notify") - .set("type", type) - .set("player", player.getName()) - .set("playerId", player.getUUID().toString()) - .sendTo(sender); - } - } - }); - - return true; - } - -} diff --git a/src/main/java/me/confuser/banmanager/commands/DeleteLastWarningCommand.java b/src/main/java/me/confuser/banmanager/commands/DeleteLastWarningCommand.java deleted file mode 100644 index ce2dc6f87..000000000 --- a/src/main/java/me/confuser/banmanager/commands/DeleteLastWarningCommand.java +++ /dev/null @@ -1,87 +0,0 @@ -package me.confuser.banmanager.commands; - -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.util.CommandUtils; -import me.confuser.banmanager.util.UUIDUtils; -import me.confuser.bukkitutil.Message; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.sql.SQLException; -import java.util.UUID; - -public class DeleteLastWarningCommand extends AutoCompleteNameTabCommand { - - public DeleteLastWarningCommand() { - super("dwarn"); - } - - @Override - public boolean onCommand(final CommandSender sender, Command command, String commandName, String[] args) { - if (args.length < 1) { - return false; - } - - if (CommandUtils.isValidNameDelimiter(args[0])) { - CommandUtils.handleMultipleNames(sender, commandName, args); - return true; - } - - // Check if UUID vs name - final String playerName = args[0]; - final boolean isUUID = playerName.length() > 16; - - plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() { - - @Override - public void run() { - final PlayerData player; - - if (isUUID) { - try { - player = plugin.getPlayerStorage().queryForId(UUIDUtils.toBytes(UUID.fromString(playerName))); - } catch (Exception e) { - sender.sendMessage(Message.get("sender.error.exception").toString()); - e.printStackTrace(); - return; - } - } else { - player = plugin.getPlayerStorage().retrieve(playerName, true); - } - - if (player == null) { - sender.sendMessage(Message.get("sender.error.notFound").set("player", playerName).toString()); - return; - } - - int updated = 0; - try { - updated = plugin.getPlayerWarnStorage().deleteRecent(player); - } catch (SQLException e) { - e.printStackTrace(); - } - - if (updated == 0) { - Message.get("dwarn.error.noWarnings").set("player", player.getName()).sendTo(sender); - } else { - Message.get("dwarn.notify").set("player", player.getName()).set("actor", sender.getName()).sendTo(sender); - - Player bukkitPlayer = CommandUtils.getPlayer(player.getUUID()); - - if (bukkitPlayer == null) return; - - Message.get("dwarn.player.notify") - .set("player", player.getName()) - .set("playerId", player.getUUID().toString()) - .set("actor", sender.getName()) - .sendTo(bukkitPlayer); - } - } - - }); - - return true; - } -} diff --git a/src/main/java/me/confuser/banmanager/commands/ExportCommand.java b/src/main/java/me/confuser/banmanager/commands/ExportCommand.java deleted file mode 100644 index 54c8975bc..000000000 --- a/src/main/java/me/confuser/banmanager/commands/ExportCommand.java +++ /dev/null @@ -1,173 +0,0 @@ -package me.confuser.banmanager.commands; - -import com.google.gson.stream.JsonWriter; -import com.j256.ormlite.dao.CloseableIterator; -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.IpBanData; -import me.confuser.banmanager.data.PlayerBanData; -import me.confuser.banmanager.util.IPUtils; -import me.confuser.bukkitutil.Message; -import me.confuser.bukkitutil.commands.BukkitCommand; -import org.apache.commons.lang.time.FastDateFormat; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; - -import java.io.*; -import java.nio.charset.Charset; - -public class ExportCommand extends BukkitCommand { - - private static final FastDateFormat BANNED_JSON_TIME_FORMAT = FastDateFormat.getInstance("yyyy-MM-dd_HH-mm-ss"); - - private boolean inProgress = false; - - public ExportCommand() { - super("bmexport"); - } - - @Override - public boolean onCommand(final CommandSender sender, Command command, String commandName, final String[] args) { - if (args.length != 1) return false; - - if (inProgress) { - sender.sendMessage(Message.getString("export.error.inProgress")); - return true; - } - - if (!args[0].startsWith("play") && !args[0].startsWith("ip")) return false; - - plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() { - - @Override - public void run() { - Message finishedMessage; - String fileName; - - if (args[0].startsWith("play")) { - sender.sendMessage(Message.getString("export.player.started")); - finishedMessage = Message.get("export.player.finished"); - fileName = "banned-players-" + BANNED_JSON_TIME_FORMAT.format(System.currentTimeMillis()) + ".json"; - - finishedMessage.set("file", fileName); - - try { - exportPlayers(fileName); - } catch (IOException e) { - sender.sendMessage(Message.get("sender.error.exception").toString()); - e.printStackTrace(); - return; - } - } else if (args[0].startsWith("ip")) { - sender.sendMessage(Message.getString("export.ip.started")); - finishedMessage = Message.get("export.player.finished"); - - fileName = "banned-ips-" + BANNED_JSON_TIME_FORMAT.format(System.currentTimeMillis()) + ".json"; - - finishedMessage.set("file", fileName); - - try { - exportIps(fileName); - } catch (IOException e) { - sender.sendMessage(Message.get("sender.error.exception").toString()); - e.printStackTrace(); - return; - } - } else { - return; - } - - finishedMessage.sendTo(sender); - } - }); - - return true; - } - - private static final FastDateFormat EXPORT_FORMAT = FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss Z"); - - private void exportIps(String fileName) throws IOException { - File file = new File(plugin.getDataFolder(), fileName); - - if (!file.exists()) { - file.createNewFile(); - } else { - throw new IOException("File already exists"); - } - - JsonWriter jsonWriter = new JsonWriter(new OutputStreamWriter(new FileOutputStream(file), Charset.forName("UTF-8").newEncoder())); - - jsonWriter.beginArray(); - jsonWriter.setIndent(" "); - - CloseableIterator itr = plugin.getIpBanStorage().iterator(); - - while (itr.hasNext()) { - IpBanData next = itr.next(); - - jsonWriter.beginObject(); - - jsonWriter.name("ip").value(IPUtils.toString(next.getIp())); - jsonWriter.name("created").value(EXPORT_FORMAT.format(next.getCreated() * 1000L)); - jsonWriter.name("source").value(next.getActor().getName()); - jsonWriter.name("expires"); - - if (next.getExpires() == 0) { - jsonWriter.value("forever"); - } else { - jsonWriter.value(EXPORT_FORMAT.format(next.getExpires() * 1000L)); - } - - jsonWriter.name("reason").value(next.getReason()); - - jsonWriter.endObject(); - } - - itr.closeQuietly(); - - jsonWriter.endArray(); - jsonWriter.close(); - } - - private void exportPlayers(String fileName) throws IOException { - File file = new File(plugin.getDataFolder(), fileName); - - if (!file.exists()) { - file.createNewFile(); - } else { - throw new IOException("File already exists"); - } - - JsonWriter jsonWriter = new JsonWriter(new OutputStreamWriter(new FileOutputStream(file), Charset.forName("UTF-8").newEncoder())); - jsonWriter.beginArray(); - jsonWriter.setIndent(" "); - - CloseableIterator itr = plugin.getPlayerBanStorage().iterator(); - - while (itr.hasNext()) { - PlayerBanData next = itr.next(); - - jsonWriter.beginObject(); - - jsonWriter.name("uuid").value(next.getPlayer().getUUID().toString()); - jsonWriter.name("name").value(next.getPlayer().getName()); - jsonWriter.name("created").value(EXPORT_FORMAT.format(next.getCreated() * 1000L)); - jsonWriter.name("source").value(next.getActor().getName()); - jsonWriter.name("expires"); - - if (next.getExpires() == 0) { - jsonWriter.value("forever"); - } else { - jsonWriter.value(EXPORT_FORMAT.format(next.getExpires() * 1000L)); - } - - jsonWriter.name("reason").value(next.getReason()); - - jsonWriter.endObject(); - } - - itr.closeQuietly(); - - jsonWriter.endArray(); - jsonWriter.close(); - } -} diff --git a/src/main/java/me/confuser/banmanager/commands/FindAltsCommand.java b/src/main/java/me/confuser/banmanager/commands/FindAltsCommand.java deleted file mode 100644 index 517a3762c..000000000 --- a/src/main/java/me/confuser/banmanager/commands/FindAltsCommand.java +++ /dev/null @@ -1,97 +0,0 @@ -package me.confuser.banmanager.commands; - -import com.google.common.net.InetAddresses; -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.util.CommandUtils; -import me.confuser.banmanager.util.IPUtils; -import me.confuser.banmanager.util.JSONCommandUtils; -import me.confuser.bukkitutil.Message; -import org.apache.commons.lang.StringUtils; -import org.bukkit.ChatColor; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.util.ArrayList; -import java.util.List; - -public class FindAltsCommand extends AutoCompleteNameTabCommand { - - public FindAltsCommand() { - super("alts"); - } - - @Override - public boolean onCommand(final CommandSender sender, Command command, String commandName, String[] args) { - if (args.length < 1) { - return false; - } - - if (CommandUtils.isValidNameDelimiter(args[0])) { - CommandUtils.handleMultipleNames(sender, commandName, args); - return true; - } - - final String ipStr = args[0]; - final boolean isName = !InetAddresses.isInetAddress(ipStr); - - if (isName && ipStr.length() > 16) { - Message message = Message.get("sender.error.invalidIp"); - message.set("ip", ipStr); - - sender.sendMessage(message.toString()); - return true; - } - - plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() { - - @Override - public void run() { - final long ip; - - if (isName) { - PlayerData srcPlayer = plugin.getPlayerStorage().retrieve(ipStr, false); - if (srcPlayer == null) { - sender.sendMessage(Message.get("sender.error.notFound").set("player", ipStr).toString()); - return; - } - - ip = srcPlayer.getIp(); - } else { - ip = IPUtils.toLong(ipStr); - } - - List players = plugin.getPlayerStorage().getDuplicates(ip); - - if (sender instanceof Player) { - sender.sendMessage(Message.get("alts.header").set("ip", ipStr).toString()); - - if (players.isEmpty()) { - sender.sendMessage(Message.get("none").toString()); - return; - } - - JSONCommandUtils.alts(players).send((Player) sender); - } else { - ArrayList names = new ArrayList<>(players.size()); - - for (PlayerData player : players) { - names.add(player.getName()); - } - - sender.sendMessage(Message.get("alts.header").set("ip", ipStr).toString()); - - if (names.isEmpty()) { - sender.sendMessage(Message.get("none").toString()); - return; - } - - sender.sendMessage(ChatColor.GOLD + StringUtils.join(names, ", ")); - } - } - }); - - return true; - } -} diff --git a/src/main/java/me/confuser/banmanager/commands/InfoCommand.java b/src/main/java/me/confuser/banmanager/commands/InfoCommand.java deleted file mode 100644 index 02bdf3539..000000000 --- a/src/main/java/me/confuser/banmanager/commands/InfoCommand.java +++ /dev/null @@ -1,408 +0,0 @@ -package me.confuser.banmanager.commands; - -import com.google.common.net.InetAddresses; -import com.j256.ormlite.dao.CloseableIterator; -import com.maxmind.geoip2.exception.GeoIp2Exception; -import com.maxmind.geoip2.model.CityResponse; -import com.maxmind.geoip2.model.CountryResponse; -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.*; -import me.confuser.banmanager.util.DateUtils; -import me.confuser.banmanager.util.IPUtils; -import me.confuser.banmanager.util.JSONCommandUtils; -import me.confuser.banmanager.util.parsers.InfoCommandParser; -import me.confuser.bukkitutil.Message; -import me.rayzr522.jsonmessage.JSONMessage; -import org.apache.commons.lang.time.FastDateFormat; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.io.IOException; -import java.net.InetAddress; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -public class InfoCommand extends AutoCompleteNameTabCommand { - - private static final FastDateFormat LAST_SEEN_COMMAND_FORMAT = FastDateFormat.getInstance("dd-MM-yyyy HH:mm:ss"); - - public InfoCommand() { - super("bminfo"); - } - - @Override - public boolean onCommand(final CommandSender sender, Command command, String commandName, String[] args) { - final InfoCommandParser parser; - - try { - parser = new InfoCommandParser(args); - } catch (IllegalArgumentException e) { - sender.sendMessage(Message.getString("info.error.incorrectFlagUsage")); - return true; - } - - args = parser.getArgs(); - - if (args.length > 2) { - return false; - } - - if (args.length == 0 && !(sender instanceof Player)) { - return false; - } - - if (args.length >= 1 && !sender.hasPermission("bm.command.bminfo.others")) { - Message.get("sender.error.noPermission").sendTo(sender); - return true; - } - - final String search = args.length > 0 ? args[0] : sender.getName(); - final boolean isName = !InetAddresses.isInetAddress(search); - - if (isName && search.length() > 16) { - sender.sendMessage(Message.getString("sender.error.invalidIp")); - return true; - } - - final Integer index; - - try { - index = args.length == 2 ? Integer.parseInt(args[1]) : null; - } catch (NumberFormatException e) { - Message.get("info.error.invalidIndex").sendTo(sender); - return true; - } - - plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() { - - @Override - public void run() { - if (isName) { - try { - playerInfo(sender, search, index, parser); - } catch (SQLException e) { - sender.sendMessage(Message.getString("sender.error.exception")); - e.printStackTrace(); - return; - } - }/* else { - TODO - ipInfo(sender, search); - }*/ - - } - - }); - - return true; - } - - public void playerInfo(CommandSender sender, String name, Integer index, InfoCommandParser parser) throws SQLException { - List players = plugin.getPlayerStorage().retrieve(name); - - if (players == null || players.size() == 0) { - sender.sendMessage(Message.get("sender.error.notFound").set("player", name).toString()); - return; - } - - if (players.size() > 1 && (index == null || index > players.size() || index < 1)) { - Message.get("info.error.indexRequired") - .set("size", players.size()) - .set("name", name) - .sendTo(sender); - - int i = 0; - for (PlayerData player : players) { - i++; - - Message.get("info.error.index") - .set("index", i) - .set("uuid", player.getUUID().toString()) - .set("name", player.getName()) - .sendTo(sender); - } - - return; - } - - if (players.size() == 1) index = 1; - - PlayerData player = players.get(index - 1); - - ArrayList messages = new ArrayList<>(); - - boolean hasFlags = parser.isBans() || parser.isKicks() || parser.isMutes() || parser.isNotes() || parser - .isWarnings() || parser.getIps() != null; - - if (hasFlags) { - long since = 0; - - if (parser.getTime() != null && !parser.getTime().isEmpty()) { - try { - since = DateUtils.parseDateDiff(parser.getTime(), false); - } catch (Exception e1) { - sender.sendMessage(Message.get("time.error.invalid").toString()); - return; - } - } - if (parser.isBans() && !sender.hasPermission("bm.command.bminfo.history.bans")) { - Message.get("sender.error.noPermission").sendTo(sender); - return; - } - - if (parser.isKicks() && !sender.hasPermission("bm.command.bminfo.history.kicks")) { - Message.get("sender.error.noPermission").sendTo(sender); - return; - } - - if (parser.isMutes() && !sender.hasPermission("bm.command.bminfo.history.mutes")) { - Message.get("sender.error.noPermission").sendTo(sender); - return; - } - - if (parser.isNotes() && !sender.hasPermission("bm.command.bminfo.history.notes")) { - Message.get("sender.error.noPermission").sendTo(sender); - return; - } - - if (parser.isWarnings() && !sender.hasPermission("bm.command.bminfo.history.warnings")) { - Message.get("sender.error.noPermission").sendTo(sender); - return; - } - - if (parser.getIps() != null) { - if (!sender.hasPermission("bm.command.bminfo.history.ips")) { - Message.get("sender.error.noPermission").sendTo(sender); - return; - } - - int page = parser.getIps() - 1; - - if (page < 0) page = 0; - - handleIpHistory(messages, player, since, page); - } else { - - ArrayList> results; - - if (parser.getTime() != null && !parser.getTime().isEmpty()) { - results = plugin.getHistoryStorage().getSince(player, since, parser); - } else { - results = plugin.getHistoryStorage().getAll(player, parser); - } - - if (results == null || results.size() == 0) { - Message.get("info.history.noResults").sendTo(sender); - return; - } - - String dateTimeFormat = Message.getString("info.history.dateTimeFormat"); - FastDateFormat dateFormatter = FastDateFormat.getInstance(dateTimeFormat); - - for (HashMap result : results) { - Message message = Message.get("info.history.row") - .set("id", (int) result.get("id")) - .set("reason", (String) result.get("reason")) - .set("type", (String) result.get("type")) - .set("created", dateFormatter - .format((long) result.get("created") * 1000L)) - .set("actor", (String) result.get("actor")) - .set("meta", (String) result.get("meta")); - - messages.add(message.toString()); - } - } - - } else { - - if (sender.hasPermission("bm.command.bminfo.playerstats")) { - long banTotal = plugin.getPlayerBanRecordStorage().getCount(player); - long muteTotal = plugin.getPlayerMuteRecordStorage().getCount(player); - long warnTotal = plugin.getPlayerWarnStorage().getCount(player); - double warnPointsTotal = plugin.getPlayerWarnStorage().getPointsCount(player); - long kickTotal = plugin.getPlayerKickStorage().getCount(player); - - messages.add(Message.get("info.stats.player") - .set("player", player.getName()) - .set("playerId", player.getUUID().toString()) - .set("bans", Long.toString(banTotal)) - .set("mutes", Long.toString(muteTotal)) - .set("warns", Long.toString(warnTotal)) - .set("warnPoints", warnPointsTotal) - .set("kicks", Long.toString(kickTotal)) - .toString()); - } - - if (sender.hasPermission("bm.command.bminfo.connection")) { - messages.add(Message.get("info.connection") - .set("ip", IPUtils.toString(player.getIp())) - .set("lastSeen", LAST_SEEN_COMMAND_FORMAT - .format(player.getLastSeen() * 1000L)) - .toString()); - } - - if (plugin.getGeoIpConfig().isEnabled() && sender.hasPermission("bm.command.bminfo.geoip")) { - Message message = Message.get("info.geoip"); - - try { - InetAddress ip = IPUtils.toInetAddress(player.getIp()); - - CountryResponse countryResponse = plugin.getGeoIpConfig().getCountryDatabase().country(ip); - String country = countryResponse.getCountry().getName(); - String countryIso = countryResponse.getCountry().getIsoCode(); - - CityResponse cityResponse = plugin.getGeoIpConfig().getCityDatabase().city(ip); - String city = cityResponse.getCity().getName(); - - message.set("country", country) - .set("countryIso", countryIso) - .set("city", city); - } catch (IOException | GeoIp2Exception ignored) { - } - - } - - if (sender.hasPermission("bm.command.bminfo.alts")) { - messages.add(Message.getString("alts.header")); - - List duplicatePlayers = plugin.getPlayerStorage().getDuplicates(player.getIp()); - - if (sender instanceof Player) { - messages.add(JSONCommandUtils.alts(duplicatePlayers)); - } else { - StringBuilder duplicates = new StringBuilder(); - - for (PlayerData duplicatePlayer : duplicatePlayers) { - duplicates.append(duplicatePlayer.getName()).append(", "); - } - - if (duplicates.length() >= 2) duplicates.setLength(duplicates.length() - 2); - - messages.add(duplicates.toString()); - } - } - - if (sender.hasPermission("bm.command.bminfo.ipstats")) { - - long ipBanTotal = plugin.getIpBanRecordStorage().getCount(player.getIp()); - - messages.add(Message.get("info.stats.ip") - .set("bans", Long.toString(ipBanTotal)) - .toString()); - - if (plugin.getIpBanStorage().isBanned(player.getIp())) { - IpBanData ban = plugin.getIpBanStorage().getBan(player.getIp()); - - Message message; - - if (ban.getExpires() == 0) { - message = Message.get("info.ipban.permanent"); - } else { - message = Message.get("info.ipban.temporary"); - message.set("expires", DateUtils.getDifferenceFormat(ban.getExpires())); - } - - String dateTimeFormat = Message.getString("info.ipban.dateTimeFormat"); - - messages.add(message - .set("reason", ban.getReason()) - .set("actor", ban.getActor().getName()) - .set("created", FastDateFormat.getInstance(dateTimeFormat) - .format(ban.getCreated() * 1000L)) - .toString()); - } - } - - if (plugin.getPlayerBanStorage().isBanned(player.getUUID())) { - PlayerBanData ban = plugin.getPlayerBanStorage().getBan(player.getUUID()); - - Message message; - - if (ban.getExpires() == 0) { - message = Message.get("info.ban.permanent"); - } else { - message = Message.get("info.ban.temporary"); - message.set("expires", DateUtils.getDifferenceFormat(ban.getExpires())); - } - - String dateTimeFormat = Message.getString("info.ban.dateTimeFormat"); - - messages.add(message - .set("player", player.getName()) - .set("reason", ban.getReason()) - .set("actor", ban.getActor().getName()) - .set("created", FastDateFormat.getInstance(dateTimeFormat) - .format(ban.getCreated() * 1000L)) - .toString()); - } - - if (plugin.getPlayerMuteStorage().isMuted(player.getUUID())) { - PlayerMuteData mute = plugin.getPlayerMuteStorage().getMute(player.getUUID()); - - Message message; - - if (mute.getExpires() == 0) { - message = Message.get("info.mute.permanent"); - } else { - message = Message.get("info.mute.temporary"); - message.set("expires", DateUtils.getDifferenceFormat(mute.getExpires())); - } - - String dateTimeFormat = Message.getString("info.mute.dateTimeFormat"); - - messages.add(message - .set("player", player.getName()) - .set("reason", mute.getReason()) - .set("actor", mute.getActor().getName()) - .set("created", FastDateFormat.getInstance(dateTimeFormat) - .format(mute.getCreated() * 1000L)) - .toString()); - } - - if (sender.hasPermission("bm.command.bminfo.website")) { - messages.add(Message.get("info.website.player") - .set("player", player.getName()) - .set("uuid", player.getUUID().toString()) - .set("playerId", player.getUUID().toString()) - .toString()); - } - } - - // TODO Show last warning - for (Object message : messages) { - if (message instanceof String) { - sender.sendMessage((String) message); - } else if (message instanceof JSONMessage){ - ((JSONMessage) message).send((Player) sender); - } - } - } - - private void handleIpHistory(ArrayList messages, PlayerData player, long since, int page) { - CloseableIterator iterator = null; - try { - iterator = plugin.getPlayerHistoryStorage().getSince(player, since, page); - - String dateTimeFormat = Message.getString("info.mute.dateTimeFormat"); - - while (iterator.hasNext()) { - PlayerHistoryData data = iterator.next(); - - messages.add(Message.get("info.ips.row") - .set("join", FastDateFormat.getInstance(dateTimeFormat) - .format(data.getJoin() * 1000L)) - .set("leave", FastDateFormat.getInstance(dateTimeFormat) - .format(data.getLeave() * 1000L)) - .set("ip", IPUtils.toString(data.getIp())) - .toString()); - } - } catch (SQLException e) { - e.printStackTrace(); - } finally { - if (iterator != null) iterator.closeQuietly(); - } - } -} diff --git a/src/main/java/me/confuser/banmanager/commands/KickCommand.java b/src/main/java/me/confuser/banmanager/commands/KickCommand.java deleted file mode 100644 index 16250fd2c..000000000 --- a/src/main/java/me/confuser/banmanager/commands/KickCommand.java +++ /dev/null @@ -1,138 +0,0 @@ -package me.confuser.banmanager.commands; - -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.data.PlayerKickData; -import me.confuser.banmanager.util.CommandParser; -import me.confuser.banmanager.util.CommandUtils; -import me.confuser.banmanager.util.UUIDUtils; -import me.confuser.bukkitutil.Message; -import me.confuser.bukkitutil.commands.BukkitCommand; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.sql.SQLException; - -public class KickCommand extends BukkitCommand { - - public KickCommand() { - super("kick"); - } - - @Override - public boolean onCommand(final CommandSender sender, Command command, String commandName, String[] args) { - final boolean isSilent; - CommandParser parser = null; - - if (args.length != 1) { - parser = new CommandParser(args, 1); - args = parser.getArgs(); - isSilent = parser.isSilent(); - } else { - isSilent = false; - } - - if (isSilent && !sender.hasPermission(command.getPermission() + ".silent")) { - sender.sendMessage(Message.getString("sender.error.noPermission")); - return true; - } - - if (args.length < 1 || args[0].isEmpty()) { - return false; - } - - if (CommandUtils.isValidNameDelimiter(args[0])) { - CommandUtils.handleMultipleNames(sender, commandName, args); - return true; - } - - if (args[0].equalsIgnoreCase(sender.getName())) { - sender.sendMessage(Message.getString("sender.error.noSelf")); - return true; - } - - final String playerName = args[0]; - final Player player = plugin.getServer().getPlayer(playerName); - - if (player == null) { - Message.get("sender.error.offline") - .set("player", playerName) - .sendTo(sender); - - return true; - } else if (!sender.hasPermission("bm.exempt.override.kick") && player.hasPermission("bm.exempt.kick")) { - Message.get("sender.error.exempt").set("player", player.getName()).sendTo(sender); - return true; - } - - final String reason = parser != null ? parser.getReason().getMessage() : ""; - - plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() { - - @Override - public void run() { - final PlayerData actor = CommandUtils.getActor(sender); - - if (actor == null) return; - - final Message kickMessage; - - if (reason.isEmpty()) { - kickMessage = Message.get("kick.player.noReason"); - } else { - kickMessage = Message.get("kick.player.reason").set("reason", reason); - } - - kickMessage - .set("displayName", player.getDisplayName()) - .set("player", player.getName()) - .set("playerId", UUIDUtils.getUUID(player).toString()) - .set("actor", actor.getName()); - - plugin.getServer().getScheduler().runTask(plugin, new Runnable() { - - @Override - public void run() { - player.kickPlayer(kickMessage.toString()); - - Message message = Message.get(reason.isEmpty() ? "kick.notify.noReason" : "kick.notify.reason"); - message.set("player", player.getName()).set("actor", actor.getName()).set("reason", reason); - - if (isSilent || !sender.hasPermission("bm.notify.kick")) { - message.sendTo(sender); - } - - if (!isSilent) CommandUtils.broadcast(message.toString(), "bm.notify.kick"); - } - }); - - if (plugin.getConfiguration().isKickLoggingEnabled()) { - PlayerData player = plugin.getPlayerStorage().retrieve(playerName, false); - - if (player == null) return; - - PlayerKickData data = new PlayerKickData(player, actor, reason); - - boolean created; - - try { - created = plugin.getPlayerKickStorage().addKick(data); - } catch (SQLException e) { - sender.sendMessage(Message.get("sender.error.exception").toString()); - e.printStackTrace(); - return; - } - - if (!created) { - return; - } - } - - } - }); - - return true; - } - -} diff --git a/src/main/java/me/confuser/banmanager/commands/LoglessKickCommand.java b/src/main/java/me/confuser/banmanager/commands/LoglessKickCommand.java deleted file mode 100644 index a9df265ea..000000000 --- a/src/main/java/me/confuser/banmanager/commands/LoglessKickCommand.java +++ /dev/null @@ -1,125 +0,0 @@ -package me.confuser.banmanager.commands; - -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.util.CommandParser; -import me.confuser.banmanager.util.CommandUtils; -import me.confuser.banmanager.util.UUIDUtils; -import me.confuser.bukkitutil.Message; -import me.confuser.bukkitutil.commands.BukkitCommand; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.sql.SQLException; - -public class LoglessKickCommand extends BukkitCommand { - - public LoglessKickCommand() { - super("nlkick"); - } - - @Override - public boolean onCommand(final CommandSender sender, Command command, String commandName, String[] args) { - final boolean isSilent; - CommandParser parser = null; - - if (args.length != 1) { - parser = new CommandParser(args, 1); - args = parser.getArgs(); - isSilent = parser.isSilent(); - } else { - isSilent = false; - } - - if (isSilent && !sender.hasPermission(command.getPermission() + ".silent")) { - sender.sendMessage(Message.getString("sender.error.noPermission")); - return true; - } - - if (args.length < 1 || args[0].isEmpty()) { - return false; - } - - if (CommandUtils.isValidNameDelimiter(args[0])) { - CommandUtils.handleMultipleNames(sender, commandName, args); - return true; - } - - if (args[0].equalsIgnoreCase(sender.getName())) { - sender.sendMessage(Message.getString("sender.error.noSelf")); - return true; - } - - String playerName = args[0]; - final Player player = plugin.getServer().getPlayer(playerName); - - if (player == null) { - Message.get("sender.error.offline") - .set("player", playerName) - .sendTo(sender); - - return true; - } else if (!sender.hasPermission("bm.exempt.override.kick") && player.hasPermission("bm.exempt.kick")) { - Message.get("sender.error.exempt").set("player", player.getName()).sendTo(sender); - return true; - } - - final String reason = args.length > 1 ? parser.getReason().getMessage() : ""; - - plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() { - - @Override - public void run() { - final PlayerData actor; - - if (sender instanceof Player) { - try { - actor = plugin.getPlayerStorage().queryForId(UUIDUtils.toBytes((Player) sender)); - } catch (SQLException e) { - sender.sendMessage(Message.get("sender.error.exception").toString()); - e.printStackTrace(); - return; - } - } else { - actor = plugin.getPlayerStorage().getConsole(); - } - - final Message kickMessage; - - if (reason.isEmpty()) { - kickMessage = Message.get("kick.player.noReason"); - } else { - kickMessage = Message.get("kick.player.reason").set("reason", reason); - } - - kickMessage - .set("displayName", player.getDisplayName()) - .set("player", player.getName()) - .set("playerId", UUIDUtils.getUUID(player).toString()) - .set("actor", actor.getName()); - - plugin.getServer().getScheduler().runTask(plugin, new Runnable() { - - @Override - public void run() { - player.kickPlayer(kickMessage.toString()); - - Message message = Message.get(reason.isEmpty() ? "kick.notify.noReason" : "kick.notify.reason"); - message.set("player", player.getName()).set("actor", actor.getName()).set("reason", reason); - - if (isSilent || !sender.hasPermission("bm.notify.kick")) { - message.sendTo(sender); - } - - if (!isSilent) CommandUtils.broadcast(message.toString(), "bm.notify.kick"); - } - }); - - } - }); - - return true; - } - -} diff --git a/src/main/java/me/confuser/banmanager/commands/MuteCommand.java b/src/main/java/me/confuser/banmanager/commands/MuteCommand.java deleted file mode 100644 index 99a4adedb..000000000 --- a/src/main/java/me/confuser/banmanager/commands/MuteCommand.java +++ /dev/null @@ -1,187 +0,0 @@ -package me.confuser.banmanager.commands; - -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.data.PlayerMuteData; -import me.confuser.banmanager.util.CommandParser; -import me.confuser.banmanager.util.CommandUtils; -import me.confuser.banmanager.util.UUIDUtils; -import me.confuser.banmanager.util.parsers.Reason; -import me.confuser.bukkitutil.Message; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.sql.SQLException; -import java.util.UUID; - -public class MuteCommand extends AutoCompleteNameTabCommand { - - public MuteCommand() { - super("mute"); - } - - @Override - public boolean onCommand(final CommandSender sender, Command command, String commandName, String[] args) { - CommandParser parser = new CommandParser(args, 1); - args = parser.getArgs(); - final boolean isSilent = parser.isSilent(); - - if (isSilent && !sender.hasPermission(command.getPermission() + ".silent")) { - sender.sendMessage(Message.getString("sender.error.noPermission")); - return true; - } - - final boolean isSoft = parser.isSoft(); - - if (isSoft && !sender.hasPermission(command.getPermission() + ".soft")) { - sender.sendMessage(Message.getString("sender.error.noPermission")); - return true; - } - - if (args.length < 2) { - return false; - } - - if (CommandUtils.isValidNameDelimiter(args[0])) { - CommandUtils.handleMultipleNames(sender, commandName, args); - return true; - } - - if (args[0].equalsIgnoreCase(sender.getName())) { - sender.sendMessage(Message.getString("sender.error.noSelf")); - return true; - } - - // Check if UUID vs name - final String playerName = args[0]; - final boolean isUUID = playerName.length() > 16; - final boolean isMuted; - - if (isUUID) { - try { - isMuted = plugin.getPlayerMuteStorage().isMuted(UUID.fromString(playerName)); - } catch (IllegalArgumentException e) { - sender.sendMessage(Message.get("sender.error.notFound").set("player", playerName).toString()); - return true; - } - } else { - isMuted = plugin.getPlayerMuteStorage().isMuted(playerName); - } - - if (isMuted && !sender.hasPermission("bm.command.mute.override")) { - Message message = Message.get("mute.error.exists"); - message.set("player", playerName); - - sender.sendMessage(message.toString()); - return true; - } - - Player onlinePlayer; - - if (isUUID) { - onlinePlayer = plugin.getServer().getPlayer(UUID.fromString(playerName)); - } else { - onlinePlayer = plugin.getServer().getPlayer(playerName); - } - - if (onlinePlayer == null) { - if (!sender.hasPermission("bm.command.mute.offline")) { - sender.sendMessage(Message.getString("sender.error.offlinePermission")); - return true; - } - } else if (!sender.hasPermission("bm.exempt.override.mute") && onlinePlayer.hasPermission("bm.exempt.mute")) { - Message.get("sender.error.exempt").set("player", onlinePlayer.getName()).sendTo(sender); - return true; - } - - final Reason reason = parser.getReason(); - - plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() { - - @Override - public void run() { - final PlayerData player = CommandUtils.getPlayer(sender, playerName); - - if (player == null) { - sender.sendMessage(Message.get("sender.error.notFound").set("player", playerName).toString()); - return; - } - - if (plugin.getExemptionsConfig().isExempt(player, "mute")) { - sender.sendMessage(Message.get("sender.error.exempt").set("player", playerName).toString()); - return; - } - - PlayerData actor; - - if (sender instanceof Player) { - try { - actor = plugin.getPlayerStorage().queryForId(UUIDUtils.toBytes((Player) sender)); - } catch (SQLException e) { - sender.sendMessage(Message.get("sender.error.exception").toString()); - e.printStackTrace(); - return; - } - } else { - actor = plugin.getPlayerStorage().getConsole(); - } - - if (isMuted) { - PlayerMuteData mute; - - if (isUUID) { - mute = plugin.getPlayerMuteStorage().getMute(UUID.fromString(playerName)); - } else { - mute = plugin.getPlayerMuteStorage().getMute(playerName); - } - - if (mute != null) { - try { - plugin.getPlayerMuteStorage().unmute(mute, actor); - } catch (SQLException e) { - sender.sendMessage(Message.get("sender.error.exception").toString()); - e.printStackTrace(); - return; - } - } - } - - PlayerMuteData mute = new PlayerMuteData(player, actor, reason.getMessage(), isSoft); - boolean created; - - try { - created = plugin.getPlayerMuteStorage().mute(mute, isSilent); - } catch (SQLException e) { - CommandUtils.handlePunishmentCreateException(e, sender, Message.get("mute.error.exists").set("player", - playerName)); - return; - } - - if (!created) { - return; - } - - CommandUtils.handlePrivateNotes(player, actor, reason); - - Player bukkitPlayer = CommandUtils.getPlayer(player.getUUID()); - - if (isSoft || bukkitPlayer == null) return; - - Message muteMessage = Message.get("mute.player.disallowed") - .set("displayName", bukkitPlayer.getDisplayName()) - .set("player", player.getName()) - .set("playerId", player.getUUID().toString()) - .set("reason", mute.getReason()) - .set("actor", actor.getName()); - - bukkitPlayer.sendMessage(muteMessage.toString()); - - } - - }); - - return true; - } - -} diff --git a/src/main/java/me/confuser/banmanager/commands/MuteIpCommand.java b/src/main/java/me/confuser/banmanager/commands/MuteIpCommand.java deleted file mode 100644 index bd90c074a..000000000 --- a/src/main/java/me/confuser/banmanager/commands/MuteIpCommand.java +++ /dev/null @@ -1,148 +0,0 @@ -package me.confuser.banmanager.commands; - -import com.google.common.net.InetAddresses; -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.IpMuteData; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.util.CommandParser; -import me.confuser.banmanager.util.CommandUtils; -import me.confuser.banmanager.util.IPUtils; -import me.confuser.bukkitutil.Message; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.sql.SQLException; - -public class MuteIpCommand extends AutoCompleteNameTabCommand { - - public MuteIpCommand() { - super("muteip"); - } - - @Override - public boolean onCommand(final CommandSender sender, Command command, String commandName, String[] args) { - CommandParser parser = new CommandParser(args, 1); - args = parser.getArgs(); - final boolean isSilent = parser.isSilent(); - - if (isSilent && !sender.hasPermission(command.getPermission() + ".silent")) { - sender.sendMessage(Message.getString("sender.error.noPermission")); - return true; - } - - final boolean isSoft = parser.isSoft(); - - if (isSoft && !sender.hasPermission(command.getPermission() + ".soft")) { - sender.sendMessage(Message.getString("sender.error.noPermission")); - return true; - } - - if (args.length < 2) { - return false; - } - - if (CommandUtils.isValidNameDelimiter(args[0])) { - CommandUtils.handleMultipleNames(sender, commandName, args); - return true; - } - - final String ipStr = args[0]; - final boolean isName = !InetAddresses.isInetAddress(ipStr); - - if (isName && ipStr.length() > 16) { - Message message = Message.get("sender.error.invalidIp"); - message.set("ip", ipStr); - - sender.sendMessage(message.toString()); - return true; - } - - if (isName) { - Player onlinePlayer = plugin.getServer().getPlayer(ipStr); - - if (onlinePlayer != null && !sender.hasPermission("bm.exempt.override.muteip") - && onlinePlayer.hasPermission("bm.exempt.muteip")) { - Message.get("sender.error.exempt").set("player", onlinePlayer.getName()).sendTo(sender); - return true; - } - } - - final String reason = parser.getReason().getMessage(); - - plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() { - - @Override - public void run() { - final Long ip = CommandUtils.getIp(ipStr); - - if (ip == null) { - sender.sendMessage(Message.get("sender.error.notFound").set("player", ipStr).toString()); - return; - } - - final boolean isMuted = plugin.getIpMuteStorage().isMuted(ip); - - if (isMuted && !sender.hasPermission("bm.command.muteip.override")) { - Message message = Message.get("muteip.error.exists"); - message.set("ip", ipStr); - - sender.sendMessage(message.toString()); - return; - } - - final PlayerData actor = CommandUtils.getActor(sender); - - if (actor == null) return; - - if (isMuted) { - IpMuteData mute = plugin.getIpMuteStorage().getMute(ip); - - if (mute != null) { - try { - plugin.getIpMuteStorage().unmute(mute, actor); - } catch (SQLException e) { - sender.sendMessage(Message.get("sender.error.exception").toString()); - e.printStackTrace(); - return; - } - } - } - - final IpMuteData mute = new IpMuteData(ip, actor, reason, isSoft); - boolean created; - - try { - created = plugin.getIpMuteStorage().mute(mute, isSilent); - } catch (SQLException e) { - CommandUtils.handlePunishmentCreateException(e, sender, Message.get("muteip.error.exists").set("ip", - ipStr)); - return; - } - - if (!created) return; - if (isSoft) return; - - // Find online players - plugin.getServer().getScheduler().runTask(plugin, new Runnable() { - - public void run() { - Message message = Message.get("muteip.ip.disallowed") - .set("reason", mute.getReason()) - .set("actor", actor.getName()); - - for (Player onlinePlayer : plugin.getServer().getOnlinePlayers()) { - if (IPUtils.toLong(onlinePlayer.getAddress().getAddress()) == ip) { - message.sendTo(onlinePlayer); - } - } - } - }); - } - - }); - - return true; - } - -} diff --git a/src/main/java/me/confuser/banmanager/commands/NotesCommand.java b/src/main/java/me/confuser/banmanager/commands/NotesCommand.java deleted file mode 100644 index 9fd4be5f9..000000000 --- a/src/main/java/me/confuser/banmanager/commands/NotesCommand.java +++ /dev/null @@ -1,145 +0,0 @@ -package me.confuser.banmanager.commands; - -import com.j256.ormlite.dao.CloseableIterator; -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.data.PlayerNoteData; -import me.confuser.bukkitutil.Message; -import org.apache.commons.lang.time.FastDateFormat; -import org.bukkit.ChatColor; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.Collection; - -public class NotesCommand extends AutoCompleteNameTabCommand { - - public NotesCommand() { - super("notes"); - } - - @Override - public boolean onCommand(final CommandSender sender, Command command, String commandName, final String[] args) { - if (args.length == 0 && !sender.hasPermission("bm.command.notes.online")) { - Message.get("sender.error.noPermission").sendTo(sender); - return true; - } - - if (args.length > 1) { - return false; - } - - if (args.length == 1) { - final String name = args[0]; - - plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() { - - @Override - public void run() { - PlayerData player = plugin.getPlayerStorage().retrieve(name, false); - - if (player == null) { - sender.sendMessage(Message.get("sender.error.notFound").set("player", name).toString()); - return; - } - - CloseableIterator notesItr = null; - - try { - notesItr = plugin.getPlayerNoteStorage().getNotes(player.getUUID()); - ArrayList notes = new ArrayList<>(); - String dateTimeFormat = Message.getString("notes.dateTimeFormat"); - FastDateFormat dateFormatter = FastDateFormat.getInstance(dateTimeFormat); - - while (notesItr.hasNext()) { - PlayerNoteData note = notesItr.next(); - - Message noteMessage = Message.get("notes.note") - .set("player", note.getActor().getName()) - .set("message", note.getMessageColours()) - .set("created", dateFormatter.format(note.getCreated() * 1000L)); - notes.add(noteMessage); - } - - if (notes.size() == 0) { - Message.get("notes.error.noNotes").set("player", player.getName()).sendTo(sender); - return; - } - - Message header = Message.get("notes.header") - .set("player", player.getName()); - - header.sendTo(sender); - - for (Message message : notes) { - message.sendTo(sender); - } - - } catch (SQLException e) { - e.printStackTrace(); - } finally { - if (notesItr != null) notesItr.closeQuietly(); - } - } - - }); - } else { - plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() { - - @Override - public void run() { - Collection onlinePlayers = plugin.getServer().getOnlinePlayers(); - - if (onlinePlayers.size() == 0) { - Message.get("notes.error.noOnlineNotes").sendTo(sender); - return; - } - - CloseableIterator notesItr = null; - - try { - notesItr = plugin.getPlayerNoteStorage() - .queryBuilder() - .where() - .in("player_id", plugin.getPlayerStorage().getOnlineIds(onlinePlayers)) - .iterator(); - ArrayList notes = new ArrayList<>(); - String dateTimeFormat = Message.getString("notes.dateTimeFormat"); - FastDateFormat dateFormatter = FastDateFormat.getInstance(dateTimeFormat); - - while (notesItr.hasNext()) { - PlayerNoteData note = notesItr.next(); - - Message noteMessage = Message.get("notes.playerNote") - .set("player", note.getPlayer().getName()) - .set("actor", note.getActor().getName()) - .set("message", note.getMessageColours()) - .set("created", dateFormatter.format(note.getCreated() * 1000L)); - notes.add(noteMessage); - } - - if (notes.size() == 0) { - Message.get("notes.error.noOnlineNotes").sendTo(sender); - return; - } - - for (Message message : notes) { - message.sendTo(sender); - } - - } catch (SQLException e) { - e.printStackTrace(); - } finally { - if (notesItr != null) notesItr.closeQuietly(); - } - } - - }); - } - - return true; - } -} diff --git a/src/main/java/me/confuser/banmanager/commands/ReasonsCommand.java b/src/main/java/me/confuser/banmanager/commands/ReasonsCommand.java deleted file mode 100644 index c86b2dc32..000000000 --- a/src/main/java/me/confuser/banmanager/commands/ReasonsCommand.java +++ /dev/null @@ -1,27 +0,0 @@ -package me.confuser.banmanager.commands; - -import me.confuser.banmanager.BanManager; -import me.confuser.bukkitutil.Message; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; - -import java.util.Map; - -public class ReasonsCommand extends AutoCompleteNameTabCommand { - - public ReasonsCommand() { - super("reasons"); - } - - @Override - public boolean onCommand(final CommandSender sender, Command command, String commandName, String[] args) { - - if (args.length != 0) return false; - - for (Map.Entry entry : plugin.getReasonsConfig().getReasons().entrySet()) { - Message.get("reasons.row").set("hashtag", entry.getKey()).set("reason", entry.getValue()).sendTo(sender); - } - - return true; - } -} diff --git a/src/main/java/me/confuser/banmanager/commands/ReloadCommand.java b/src/main/java/me/confuser/banmanager/commands/ReloadCommand.java deleted file mode 100644 index 00dd7d8a8..000000000 --- a/src/main/java/me/confuser/banmanager/commands/ReloadCommand.java +++ /dev/null @@ -1,28 +0,0 @@ -package me.confuser.banmanager.commands; - -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.configs.MessagesConfig; -import me.confuser.bukkitutil.Message; -import me.confuser.bukkitutil.commands.BukkitCommand; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; - -public class ReloadCommand extends BukkitCommand { - - public ReloadCommand() { - super("bmreload"); - } - - @Override - public boolean onCommand(CommandSender sender, Command command, String commandName, String[] args) { - plugin.getConfiguration().load(); - new MessagesConfig().load(); - plugin.getExemptionsConfig().load(); - plugin.getReasonsConfig().load(); - plugin.getGeoIpConfig().load(); - - sender.sendMessage(Message.get("configReloaded").toString()); - - return true; - } -} diff --git a/src/main/java/me/confuser/banmanager/commands/ReportCommand.java b/src/main/java/me/confuser/banmanager/commands/ReportCommand.java deleted file mode 100644 index 2249de27e..000000000 --- a/src/main/java/me/confuser/banmanager/commands/ReportCommand.java +++ /dev/null @@ -1,118 +0,0 @@ -package me.confuser.banmanager.commands; - -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.data.PlayerReportData; -import me.confuser.banmanager.util.CommandParser; -import me.confuser.banmanager.util.CommandUtils; -import me.confuser.bukkitutil.Message; -import me.confuser.bukkitutil.commands.BukkitCommand; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.sql.SQLException; -import java.util.UUID; - -public class ReportCommand extends BukkitCommand { - - public ReportCommand() { - super("report"); - } - - @Override - public boolean onCommand(final CommandSender sender, Command command, String commandName, String[] args) { - CommandParser parser = new CommandParser(args); - args = parser.getArgs(); - final boolean isSilent = parser.isSilent(); - - if (isSilent && !sender.hasPermission(command.getPermission() + ".silent")) { - sender.sendMessage(Message.getString("sender.error.noPermission")); - return true; - } - - if (args.length < 2) { - return false; - } - - if (CommandUtils.isValidNameDelimiter(args[0])) { - CommandUtils.handleMultipleNames(sender, commandName, args); - return true; - } - - if (args[0].equalsIgnoreCase(sender.getName())) { - sender.sendMessage(Message.getString("sender.error.noSelf")); - return true; - } - - // Check if UUID vs name - final String playerName = args[0]; - final boolean isUUID = playerName.length() > 16; - - Player onlinePlayer; - - if (isUUID) { - onlinePlayer = plugin.getServer().getPlayer(UUID.fromString(playerName)); - } else { - onlinePlayer = plugin.getServer().getPlayer(playerName); - } - - if (onlinePlayer == null) { - if (!sender.hasPermission("bm.command.report.offline")) { - sender.sendMessage(Message.getString("sender.error.offlinePermission")); - return true; - } - } else if (!sender.hasPermission("bm.exempt.override.report") && onlinePlayer.hasPermission("bm.exempt.report")) { - Message.get("sender.error.exempt").set("player", onlinePlayer.getName()).sendTo(sender); - return true; - } - - final String reason = CommandUtils.getReason(1, args).getMessage(); - - plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() { - - @Override - public void run() { - final PlayerData player = CommandUtils.getPlayer(sender, playerName, false); - - if (player == null) { - sender.sendMessage(Message.get("sender.error.notFound").set("player", playerName).toString()); - return; - } - - if (plugin.getExemptionsConfig().isExempt(player, "ban")) { - sender.sendMessage(Message.get("sender.error.exempt").set("player", playerName).toString()); - return; - } - - try { - if (plugin.getPlayerReportStorage().isRecentlyReported(player)) { - Message.get("report.error.cooldown").sendTo(sender); - return; - } - } catch (SQLException e) { - sender.sendMessage(Message.get("sender.error.exception").toString()); - e.printStackTrace(); - return; - } - - final PlayerData actor = CommandUtils.getActor(sender); - - if (actor == null) return; - - try { - PlayerReportData report = new PlayerReportData(player, actor, reason, plugin.getReportStateStorage() - .queryForId(1)); - plugin.getPlayerReportStorage().report(report, isSilent); - } catch (SQLException e) { - sender.sendMessage(Message.get("sender.error.exception").toString()); - e.printStackTrace(); - } - - } - - }); - - return true; - } -} diff --git a/src/main/java/me/confuser/banmanager/commands/ReportsCommand.java b/src/main/java/me/confuser/banmanager/commands/ReportsCommand.java deleted file mode 100644 index 3053da2bb..000000000 --- a/src/main/java/me/confuser/banmanager/commands/ReportsCommand.java +++ /dev/null @@ -1,44 +0,0 @@ -package me.confuser.banmanager.commands; - -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.commands.report.*; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.data.PlayerReportData; -import me.confuser.banmanager.util.CommandParser; -import me.confuser.banmanager.util.CommandUtils; -import me.confuser.bukkitutil.Message; -import me.confuser.bukkitutil.commands.MultiCommandHandler; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.sql.SQLException; -import java.util.UUID; - -public class ReportsCommand extends MultiCommandHandler { - - public ReportsCommand() { - super("reports"); - - registerCommands(); - } - - @Override - public void registerCommands() { - registerSubCommand(new AssignSubCommand()); - registerSubCommand(new CloseSubCommand()); - registerSubCommand(new InfoSubCommand()); - registerSubCommand(new ListSubCommand()); - registerSubCommand(new TeleportSubCommand()); - registerSubCommand(new UnassignSubCommand()); - } - - @Override - public boolean onCommand(final CommandSender sender, Command command, String commandName, String[] args) { - if (args.length == 0 && sender instanceof Player) return getCommands().get("list").onCommand(sender, args); - - return super.onCommand(sender, command, commandName, args); - } - - -} diff --git a/src/main/java/me/confuser/banmanager/commands/RollbackCommand.java b/src/main/java/me/confuser/banmanager/commands/RollbackCommand.java deleted file mode 100644 index bb8051652..000000000 --- a/src/main/java/me/confuser/banmanager/commands/RollbackCommand.java +++ /dev/null @@ -1,281 +0,0 @@ -package me.confuser.banmanager.commands; - -import com.j256.ormlite.stmt.DeleteBuilder; -import com.j256.ormlite.stmt.QueryBuilder; -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.configs.TimeLimitType; -import me.confuser.banmanager.data.*; -import me.confuser.banmanager.util.CommandUtils; -import me.confuser.banmanager.util.DateUtils; -import me.confuser.bukkitutil.Message; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; - -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashSet; - -public class RollbackCommand extends AutoCompleteNameTabCommand { - - // Must be ArrayList as needs to execute in this order - private static ArrayList types = new ArrayList() { - - { - add("bans"); - add("banrecords"); - add("ipbans"); - add("ipbanrecords"); - add("ipmutes"); - add("ipmuterecords"); - add("kicks"); - add("mutes"); - add("muterecords"); - add("notes"); - add("reports"); - add("warnings"); - } - }; - - public RollbackCommand() { - super("bmrollback"); - } - - @Override - public boolean onCommand(final CommandSender sender, Command command, String commandName, final String[] args) { - - if (args.length < 2) return false; - - if (CommandUtils.isValidNameDelimiter(args[0])) { - CommandUtils.handleMultipleNames(sender, commandName, args); - return true; - } - - long expiresCheck; - - try { - expiresCheck = DateUtils.parseDateDiff(args[1], false); - } catch (Exception e) { - sender.sendMessage(Message.get("time.error.invalid").toString()); - return true; - } - - if (plugin.getConfiguration().getTimeLimits().isPastLimit(sender, TimeLimitType.ROLLBACK, expiresCheck)) { - Message.get("time.error.limit").sendTo(sender); - return true; - } - - final long expires = expiresCheck; - - // Check if UUID vs name - final String playerName = args[0]; - - plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() { - - @Override - public void run() { - final PlayerData player = CommandUtils.getPlayer(sender, playerName); - - if (player == null) { - sender.sendMessage(Message.get("sender.error.notFound").set("player", playerName).toString()); - return; - } - - ArrayList types = new ArrayList<>(); - - if (args.length == 2) { - for (String type : RollbackCommand.types) { - if (!sender.hasPermission("bm.command.bmrollback." + type)) { - Message.get("sender.error.noPermission").sendTo(sender); - return; - } - } - - types.addAll(RollbackCommand.types); - } else { - for (int i = 2; i < args.length; i++) { - String type = args[1].toLowerCase(); - - if (type.contains(",")) { - types.addAll(Arrays.asList(type.split(","))); - } else { - types.add(type); - } - } - } - - long now = System.currentTimeMillis() / 1000L; - - for (String type : types) { - if (!RollbackCommand.types.contains(type)) { - Message.get("bmrollback.error.invalid").set("type", type).sendTo(sender); - return; - } else if (sender.hasPermission("bm.command.bmrollback." + type)) { - try { - plugin.getRollbackStorage() - .create(new RollbackData(player, CommandUtils.getActor(sender), type, expires, now)); - } catch (SQLException e) { - sender.sendMessage(Message.get("sender.error.exception").toString()); - e.printStackTrace(); - return; - } - } - } - - // Forces running in order - // I.e bans must be executed before banrecords etc - for (String type : RollbackCommand.types) { - if (!types.contains(type)) continue; - - // @TODO Transactions for robustness - try { - switch (type) { - case "bans": - DeleteBuilder bans = plugin.getPlayerBanStorage().deleteBuilder(); - bans.where().eq("actor_id", player.getId()).and().le("created", now).and().ge("created", expires); - bans.delete(); - break; - - case "banrecords": - QueryBuilder banRecords = plugin.getPlayerBanRecordStorage().queryBuilder(); - banRecords.where().eq("actor_id", player.getId()).and().le("created", now).and().ge("created", expires); - - for (PlayerBanRecord record : banRecords.query()) { - try { - if (plugin.getPlayerBanStorage().retrieveBan(record.getPlayer().getUUID()) == null) { - plugin.getPlayerBanStorage().create(new PlayerBanData(record)); - } - - plugin.getPlayerBanRecordStorage().delete(record); - } catch (SQLException e) { - sender.sendMessage(Message.get("sender.error.exception").toString()); - e.printStackTrace(); - return; - } - } - - break; - - case "ipbans": - DeleteBuilder ipBans = plugin.getIpBanStorage().deleteBuilder(); - ipBans.where().eq("actor_id", player.getId()).and().le("created", now).and().ge("created", expires); - ipBans.delete(); - break; - - case "ipbanrecords": - QueryBuilder ipBanRecords = plugin.getIpBanRecordStorage().queryBuilder(); - ipBanRecords.where().eq("actor_id", player.getId()).and().le("created", now).and().ge("created", expires); - - for (IpBanRecord record : ipBanRecords.query()) { - try { - if (plugin.getIpBanStorage().retrieveBan(record.getIp()) == null) { - plugin.getIpBanStorage().create(new IpBanData(record)); - } - - plugin.getIpBanRecordStorage().delete(record); - } catch (SQLException e) { - sender.sendMessage(Message.get("sender.error.exception").toString()); - e.printStackTrace(); - return; - } - } - - break; - - case "kicks": - DeleteBuilder kicks = plugin.getPlayerKickStorage().deleteBuilder(); - kicks.where().eq("actor_id", player.getId()).and().le("created", now).and().ge("created", expires); - kicks.delete(); - - break; - - case "mutes": - DeleteBuilder mutes = plugin.getPlayerMuteStorage().deleteBuilder(); - mutes.where().eq("actor_id", player.getId()).and().le("created", now).and().ge("created", expires); - mutes.delete(); - break; - - case "muterecords": - QueryBuilder muteRecords = plugin.getPlayerMuteRecordStorage().queryBuilder(); - muteRecords.where().eq("actor_id", player.getId()).and().le("created", now).and().ge("created", expires); - - for (PlayerMuteRecord record : muteRecords.query()) { - try { - if (plugin.getPlayerMuteStorage().retrieveMute(record.getPlayer().getUUID()) == null) { - plugin.getPlayerMuteStorage().create(new PlayerMuteData(record)); - } - - plugin.getPlayerMuteRecordStorage().delete(record); - } catch (SQLException e) { - sender.sendMessage(Message.get("sender.error.exception").toString()); - e.printStackTrace(); - return; - } - } - break; - - case "ipmutes": - DeleteBuilder ipMutes = plugin.getIpMuteStorage().deleteBuilder(); - ipMutes.where().eq("actor_id", player.getId()).and().le("created", now).and().ge("created", expires); - ipMutes.delete(); - break; - - case "ipmuterecords": - QueryBuilder ipMuteRecords = plugin.getIpMuteRecordStorage().queryBuilder(); - ipMuteRecords.where().eq("actor_id", player.getId()).and().le("created", now).and().ge("created", expires); - - for (IpMuteRecord record : ipMuteRecords.query()) { - try { - if (plugin.getIpMuteStorage().retrieveMute(record.getIp()) == null) { - plugin.getIpMuteStorage().create(new IpMuteData(record)); - } - - plugin.getIpMuteRecordStorage().delete(record); - } catch (SQLException e) { - sender.sendMessage(Message.get("sender.error.exception").toString()); - e.printStackTrace(); - return; - } - } - break; - - case "notes": - DeleteBuilder notes = plugin.getPlayerNoteStorage().deleteBuilder(); - notes.where().eq("actor_id", player.getId()).and().le("created", now).and().ge("created", expires); - notes.delete(); - break; - - case "reports": - QueryBuilder reports = plugin.getPlayerReportStorage().queryBuilder(); - reports.where().eq("actor_id", player.getId()).and().le("created", now).and().ge("created", expires); - - for (PlayerReportData record : reports.query()) { - plugin.getPlayerReportStorage().deleteById(record.getId()); - } - break; - - case "warnings": - DeleteBuilder warnings = plugin.getPlayerWarnStorage().deleteBuilder(); - warnings.where().eq("actor_id", player.getId()).and().le("created", now).and().ge("created", expires); - warnings.delete(); - break; - } - } catch (SQLException e) { - sender.sendMessage(Message.get("sender.error.exception").toString()); - e.printStackTrace(); - return; - } - - Message.get("bmrollback.notify") - .set("type", type) - .set("player", player.getName()) - .set("playerId", player.getUUID().toString()) - .sendTo(sender); - } - } - }); - - return true; - } - -} diff --git a/src/main/java/me/confuser/banmanager/commands/SyncCommand.java b/src/main/java/me/confuser/banmanager/commands/SyncCommand.java deleted file mode 100644 index caf9de3ed..000000000 --- a/src/main/java/me/confuser/banmanager/commands/SyncCommand.java +++ /dev/null @@ -1,68 +0,0 @@ -package me.confuser.banmanager.commands; - -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.runnables.BmRunnable; -import me.confuser.bukkitutil.Message; -import me.confuser.bukkitutil.commands.BukkitCommand; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; - -public class SyncCommand extends BukkitCommand { - - private final String[] localSync = new String[] { "playerBans", "playerMutes", "ipBans", "ipRangeBans", "expiresCheck" }; - private final String[] globalSync = new String[] { "globalPlayerBans", "globalPlayerMutes", "globalPlayerNotes", - "globalIpBans" }; - - public SyncCommand() { - super("bmsync"); - } - - @Override - public boolean onCommand(final CommandSender sender, Command command, String commandName, String[] args) { - if (args.length != 1) return false; - - final String type = args[0]; - - if (!type.equals("local") && !type.equals("global")) return false; - - plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() { - - @Override - public void run() { - Message.get("sync.player.started").set("type", type).sendTo(sender); - - if (type.equals("local")) { - handleLocalSync(); - } else { - handleGlobalSync(); - } - - Message.get("sync.player.finished").set("type", type).sendTo(sender); - } - }); - - return true; - } - - private void handleLocalSync() { - for (String aLocalSync : localSync) { - BmRunnable runner = plugin.getSyncRunner().getRunner(aLocalSync); - - if (runner.isRunning()) continue; - - runner.run(); - } - } - - private void handleGlobalSync() { - if (plugin.getGlobalPlayerBanStorage() == null) return; - - for (String aGlobalSync : globalSync) { - BmRunnable runner = plugin.getSyncRunner().getRunner(aGlobalSync); - - if (runner.isRunning()) continue; - - runner.run(); - } - } -} diff --git a/src/main/java/me/confuser/banmanager/commands/TempBanCommand.java b/src/main/java/me/confuser/banmanager/commands/TempBanCommand.java deleted file mode 100644 index 3eaf681a8..000000000 --- a/src/main/java/me/confuser/banmanager/commands/TempBanCommand.java +++ /dev/null @@ -1,191 +0,0 @@ -package me.confuser.banmanager.commands; - -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.configs.TimeLimitType; -import me.confuser.banmanager.data.PlayerBanData; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.util.CommandParser; -import me.confuser.banmanager.util.CommandUtils; -import me.confuser.banmanager.util.DateUtils; -import me.confuser.banmanager.util.parsers.Reason; -import me.confuser.bukkitutil.Message; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.sql.SQLException; -import java.util.UUID; - -public class TempBanCommand extends AutoCompleteNameTabCommand { - - public TempBanCommand() { - super("tempban"); - } - - @Override - public boolean onCommand(final CommandSender sender, Command command, String commandName, String[] args) { - CommandParser parser = new CommandParser(args, 2); - args = parser.getArgs(); - final boolean isSilent = parser.isSilent(); - - if (isSilent && !sender.hasPermission(command.getPermission() + ".silent")) { - sender.sendMessage(Message.getString("sender.error.noPermission")); - return true; - } - - if (args.length < 3) { - return false; - } - - if (CommandUtils.isValidNameDelimiter(args[0])) { - CommandUtils.handleMultipleNames(sender, commandName, args); - return true; - } - - if (args[0].equalsIgnoreCase(sender.getName())) { - sender.sendMessage(Message.getString("sender.error.noSelf")); - return true; - } - - // Check if UUID vs name - final String playerName = args[0]; - final boolean isUUID = playerName.length() > 16; - final boolean isBanned; - - if (isUUID) { - try { - isBanned = plugin.getPlayerBanStorage().isBanned(UUID.fromString(playerName)); - } catch (IllegalArgumentException e) { - sender.sendMessage(Message.get("sender.error.notFound").set("player", playerName).toString()); - return true; - } - } else { - isBanned = plugin.getPlayerBanStorage().isBanned(playerName); - } - - if (isBanned && !sender.hasPermission("bm.command.tempban.override")) { - Message message = Message.get("ban.error.exists"); - message.set("player", playerName); - - sender.sendMessage(message.toString()); - return true; - } - - final Player onlinePlayer; - - if (isUUID) { - onlinePlayer = plugin.getServer().getPlayer(UUID.fromString(playerName)); - } else { - onlinePlayer = plugin.getServer().getPlayer(playerName); - } - - if (onlinePlayer == null) { - if (!sender.hasPermission("bm.command.tempban.offline")) { - sender.sendMessage(Message.getString("sender.error.offlinePermission")); - return true; - } - } else if (!sender.hasPermission("bm.exempt.override.tempban") && onlinePlayer.hasPermission("bm.exempt.tempban")) { - Message.get("sender.error.exempt").set("player", onlinePlayer.getName()).sendTo(sender); - return true; - } - - long expiresCheck; - - try { - expiresCheck = DateUtils.parseDateDiff(args[1], true); - } catch (Exception e1) { - sender.sendMessage(Message.get("time.error.invalid").toString()); - return true; - } - - if (plugin.getConfiguration().getTimeLimits().isPastLimit(sender, TimeLimitType.PLAYER_BAN, expiresCheck)) { - Message.get("time.error.limit").sendTo(sender); - return true; - } - - final long expires = expiresCheck; - final Reason reason = parser.getReason(); - - plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() { - - @Override - public void run() { - final PlayerData player = CommandUtils.getPlayer(sender, playerName); - - if (player == null) { - sender.sendMessage(Message.get("sender.error.notFound").set("player", playerName).toString()); - return; - } - - if (plugin.getExemptionsConfig().isExempt(player, "tempban")) { - sender.sendMessage(Message.get("sender.error.exempt").set("player", playerName).toString()); - return; - } - - final PlayerData actor = CommandUtils.getActor(sender); - - if (actor == null) return; - - if (isBanned) { - PlayerBanData ban; - - if (isUUID) { - ban = plugin.getPlayerBanStorage().getBan(UUID.fromString(playerName)); - } else { - ban = plugin.getPlayerBanStorage().getBan(playerName); - } - - if (ban != null) { - try { - plugin.getPlayerBanStorage().unban(ban, actor); - } catch (SQLException e) { - sender.sendMessage(Message.get("sender.error.exception").toString()); - e.printStackTrace(); - return; - } - } - } - - final PlayerBanData ban = new PlayerBanData(player, actor, reason.getMessage(), expires); - boolean created; - - try { - created = plugin.getPlayerBanStorage().ban(ban, isSilent); - } catch (SQLException e) { - CommandUtils.handlePunishmentCreateException(e, sender, Message.get("ban.error.exists").set("player", - playerName)); - return; - } - - if (!created) { - return; - } - - CommandUtils.handlePrivateNotes(player, actor, reason); - - plugin.getServer().getScheduler().runTask(plugin, new Runnable() { - - @Override - public void run() { - if (onlinePlayer == null) return; - - Message kickMessage = Message.get("tempban.player.kick") - .set("displayName", onlinePlayer.getDisplayName()) - .set("player", player.getName()) - .set("playerId", player.getUUID().toString()) - .set("reason", ban.getReason()) - .set("actor", actor.getName()) - .set("expires", DateUtils.getDifferenceFormat(ban.getExpires())); - - onlinePlayer.kickPlayer(kickMessage.toString()); - } - - }); - - } - - }); - - return true; - } -} diff --git a/src/main/java/me/confuser/banmanager/commands/TempIpBanCommand.java b/src/main/java/me/confuser/banmanager/commands/TempIpBanCommand.java deleted file mode 100644 index 1e5cbd59e..000000000 --- a/src/main/java/me/confuser/banmanager/commands/TempIpBanCommand.java +++ /dev/null @@ -1,155 +0,0 @@ -package me.confuser.banmanager.commands; - -import com.google.common.net.InetAddresses; -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.configs.TimeLimitType; -import me.confuser.banmanager.data.IpBanData; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.util.*; -import me.confuser.bukkitutil.Message; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.sql.SQLException; - -public class TempIpBanCommand extends AutoCompleteNameTabCommand { - - public TempIpBanCommand() { - super("tempbanip"); - } - - @Override - public boolean onCommand(final CommandSender sender, Command command, String commandName, String[] args) { - CommandParser parser = new CommandParser(args, 2); - args = parser.getArgs(); - final boolean isSilent = parser.isSilent(); - - if (isSilent && !sender.hasPermission(command.getPermission() + ".silent")) { - sender.sendMessage(Message.getString("sender.error.noPermission")); - return true; - } - - if (args.length < 3) { - return false; - } - - if (CommandUtils.isValidNameDelimiter(args[0])) { - CommandUtils.handleMultipleNames(sender, commandName, args); - return true; - } - - final String ipStr = args[0]; - final boolean isName = !InetAddresses.isInetAddress(ipStr); - - if (isName && ipStr.length() > 16) { - Message message = Message.get("sender.error.invalidIp"); - message.set("ip", ipStr); - - sender.sendMessage(message.toString()); - return true; - } - - if (isName) { - Player onlinePlayer = plugin.getServer().getPlayer(ipStr); - - if (onlinePlayer != null && !sender.hasPermission("bm.exempt.override.banip") - && onlinePlayer.hasPermission("bm.exempt.banip")) { - Message.get("sender.error.exempt").set("player", onlinePlayer.getName()).sendTo(sender); - return true; - } - } - - long expiresCheck; - - try { - expiresCheck = DateUtils.parseDateDiff(args[1], true); - } catch (Exception e1) { - sender.sendMessage(Message.get("time.error.invalid").toString()); - return true; - } - - if (plugin.getConfiguration().getTimeLimits().isPastLimit(sender, TimeLimitType.IP_BAN, expiresCheck)) { - Message.get("time.error.limit").sendTo(sender); - return true; - } - - final long expires = expiresCheck; - final String reason = parser.getReason().getMessage(); - - plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() { - - @Override - public void run() { - final Long ip = CommandUtils.getIp(ipStr); - - if (ip == null) { - sender.sendMessage(Message.get("sender.error.notFound").set("player", ipStr).toString()); - return; - } - - final boolean isBanned = plugin.getIpBanStorage().isBanned(ip); - - if (isBanned && !sender.hasPermission("bm.command.tempbanip.override")) { - Message message = Message.get("banip.error.exists"); - message.set("ip", ipStr); - - sender.sendMessage(message.toString()); - return; - } - - final PlayerData actor = CommandUtils.getActor(sender); - - if (actor == null) return; - - if (isBanned) { - IpBanData ban = plugin.getIpBanStorage().getBan(ip); - - if (ban != null) { - try { - plugin.getIpBanStorage().unban(ban, actor); - } catch (SQLException e) { - sender.sendMessage(Message.get("sender.error.exception").toString()); - e.printStackTrace(); - return; - } - } - } - - final IpBanData ban = new IpBanData(ip, actor, reason, expires); - boolean created; - - try { - created = plugin.getIpBanStorage().ban(ban, isSilent); - } catch (SQLException e) { - CommandUtils.handlePunishmentCreateException(e, sender, Message.get("banip.error.exists").set("ip", - ipStr)); - return; - } - - if (!created) { - return; - } - - // Find online players - plugin.getServer().getScheduler().runTask(plugin, new Runnable() { - - public void run() { - Message kickMessage = Message.get("tempbanip.ip.kick").set("reason", ban.getReason()).set("actor", actor - .getName()); - - for (Player onlinePlayer : plugin.getServer().getOnlinePlayers()) { - if (IPUtils.toLong(onlinePlayer.getAddress().getAddress()) == ip) { - onlinePlayer.kickPlayer(kickMessage.toString()); - } - } - } - }); - - } - - }); - - return true; - } -} diff --git a/src/main/java/me/confuser/banmanager/commands/TempIpMuteCommand.java b/src/main/java/me/confuser/banmanager/commands/TempIpMuteCommand.java deleted file mode 100644 index c28da0146..000000000 --- a/src/main/java/me/confuser/banmanager/commands/TempIpMuteCommand.java +++ /dev/null @@ -1,165 +0,0 @@ -package me.confuser.banmanager.commands; - -import com.google.common.net.InetAddresses; -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.configs.TimeLimitType; -import me.confuser.banmanager.data.IpMuteData; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.util.CommandParser; -import me.confuser.banmanager.util.CommandUtils; -import me.confuser.banmanager.util.DateUtils; -import me.confuser.banmanager.util.IPUtils; -import me.confuser.bukkitutil.Message; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.sql.SQLException; - -public class TempIpMuteCommand extends AutoCompleteNameTabCommand { - - public TempIpMuteCommand() { - super("tempmuteip"); - } - - @Override - public boolean onCommand(final CommandSender sender, Command command, String commandName, String[] args) { - CommandParser parser = new CommandParser(args, 2); - args = parser.getArgs(); - final boolean isSilent = parser.isSilent(); - - if (isSilent && !sender.hasPermission(command.getPermission() + ".silent")) { - sender.sendMessage(Message.getString("sender.error.noPermission")); - return true; - } - - final boolean isSoft = parser.isSoft(); - - if (isSoft && !sender.hasPermission(command.getPermission() + ".soft")) { - sender.sendMessage(Message.getString("sender.error.noPermission")); - return true; - } - - if (args.length < 3) { - return false; - } - - if (CommandUtils.isValidNameDelimiter(args[0])) { - CommandUtils.handleMultipleNames(sender, commandName, args); - return true; - } - - final String ipStr = args[0]; - final boolean isName = !InetAddresses.isInetAddress(ipStr); - - if (isName && ipStr.length() > 16) { - Message message = Message.get("sender.error.invalidIp"); - message.set("ip", ipStr); - - sender.sendMessage(message.toString()); - return true; - } - - if (isName) { - Player onlinePlayer = plugin.getServer().getPlayer(ipStr); - - if (onlinePlayer != null && !sender.hasPermission("bm.exempt.override.muteip") - && onlinePlayer.hasPermission("bm.exempt.muteip")) { - Message.get("sender.error.exempt").set("player", onlinePlayer.getName()).sendTo(sender); - return true; - } - } - - long expiresCheck; - - try { - expiresCheck = DateUtils.parseDateDiff(args[1], true); - } catch (Exception e1) { - sender.sendMessage(Message.get("time.error.invalid").toString()); - return true; - } - - if (plugin.getConfiguration().getTimeLimits().isPastLimit(sender, TimeLimitType.IP_MUTE, expiresCheck)) { - Message.get("time.error.limit").sendTo(sender); - return true; - } - - final long expires = expiresCheck; - final String reason = parser.getReason().getMessage(); - - plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() { - - @Override - public void run() { - final Long ip = CommandUtils.getIp(ipStr); - - if (ip == null) { - sender.sendMessage(Message.get("sender.error.notFound").set("player", ipStr).toString()); - return; - } - - final boolean isMuted = plugin.getIpMuteStorage().isMuted(ip); - - if (isMuted && !sender.hasPermission("bm.command.tempmuteip.override")) { - Message message = Message.get("muteip.error.exists"); - message.set("ip", ipStr); - - sender.sendMessage(message.toString()); - return; - } - - final PlayerData actor = CommandUtils.getActor(sender); - - if (actor == null) return; - if (isMuted) { - IpMuteData mute = plugin.getIpMuteStorage().getMute(ip); - - if (mute != null) { - try { - plugin.getIpMuteStorage().unmute(mute, actor); - } catch (SQLException e) { - sender.sendMessage(Message.get("sender.error.exception").toString()); - e.printStackTrace(); - return; - } - } - } - - final IpMuteData mute = new IpMuteData(ip, actor, reason, isSoft, expires); - boolean created; - - try { - created = plugin.getIpMuteStorage().mute(mute, isSilent); - } catch (SQLException e) { - CommandUtils.handlePunishmentCreateException(e, sender, Message.get("muteip.error.exists").set("ip", - ipStr)); - return; - } - - if (!created) return; - if (isSoft) return; - - // Find online players - plugin.getServer().getScheduler().runTask(plugin, new Runnable() { - - public void run() { - Message message = Message.get("tempmuteip.ip.disallowed") - .set("reason", mute.getReason()) - .set("actor", actor.getName()) - .set("expires", DateUtils.getDifferenceFormat(mute.getExpires())); - - for (Player onlinePlayer : plugin.getServer().getOnlinePlayers()) { - if (IPUtils.toLong(onlinePlayer.getAddress().getAddress()) == ip) { - message.sendTo(onlinePlayer); - } - } - } - }); - - } - - }); - - return true; - } -} diff --git a/src/main/java/me/confuser/banmanager/commands/TempIpRangeBanCommand.java b/src/main/java/me/confuser/banmanager/commands/TempIpRangeBanCommand.java deleted file mode 100644 index 0fd39e1da..000000000 --- a/src/main/java/me/confuser/banmanager/commands/TempIpRangeBanCommand.java +++ /dev/null @@ -1,139 +0,0 @@ -package me.confuser.banmanager.commands; - -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.configs.TimeLimitType; -import me.confuser.banmanager.data.IpRangeBanData; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.util.*; -import me.confuser.bukkitutil.Message; -import me.confuser.bukkitutil.commands.BukkitCommand; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.sql.SQLException; - -public class TempIpRangeBanCommand extends BukkitCommand { - - public TempIpRangeBanCommand() { - super("tempbaniprange"); - } - - @Override - public boolean onCommand(final CommandSender sender, Command command, String commandName, String[] args) { - CommandParser parser = new CommandParser(args, 2); - args = parser.getArgs(); - final boolean isSilent = parser.isSilent(); - - if (isSilent && !sender.hasPermission(command.getPermission() + ".silent")) { - sender.sendMessage(Message.getString("sender.error.noPermission")); - return true; - } - - if (args.length < 3) { - return false; - } - - String ipStr = args[0]; - long[] range = null; - - if (ipStr.contains("*")) { - // Simple wildcard logic - range = IPUtils.getRangeFromWildcard(ipStr); - } else if (ipStr.contains("/")) { - // cidr notation - range = IPUtils.getRangeFromCidrNotation(ipStr); - } - - if (range == null) { - Message.get("baniprange.error.invalid").sendTo(sender); - return true; - } - - final long fromIp = range[0]; - final long toIp = range[1]; - - if (fromIp > toIp) { - Message.get("baniprange.error.minMax").sendTo(sender); - return true; - } - - if (plugin.getIpRangeBanStorage().isBanned(fromIp) || plugin.getIpRangeBanStorage().isBanned(toIp)) { - Message.get("baniprange.error.exists").sendTo(sender); - return true; - } - - long expiresCheck; - - try { - expiresCheck = DateUtils.parseDateDiff(args[1], true); - } catch (Exception e1) { - sender.sendMessage(Message.get("time.error.invalid").toString()); - return true; - } - - if (plugin.getConfiguration().getTimeLimits().isPastLimit(sender, TimeLimitType.IP_BAN, expiresCheck)) { - Message.get("time.error.limit").sendTo(sender); - return true; - } - - final long expires = expiresCheck; - - final String reason = parser.getReason().getMessage(); - - plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() { - - @Override - public void run() { - final PlayerData actor; - - if (sender instanceof Player) { - try { - actor = plugin.getPlayerStorage().queryForId(UUIDUtils.toBytes((Player) sender)); - } catch (SQLException e) { - sender.sendMessage(Message.get("sender.error.exception").toString()); - e.printStackTrace(); - return; - } - } else { - actor = plugin.getPlayerStorage().getConsole(); - } - - final IpRangeBanData ban = new IpRangeBanData(fromIp, toIp, actor, reason, expires); - boolean created; - - try { - created = plugin.getIpRangeBanStorage().ban(ban, isSilent); - } catch (SQLException e) { - CommandUtils.handlePunishmentCreateException(e, sender, Message.get("baniprange.error.exists")); - return; - } - - if (!created) { - return; - } - - // Find online players - plugin.getServer().getScheduler().runTask(plugin, new Runnable() { - - public void run() { - Message kickMessage = Message.get("tempbaniprange.ip.kick") - .set("reason", ban.getReason()) - .set("actor", actor.getName()) - .set("expires", DateUtils.getDifferenceFormat(ban.getExpires())); - - for (Player onlinePlayer : plugin.getServer().getOnlinePlayers()) { - if (ban.inRange(IPUtils.toLong(onlinePlayer.getAddress().getAddress()))) { - onlinePlayer.kickPlayer(kickMessage.toString()); - } - } - } - }); - } - }); - - return true; - - } - -} diff --git a/src/main/java/me/confuser/banmanager/commands/TempMuteCommand.java b/src/main/java/me/confuser/banmanager/commands/TempMuteCommand.java deleted file mode 100644 index 66f40dc61..000000000 --- a/src/main/java/me/confuser/banmanager/commands/TempMuteCommand.java +++ /dev/null @@ -1,195 +0,0 @@ -package me.confuser.banmanager.commands; - -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.configs.TimeLimitType; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.data.PlayerMuteData; -import me.confuser.banmanager.util.CommandParser; -import me.confuser.banmanager.util.CommandUtils; -import me.confuser.banmanager.util.DateUtils; -import me.confuser.banmanager.util.parsers.Reason; -import me.confuser.bukkitutil.Message; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.sql.SQLException; -import java.util.UUID; - -public class TempMuteCommand extends AutoCompleteNameTabCommand { - - public TempMuteCommand() { - super("tempmute"); - } - - @Override - public boolean onCommand(final CommandSender sender, Command command, String commandName, String[] args) { - CommandParser parser = new CommandParser(args, 2); - args = parser.getArgs(); - final boolean isSilent = parser.isSilent(); - - if (isSilent && !sender.hasPermission(command.getPermission() + ".silent")) { - sender.sendMessage(Message.getString("sender.error.noPermission")); - return true; - } - - final boolean isSoft = parser.isSoft(); - - if (isSoft && !sender.hasPermission(command.getPermission() + ".soft")) { - sender.sendMessage(Message.getString("sender.error.noPermission")); - return true; - } - - if (args.length < 3) { - return false; - } - - if (CommandUtils.isValidNameDelimiter(args[0])) { - CommandUtils.handleMultipleNames(sender, commandName, args); - return true; - } - - if (args[0].equalsIgnoreCase(sender.getName())) { - sender.sendMessage(Message.getString("sender.error.noSelf")); - return true; - } - - // Check if UUID vs name - final String playerName = args[0]; - final boolean isUUID = playerName.length() > 16; - final boolean isMuted; - - if (isUUID) { - try { - isMuted = plugin.getPlayerMuteStorage().isMuted(UUID.fromString(playerName)); - } catch (IllegalArgumentException e) { - sender.sendMessage(Message.get("sender.error.notFound").set("player", playerName).toString()); - return true; - } - } else { - isMuted = plugin.getPlayerMuteStorage().isMuted(playerName); - } - - if (isMuted && !sender.hasPermission("bm.command.tempmute.override")) { - Message message = Message.get("mute.error.exists"); - message.set("player", playerName); - - sender.sendMessage(message.toString()); - return true; - } - - Player onlinePlayer; - - if (isUUID) { - onlinePlayer = plugin.getServer().getPlayer(UUID.fromString(playerName)); - } else { - onlinePlayer = plugin.getServer().getPlayer(playerName); - } - - if (onlinePlayer == null) { - if (!sender.hasPermission("bm.command.tempmute.offline")) { - sender.sendMessage(Message.getString("sender.error.offlinePermission")); - return true; - } - } else if (!sender.hasPermission("bm.exempt.override.tempmute") - && onlinePlayer.hasPermission("bm.exempt.tempmute")) { - Message.get("sender.error.exempt").set("player", onlinePlayer.getName()).sendTo(sender); - return true; - } - - long expiresCheck; - - try { - expiresCheck = DateUtils.parseDateDiff(args[1], true); - } catch (Exception e1) { - sender.sendMessage(Message.get("time.error.invalid").toString()); - return true; - } - - if (plugin.getConfiguration().getTimeLimits().isPastLimit(sender, TimeLimitType.PLAYER_MUTE, expiresCheck)) { - Message.get("time.error.limit").sendTo(sender); - return true; - } - - final long expires = expiresCheck; - final Reason reason = parser.getReason(); - - plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() { - - @Override - public void run() { - final PlayerData player = CommandUtils.getPlayer(sender, playerName); - - if (player == null) { - sender.sendMessage(Message.get("sender.error.notFound").set("player", playerName).toString()); - return; - } - - if (plugin.getExemptionsConfig().isExempt(player, "tempmute")) { - sender.sendMessage(Message.get("sender.error.exempt").set("player", playerName).toString()); - return; - } - - final PlayerData actor = CommandUtils.getActor(sender); - - if (actor == null) return; - - if (isMuted) { - PlayerMuteData mute; - - if (isUUID) { - mute = plugin.getPlayerMuteStorage().getMute(UUID.fromString(playerName)); - } else { - mute = plugin.getPlayerMuteStorage().getMute(playerName); - } - - if (mute != null) { - try { - plugin.getPlayerMuteStorage().unmute(mute, actor); - } catch (SQLException e) { - sender.sendMessage(Message.get("sender.error.exception").toString()); - e.printStackTrace(); - return; - } - } - } - - PlayerMuteData mute = new PlayerMuteData(player, actor, reason.getMessage(), isSoft, expires); - boolean created; - - try { - created = plugin.getPlayerMuteStorage().mute(mute, isSilent); - } catch (SQLException e) { - CommandUtils.handlePunishmentCreateException(e, sender, Message.get("mute.error.exists").set("player", - playerName)); - return; - } - - if (!created) { - return; - } - - CommandUtils.handlePrivateNotes(player, actor, reason); - - Player bukkitPlayer = CommandUtils.getPlayer(player.getUUID()); - - if (isSoft || bukkitPlayer == null) return; - - Message muteMessage = Message.get("tempmute.player.disallowed") - .set("displayName", bukkitPlayer.getDisplayName()) - .set("player", player.getName()) - .set("playerId", player.getUUID().toString()) - .set("reason", mute.getReason()) - .set("actor", actor.getName()) - .set("expires", DateUtils.getDifferenceFormat(mute.getExpires())); - - bukkitPlayer.sendMessage(muteMessage.toString()); - - } - - }); - - return true; - } - -} diff --git a/src/main/java/me/confuser/banmanager/commands/TempNameBanCommand.java b/src/main/java/me/confuser/banmanager/commands/TempNameBanCommand.java deleted file mode 100644 index 77a721dce..000000000 --- a/src/main/java/me/confuser/banmanager/commands/TempNameBanCommand.java +++ /dev/null @@ -1,131 +0,0 @@ -package me.confuser.banmanager.commands; - -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.configs.TimeLimitType; -import me.confuser.banmanager.data.NameBanData; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.util.CommandParser; -import me.confuser.banmanager.util.CommandUtils; -import me.confuser.banmanager.util.DateUtils; -import me.confuser.bukkitutil.Message; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.sql.SQLException; - -public class TempNameBanCommand extends AutoCompleteNameTabCommand { - - public TempNameBanCommand() { - super("tempbanname"); - } - - @Override - public boolean onCommand(final CommandSender sender, Command command, String commandName, String[] args) { - CommandParser parser = new CommandParser(args, 2); - args = parser.getArgs(); - final boolean isSilent = parser.isSilent(); - - if (isSilent && !sender.hasPermission(command.getPermission() + ".silent")) { - sender.sendMessage(Message.getString("sender.error.noPermission")); - return true; - } - - if (args.length < 3) { - return false; - } - - if (CommandUtils.isValidNameDelimiter(args[0])) { - CommandUtils.handleMultipleNames(sender, commandName, args); - return true; - } - - long expiresCheck; - - try { - expiresCheck = DateUtils.parseDateDiff(args[1], true); - } catch (Exception e1) { - sender.sendMessage(Message.get("time.error.invalid").toString()); - return true; - } - - if (plugin.getConfiguration().getTimeLimits().isPastLimit(sender, TimeLimitType.NAME_BAN, expiresCheck)) { - Message.get("time.error.limit").sendTo(sender); - return true; - } - - final String name = args[0]; - final long expires = expiresCheck; - final String reason = parser.getReason().getMessage(); - - plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() { - - @Override - public void run() { - final boolean isBanned = plugin.getNameBanStorage().isBanned(name); - - if (isBanned && !sender.hasPermission("bm.command.tempbanname.override")) { - Message message = Message.get("banname.error.exists"); - message.set("name", name); - - sender.sendMessage(message.toString()); - return; - } - - final PlayerData actor = CommandUtils.getActor(sender); - - if (actor == null) return; - - if (isBanned) { - NameBanData ban = plugin.getNameBanStorage().getBan(name); - - if (ban != null) { - try { - plugin.getNameBanStorage().unban(ban, actor); - } catch (SQLException e) { - sender.sendMessage(Message.get("sender.error.exception").toString()); - e.printStackTrace(); - return; - } - } - } - - final NameBanData ban = new NameBanData(name, actor, reason, expires); - boolean created; - - try { - created = plugin.getNameBanStorage().ban(ban, isSilent); - } catch (SQLException e) { - CommandUtils.handlePunishmentCreateException(e, sender, Message.get("banname.error.exists").set("player", - name)); - return; - } - - if (!created) { - return; - } - - // Find online players - plugin.getServer().getScheduler().runTask(plugin, new Runnable() { - - public void run() { - Message kickMessage = Message.get("tempbanname.name.kick") - .set("reason", ban.getReason()) - .set("name", name) - .set("actor", actor.getName()); - - for (Player onlinePlayer : plugin.getServer().getOnlinePlayers()) { - if (onlinePlayer.getName().equalsIgnoreCase(name)) { - onlinePlayer.kickPlayer(kickMessage.toString()); - } - } - } - }); - - } - - }); - - return true; - } -} diff --git a/src/main/java/me/confuser/banmanager/commands/TempWarnCommand.java b/src/main/java/me/confuser/banmanager/commands/TempWarnCommand.java deleted file mode 100644 index a115620f0..000000000 --- a/src/main/java/me/confuser/banmanager/commands/TempWarnCommand.java +++ /dev/null @@ -1,218 +0,0 @@ -package me.confuser.banmanager.commands; - -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.configs.ActionCommand; -import me.confuser.banmanager.configs.TimeLimitType; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.data.PlayerWarnData; -import me.confuser.banmanager.util.CommandUtils; -import me.confuser.banmanager.util.DateUtils; -import me.confuser.banmanager.util.parsers.Reason; -import me.confuser.banmanager.util.parsers.WarnCommandParser; -import me.confuser.bukkitutil.Message; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.sql.SQLException; -import java.util.List; -import java.util.UUID; - -public class TempWarnCommand extends AutoCompleteNameTabCommand { - - public TempWarnCommand() { - super("tempwarn"); - } - - @Override - public boolean onCommand(final CommandSender sender, Command command, String commandName, String[] args) { - final WarnCommandParser parser = new WarnCommandParser(args, 2); - final String[] parsedArgs = parser.getArgs(); - final boolean isSilent = parser.isSilent(); - - if (isSilent && !sender.hasPermission(command.getPermission() + ".silent")) { - sender.sendMessage(Message.getString("sender.error.noPermission")); - return true; - } - - if (parser.getPoints() != 1 && !sender.hasPermission(command.getPermission() + ".points")) { - sender.sendMessage(Message.getString("sender.error.noPermission")); - return true; - } - - if (parsedArgs.length < 3) { - return false; - } - - if (CommandUtils.isValidNameDelimiter(parsedArgs[0])) { - CommandUtils.handleMultipleNames(sender, commandName, parsedArgs); - return true; - } - - if (parsedArgs[0].equalsIgnoreCase(sender.getName())) { - sender.sendMessage(Message.getString("sender.error.noSelf")); - return true; - } - - // Check if UUID vs name - final String playerName = parsedArgs[0]; - final boolean isUUID = playerName.length() > 16; - Player onlinePlayer; - - if (isUUID) { - try { - onlinePlayer = plugin.getServer().getPlayer(UUID.fromString(playerName)); - } catch (IllegalArgumentException e) { - sender.sendMessage(Message.get("sender.error.notFound").set("player", playerName).toString()); - return true; - } - } else { - onlinePlayer = plugin.getServer().getPlayer(playerName); - } - - if (onlinePlayer == null) { - if (!sender.hasPermission("bm.command.tempwarn.offline")) { - sender.sendMessage(Message.getString("sender.error.offlinePermission")); - return true; - } - } else if (!sender.hasPermission("bm.exempt.override.tempwarn") && onlinePlayer - .hasPermission("bm.exempt.tempwarn")) { - Message.get("sender.error.exempt").set("player", onlinePlayer.getName()).sendTo(sender); - return true; - } - - long expiresCheck; - - try { - expiresCheck = DateUtils.parseDateDiff(parsedArgs[1], true); - } catch (Exception e1) { - sender.sendMessage(Message.get("time.error.invalid").toString()); - return true; - } - - if (plugin.getConfiguration().getTimeLimits().isPastLimit(sender, TimeLimitType.PLAYER_WARN, expiresCheck)) { - Message.get("time.error.limit").sendTo(sender); - return true; - } - - final long expires = expiresCheck; - final Reason reason = parser.getReason(); - - plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() { - - @Override - public void run() { - final PlayerData player = CommandUtils.getPlayer(sender, playerName); - - if (player == null) { - sender.sendMessage(Message.get("sender.error.notFound").set("player", playerName).toString()); - return; - } - - if (plugin.getExemptionsConfig().isExempt(player, "tempwarn")) { - sender.sendMessage(Message.get("sender.error.exempt").set("player", playerName).toString()); - return; - } - - try { - if (plugin.getPlayerWarnStorage().isRecentlyWarned(player)) { - Message.get("warn.error.cooldown").sendTo(sender); - return; - } - } catch (SQLException e) { - sender.sendMessage(Message.get("sender.error.exception").toString()); - e.printStackTrace(); - return; - } - - final PlayerData actor = CommandUtils.getActor(sender); - - if (actor == null) return; - - boolean isOnline = CommandUtils.getPlayer(player.getUUID()) != null; - - final PlayerWarnData warning = new PlayerWarnData(player, actor, reason.getMessage(), parser.getPoints(), isOnline, expires); - - boolean created; - - try { - created = plugin.getPlayerWarnStorage().addWarning(warning, isSilent); - } catch (SQLException e) { - sender.sendMessage(Message.get("sender.error.exception").toString()); - e.printStackTrace(); - return; - } - - if (!created) { - return; - } - - CommandUtils.handlePrivateNotes(player, actor, reason); - - if (isOnline) { - Player bukkitPlayer = CommandUtils.getPlayer(player.getUUID()); - - Message warningMessage = Message.get("tempwarn.player.warned") - .set("displayName", bukkitPlayer.getDisplayName()) - .set("player", player.getName()) - .set("playerId", player.getUUID().toString()) - .set("reason", warning.getReason()) - .set("actor", actor.getName()) - .set("expires", DateUtils.getDifferenceFormat(warning.getExpires())) - .set("points", parser.getPoints()); - - bukkitPlayer.sendMessage(warningMessage.toString()); - } - - Message message = Message.get("tempwarn.notify") - .set("player", player.getName()) - .set("playerId", player.getUUID().toString()) - .set("actor", actor.getName()) - .set("reason", warning.getReason()) - .set("expires", DateUtils.getDifferenceFormat(warning.getExpires())) - .set("points", parser.getPoints()); - - if (!sender.hasPermission("bm.notify.tempwarn")) { - message.sendTo(sender); - } - - if (!isSilent) CommandUtils.broadcast(message.toString(), "bm.notify.tempwarn"); - - final List actionCommands; - - try { - actionCommands = plugin.getConfiguration().getWarningActions() - .getCommand((int) plugin.getPlayerWarnStorage().getPointsCount(player)); - } catch (SQLException e) { - e.printStackTrace(); - return; - } - - if (actionCommands == null || actionCommands.isEmpty()) { - return; - } - - for (final ActionCommand action : actionCommands) { - - plugin.getServer().getScheduler().runTaskLater(plugin, new Runnable() { - - @Override - public void run() { - String actionCommand = action.getCommand() - .replace("[player]", player.getName()) - .replace("[playerId]", player.getUUID().toString()) - .replace("[actor]", actor.getName()) - .replace("[reason]", warning.getReason()) - .replace("[expires]", parsedArgs[1]) - .replace("[points]", Double.toString(parser.getPoints())); - - plugin.getServer().dispatchCommand(plugin.getServer().getConsoleSender(), actionCommand); - } - }, action.getDelay()); - } - } - }); - - return true; - } -} diff --git a/src/main/java/me/confuser/banmanager/commands/UnbanCommand.java b/src/main/java/me/confuser/banmanager/commands/UnbanCommand.java deleted file mode 100644 index 73a1a7cb7..000000000 --- a/src/main/java/me/confuser/banmanager/commands/UnbanCommand.java +++ /dev/null @@ -1,151 +0,0 @@ -package me.confuser.banmanager.commands; - -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.PlayerBanData; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.util.CommandUtils; -import me.confuser.banmanager.util.UUIDUtils; -import me.confuser.banmanager.util.parsers.UnbanCommandParser; -import me.confuser.bukkitutil.Message; -import me.confuser.bukkitutil.commands.BukkitCommand; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.command.TabCompleter; -import org.bukkit.entity.Player; - -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; - -public class UnbanCommand extends BukkitCommand implements TabCompleter { - - public UnbanCommand() { - super("unban"); - } - - @Override - public boolean onCommand(final CommandSender sender, Command command, String commandName, String[] args) { - UnbanCommandParser parser = new UnbanCommandParser(args, 1); - args = parser.getArgs(); - - final boolean isDelete = parser.isDelete(); - - if (isDelete && !sender.hasPermission(command.getPermission() + ".delete")) { - sender.sendMessage(Message.getString("sender.error.noPermission")); - return true; - } - - if (args.length < 1) { - return false; - } - - if (CommandUtils.isValidNameDelimiter(args[0])) { - CommandUtils.handleMultipleNames(sender, commandName, args); - return true; - } - - // Check if UUID vs name - final String playerName = args[0]; - final boolean isUUID = playerName.length() > 16; - boolean isBanned; - - if (isUUID) { - try { - isBanned = plugin.getPlayerBanStorage().isBanned(UUID.fromString(playerName)); - } catch (IllegalArgumentException e) { - sender.sendMessage(Message.get("sender.error.notFound").set("player", playerName).toString()); - return true; - } - } else { - isBanned = plugin.getPlayerBanStorage().isBanned(playerName); - } - - if (!isBanned) { - Message message = Message.get("unban.error.noExists"); - message.set("player", playerName); - - sender.sendMessage(message.toString()); - return true; - } - - final String reason = parser.getReason().getMessage(); - - plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() { - - @Override - public void run() { - PlayerBanData ban; - - if (isUUID) { - ban = plugin.getPlayerBanStorage().getBan(UUID.fromString(playerName)); - } else { - ban = plugin.getPlayerBanStorage().getBan(playerName); - } - - if (ban == null) { - sender.sendMessage(Message.get("sender.error.notFound").set("player", playerName).toString()); - return; - } - - final PlayerData actor = CommandUtils.getActor(sender); - - //TODO refactor if async perm check is problem - if (!actor.getUUID().equals(ban.getActor().getUUID()) && !sender.hasPermission("bm.exempt.override.ban") - && sender.hasPermission("bm.command.unban.own")) { - Message.get("unban.error.notOwn").set("player", ban.getPlayer().getName()).sendTo(sender); - return; - } - - boolean unbanned; - - try { - unbanned = plugin.getPlayerBanStorage().unban(ban, actor, reason, isDelete); - } catch (SQLException e) { - sender.sendMessage(Message.get("sender.error.exception").toString()); - e.printStackTrace(); - return; - } - - if (!unbanned) { - return; - } - - Message message = Message.get("unban.notify"); - message - .set("player", ban.getPlayer().getName()) - .set("playerId", ban.getPlayer().getUUID().toString()) - .set("actor", actor.getName()) - .set("reason", reason); - - if (!sender.hasPermission("bm.notify.unban")) { - message.sendTo(sender); - } - - CommandUtils.broadcast(message.toString(), "bm.notify.unban"); - } - - }); - - return true; - } - - @Override - public List onTabComplete(CommandSender sender, Command command, String commandName, String[] args) { - - ArrayList mostLike = new ArrayList<>(); - - if (!sender.hasPermission(command.getPermission())) return mostLike; - if (args.length != 1) return mostLike; - - String nameSearch = args[0].toLowerCase(); - - for (PlayerBanData ban : plugin.getPlayerBanStorage().getBans().values()) { - if (ban.getPlayer().getName().toLowerCase().startsWith(nameSearch)) { - mostLike.add(ban.getPlayer().getName()); - } - } - - return mostLike; - } -} diff --git a/src/main/java/me/confuser/banmanager/commands/UnbanIpCommand.java b/src/main/java/me/confuser/banmanager/commands/UnbanIpCommand.java deleted file mode 100644 index ce1684737..000000000 --- a/src/main/java/me/confuser/banmanager/commands/UnbanIpCommand.java +++ /dev/null @@ -1,122 +0,0 @@ -package me.confuser.banmanager.commands; - -import com.google.common.net.InetAddresses; -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.IpBanData; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.util.CommandUtils; -import me.confuser.banmanager.util.IPUtils; -import me.confuser.banmanager.util.UUIDUtils; -import me.confuser.bukkitutil.Message; -import me.confuser.bukkitutil.commands.BukkitCommand; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.sql.SQLException; - -public class UnbanIpCommand extends BukkitCommand { - - public UnbanIpCommand() { - super("unbanip"); - } - - @Override - public boolean onCommand(final CommandSender sender, Command command, String commandName, String[] args) { - if (args.length < 1) { - return false; - } - - if (CommandUtils.isValidNameDelimiter(args[0])) { - CommandUtils.handleMultipleNames(sender, commandName, args); - return true; - } - - final String ipStr = args[0]; - final boolean isName = !InetAddresses.isInetAddress(ipStr); - - if (isName && ipStr.length() > 16) { - Message message = Message.get("sender.error.invalidIp"); - message.set("ip", ipStr); - - sender.sendMessage(message.toString()); - return true; - } - - final String reason = args.length > 1 ? CommandUtils.getReason(1, args).getMessage() : ""; - - plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() { - - @Override - public void run() { - final long ip; - - if (isName) { - PlayerData player = plugin.getPlayerStorage().retrieve(ipStr, false); - if (player == null) { - sender.sendMessage(Message.get("sender.error.notFound").set("player", ipStr) - .toString()); - return; - } - - ip = player.getIp(); - } else { - ip = IPUtils.toLong(ipStr); - } - - if (!plugin.getIpBanStorage().isBanned(ip)) { - Message message = Message.get("unbanip.error.noExists"); - message.set("ip", ipStr); - - sender.sendMessage(message.toString()); - return; - } - - IpBanData ban = plugin.getIpBanStorage().getBan(ip); - - PlayerData actor; - - if (sender instanceof Player) { - try { - actor = plugin.getPlayerStorage().queryForId(UUIDUtils.toBytes((Player) sender)); - } catch (SQLException e) { - sender.sendMessage(Message.get("sender.error.exception").toString()); - e.printStackTrace(); - return; - } - } else { - actor = plugin.getPlayerStorage().getConsole(); - } - - boolean unbanned; - - try { - unbanned = plugin.getIpBanStorage().unban(ban, actor, reason); - } catch (SQLException e) { - sender.sendMessage(Message.get("sender.error.exception").toString()); - e.printStackTrace(); - return; - } - - if (!unbanned) { - return; - } - - Message message = Message.get("unbanip.notify"); - message - .set("ip", ipStr) - .set("actor", actor.getName()) - .set("reason", reason); - - if (!sender.hasPermission("bm.notify.unbanip")) { - message.sendTo(sender); - } - - CommandUtils.broadcast(message.toString(), "bm.notify.unbanip"); - } - - }); - - return true; - } -} diff --git a/src/main/java/me/confuser/banmanager/commands/UnbanIpRangeCommand.java b/src/main/java/me/confuser/banmanager/commands/UnbanIpRangeCommand.java deleted file mode 100644 index 51b0d420e..000000000 --- a/src/main/java/me/confuser/banmanager/commands/UnbanIpRangeCommand.java +++ /dev/null @@ -1,147 +0,0 @@ -package me.confuser.banmanager.commands; - -import com.google.common.net.InetAddresses; -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.IpRangeBanData; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.util.CommandUtils; -import me.confuser.banmanager.util.IPUtils; -import me.confuser.banmanager.util.UUIDUtils; -import me.confuser.bukkitutil.Message; -import me.confuser.bukkitutil.commands.BukkitCommand; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.sql.SQLException; - -public class UnbanIpRangeCommand extends BukkitCommand { - - public UnbanIpRangeCommand() { - super("unbaniprange"); - } - - @Override - public boolean onCommand(final CommandSender sender, Command command, String commandName, String[] args) { - if (args.length < 1) { - return false; - } - - if (CommandUtils.isValidNameDelimiter(args[0])) { - CommandUtils.handleMultipleNames(sender, commandName, args); - return true; - } - - final String ipStr = args[0]; - long[] range = new long[2]; - final boolean isName; - - if (ipStr.contains("*")) { - // Simple wildcard logic - range = IPUtils.getRangeFromWildcard(ipStr); - isName = false; - } else if (ipStr.contains("/")) { - // cidr notation - range = IPUtils.getRangeFromCidrNotation(ipStr); - isName = false; - } else if (InetAddresses.isInetAddress(ipStr)) { - range[0] = IPUtils.toLong(ipStr); - range[1] = range[0]; - isName = false; - } else if (ipStr.length() <= 16) { - isName = true; - } else { - Message message = Message.get("sender.error.invalidIp"); - message.set("ip", ipStr); - - sender.sendMessage(message.toString()); - return true; - } - - if (!isName && range == null) { - Message.get("baniprange.error.invalid").sendTo(sender); - return true; - } - - final long[] ranges = range; - final String reason = args.length > 1 ? CommandUtils.getReason(1, args).getMessage() : ""; - - plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() { - - @Override - public void run() { - long[] range = new long[2]; - - if (isName) { - PlayerData player = plugin.getPlayerStorage().retrieve(ipStr, false); - if (player == null) { - sender.sendMessage(Message.get("sender.error.notFound").set("player", ipStr) - .toString()); - return; - } - - range[0] = player.getIp(); - range[1] = player.getIp(); - } else { - range = ranges; - } - - if (!plugin.getIpRangeBanStorage().isBanned(range[0]) && !plugin.getIpRangeBanStorage().isBanned(range[1])) { - Message message = Message.get("unbanip.error.noExists"); - message.set("ip", ipStr); - - sender.sendMessage(message.toString()); - return; - } - - IpRangeBanData ban = plugin.getIpRangeBanStorage().getBan(range[0]); - - if (ban == null) ban = plugin.getIpRangeBanStorage().getBan(range[1]); - - PlayerData actor; - - if (sender instanceof Player) { - try { - actor = plugin.getPlayerStorage().queryForId(UUIDUtils.toBytes((Player) sender)); - } catch (SQLException e) { - sender.sendMessage(Message.get("sender.error.exception").toString()); - e.printStackTrace(); - return; - } - } else { - actor = plugin.getPlayerStorage().getConsole(); - } - - boolean unbanned; - - try { - unbanned = plugin.getIpRangeBanStorage().unban(ban, actor, reason); - } catch (SQLException e) { - sender.sendMessage(Message.get("sender.error.exception").toString()); - e.printStackTrace(); - return; - } - - if (!unbanned) { - return; - } - - Message message = Message.get("unbaniprange.notify"); - message - .set("from", IPUtils.toString(ban.getFromIp())) - .set("to", IPUtils.toString(ban.getToIp())) - .set("actor", actor.getName()) - .set("reason", reason); - - if (!sender.hasPermission("bm.notify.unbaniprange")) { - message.sendTo(sender); - } - - CommandUtils.broadcast(message.toString(), "bm.notify.unbaniprange"); - } - - }); - - return true; - } -} diff --git a/src/main/java/me/confuser/banmanager/commands/UnbanNameCommand.java b/src/main/java/me/confuser/banmanager/commands/UnbanNameCommand.java deleted file mode 100644 index 2e7d1e173..000000000 --- a/src/main/java/me/confuser/banmanager/commands/UnbanNameCommand.java +++ /dev/null @@ -1,82 +0,0 @@ -package me.confuser.banmanager.commands; - -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.NameBanData; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.util.CommandUtils; -import me.confuser.bukkitutil.Message; -import me.confuser.bukkitutil.commands.BukkitCommand; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; - -import java.sql.SQLException; - -public class UnbanNameCommand extends BukkitCommand { - - public UnbanNameCommand() { - super("unbanname"); - } - - @Override - public boolean onCommand(final CommandSender sender, Command command, String commandName, String[] args) { - if (args.length < 1) { - return false; - } - - if (CommandUtils.isValidNameDelimiter(args[0])) { - CommandUtils.handleMultipleNames(sender, commandName, args); - return true; - } - - final String name = args[0]; - final String reason = args.length > 1 ? CommandUtils.getReason(1, args).getMessage() : ""; - - plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() { - - @Override - public void run() { - if (!plugin.getNameBanStorage().isBanned(name)) { - Message message = Message.get("unbanname.error.noExists"); - message.set("name", name); - - sender.sendMessage(message.toString()); - return; - } - - NameBanData ban = plugin.getNameBanStorage().getBan(name); - final PlayerData actor = CommandUtils.getActor(sender); - - if (actor == null) return; - - boolean unbanned; - - try { - unbanned = plugin.getNameBanStorage().unban(ban, actor, reason); - } catch (SQLException e) { - sender.sendMessage(Message.get("sender.error.exception").toString()); - e.printStackTrace(); - return; - } - - if (!unbanned) { - return; - } - - Message message = Message.get("unbanname.notify"); - message - .set("name", name) - .set("actor", actor.getName()) - .set("reason", reason); - - if (!sender.hasPermission("bm.notify.unbanname")) { - message.sendTo(sender); - } - - CommandUtils.broadcast(message.toString(), "bm.notify.unbanname"); - } - - }); - - return true; - } -} diff --git a/src/main/java/me/confuser/banmanager/commands/UnmuteCommand.java b/src/main/java/me/confuser/banmanager/commands/UnmuteCommand.java deleted file mode 100644 index 7510adc2d..000000000 --- a/src/main/java/me/confuser/banmanager/commands/UnmuteCommand.java +++ /dev/null @@ -1,171 +0,0 @@ -package me.confuser.banmanager.commands; - -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.data.PlayerMuteData; -import me.confuser.banmanager.util.CommandUtils; -import me.confuser.banmanager.util.parsers.UnbanCommandParser; -import me.confuser.bukkitutil.Message; -import me.confuser.bukkitutil.commands.BukkitCommand; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.command.TabCompleter; -import org.bukkit.entity.Player; - -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; - -public class UnmuteCommand extends BukkitCommand implements TabCompleter { - - public UnmuteCommand() { - super("unmute"); - } - - @Override - public boolean onCommand(final CommandSender sender, Command command, String commandName, String[] args) { - UnbanCommandParser parser = new UnbanCommandParser(args, 1); - args = parser.getArgs(); - - final boolean isDelete = parser.isDelete(); - - if (isDelete && !sender.hasPermission(command.getPermission() + ".delete")) { - sender.sendMessage(Message.getString("sender.error.noPermission")); - return true; - } - - if (args.length < 1) { - return false; - } - - if (CommandUtils.isValidNameDelimiter(args[0])) { - CommandUtils.handleMultipleNames(sender, commandName, args); - return true; - } - - // Check if UUID vs name - final String playerName = args[0]; - final boolean isUUID = playerName.length() > 16; - boolean isMuted; - - if (isUUID) { - try { - isMuted = plugin.getPlayerMuteStorage().isMuted(UUID.fromString(playerName)); - } catch (IllegalArgumentException e) { - sender.sendMessage(Message.get("sender.error.notFound").set("player", playerName).toString()); - return true; - } - } else { - isMuted = plugin.getPlayerMuteStorage().isMuted(playerName); - } - - if (!isMuted) { - Message message = Message.get("unmute.error.noExists"); - message.set("player", playerName); - - sender.sendMessage(message.toString()); - return true; - } - - final String reason = parser.getReason().getMessage(); - - plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() { - - @Override - public void run() { - final PlayerMuteData mute; - - if (isUUID) { - mute = plugin.getPlayerMuteStorage().getMute(UUID.fromString(playerName)); - } else { - mute = plugin.getPlayerMuteStorage().getMute(playerName); - } - - if (mute == null) { - sender.sendMessage(Message.get("sender.error.notFound").set("player", playerName).toString - ()); - return; - } - - final PlayerData actor = CommandUtils.getActor(sender); - - //TODO refactor if async perm check is problem - if (!actor.getUUID().equals(mute.getActor().getUUID()) && !sender.hasPermission("bm.exempt.override.mute") - && sender.hasPermission("bm.command.unmute.own")) { - Message.get("unmute.error.notOwn").set("player", mute.getPlayer().getName()).sendTo(sender); - return; - } - - boolean unmuted; - - try { - unmuted = plugin.getPlayerMuteStorage().unmute(mute, actor, reason, isDelete); - } catch (SQLException e) { - sender.sendMessage(Message.get("sender.error.exception").toString()); - e.printStackTrace(); - return; - } - - if (!unmuted) { - return; - } - - Message message = Message.get("unmute.notify"); - message - .set("player", mute.getPlayer().getName()) - .set("playerId", mute.getPlayer().getUUID().toString()) - .set("actor", actor.getName()) - .set("reason", reason); - - if (!sender.hasPermission("bm.notify.unmute")) { - message.sendTo(sender); - } - - CommandUtils.broadcast(message.toString(), "bm.notify.unmute"); - - plugin.getServer().getScheduler().runTask(plugin, new Runnable() { - - @Override - public void run() { - Player bukkitPlayer = CommandUtils.getPlayer(mute.getPlayer().getUUID()); - - if (bukkitPlayer == null) return; - if (bukkitPlayer.hasPermission("bm.notify.unmute")) return; - - Message.get("unmute.player") - .set("displayName", bukkitPlayer.getDisplayName()) - .set("player", mute.getPlayer().getName()) - .set("playerId", mute.getPlayer().getUUID().toString()) - .set("reason", mute.getReason()) - .set("actor", actor.getName()) - .sendTo(bukkitPlayer); - - } - }); - } - - }); - - return true; - } - - @Override - public List onTabComplete(CommandSender sender, Command command, String commandName, String[] args) { - - ArrayList mostLike = new ArrayList<>(); - - if (!sender.hasPermission(command.getPermission())) return mostLike; - if (args.length != 1) return mostLike; - - String nameSearch = args[0].toLowerCase(); - - for (PlayerMuteData ban : plugin.getPlayerMuteStorage().getMutes().values()) { - if (ban.getPlayer().getName().toLowerCase().startsWith(nameSearch)) { - mostLike.add(ban.getPlayer().getName()); - } - } - - return mostLike; - } -} diff --git a/src/main/java/me/confuser/banmanager/commands/UnmuteIpCommand.java b/src/main/java/me/confuser/banmanager/commands/UnmuteIpCommand.java deleted file mode 100644 index c295a435b..000000000 --- a/src/main/java/me/confuser/banmanager/commands/UnmuteIpCommand.java +++ /dev/null @@ -1,101 +0,0 @@ -package me.confuser.banmanager.commands; - -import com.google.common.net.InetAddresses; -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.IpMuteData; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.util.CommandUtils; -import me.confuser.bukkitutil.Message; -import me.confuser.bukkitutil.commands.BukkitCommand; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; - -import java.sql.SQLException; - -public class UnmuteIpCommand extends BukkitCommand { - - public UnmuteIpCommand() { - super("unmuteip"); - } - - @Override - public boolean onCommand(final CommandSender sender, Command command, String commandName, String[] args) { - if (args.length < 1) { - return false; - } - - if (CommandUtils.isValidNameDelimiter(args[0])) { - CommandUtils.handleMultipleNames(sender, commandName, args); - return true; - } - - final String ipStr = args[0]; - final boolean isName = !InetAddresses.isInetAddress(ipStr); - - if (isName && ipStr.length() > 16) { - Message message = Message.get("sender.error.invalidIp"); - message.set("ip", ipStr); - - sender.sendMessage(message.toString()); - return true; - } - - final String reason = args.length > 1 ? CommandUtils.getReason(1, args).getMessage() : ""; - - plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() { - - @Override - public void run() { - final Long ip = CommandUtils.getIp(ipStr); - - if (ip == null) { - sender.sendMessage(Message.get("sender.error.notFound").set("player", ipStr).toString()); - return; - } - - if (!plugin.getIpMuteStorage().isMuted(ip)) { - Message message = Message.get("unmuteip.error.noExists"); - message.set("ip", ipStr); - - sender.sendMessage(message.toString()); - return; - } - - IpMuteData mute = plugin.getIpMuteStorage().getMute(ip); - - final PlayerData actor = CommandUtils.getActor(sender); - - if (actor == null) return; - - boolean unmuted; - - try { - unmuted = plugin.getIpMuteStorage().unmute(mute, actor, reason); - } catch (SQLException e) { - sender.sendMessage(Message.get("sender.error.exception").toString()); - e.printStackTrace(); - return; - } - - if (!unmuted) { - return; - } - - Message message = Message.get("unmuteip.notify"); - message - .set("ip", ipStr) - .set("actor", actor.getName()) - .set("reason", reason); - - if (!sender.hasPermission("bm.notify.unmuteip")) { - message.sendTo(sender); - } - - CommandUtils.broadcast(message.toString(), "bm.notify.unmuteip"); - } - - }); - - return true; - } -} diff --git a/src/main/java/me/confuser/banmanager/commands/UtilsCommand.java b/src/main/java/me/confuser/banmanager/commands/UtilsCommand.java deleted file mode 100644 index 9109aff7d..000000000 --- a/src/main/java/me/confuser/banmanager/commands/UtilsCommand.java +++ /dev/null @@ -1,26 +0,0 @@ -package me.confuser.banmanager.commands; - -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.commands.utils.MissingPlayersSubCommand; -import me.confuser.bukkitutil.commands.MultiCommandHandler; - -public class UtilsCommand extends MultiCommandHandler { - - public UtilsCommand() { - super("bmutils"); - - registerCommands(); - } - - @Override - public void registerCommands() { - registerSubCommand(new MissingPlayersSubCommand()); - } - -// @Override -// public boolean onCommand(final CommandSender sender, Command command, String commandName, String[] args) { -// if (args.length == 0 && sender instanceof Player) return getCommands().get("list").onCommand(sender, args); -// -// return super.onCommand(sender, command, commandName, args); -// } -} diff --git a/src/main/java/me/confuser/banmanager/commands/WarnCommand.java b/src/main/java/me/confuser/banmanager/commands/WarnCommand.java deleted file mode 100644 index e79269f1e..000000000 --- a/src/main/java/me/confuser/banmanager/commands/WarnCommand.java +++ /dev/null @@ -1,197 +0,0 @@ -package me.confuser.banmanager.commands; - -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.configs.ActionCommand; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.data.PlayerWarnData; -import me.confuser.banmanager.util.CommandUtils; -import me.confuser.banmanager.util.parsers.Reason; -import me.confuser.banmanager.util.parsers.WarnCommandParser; -import me.confuser.bukkitutil.Message; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.sql.SQLException; -import java.util.List; -import java.util.UUID; - -public class WarnCommand extends AutoCompleteNameTabCommand { - - public WarnCommand() { - super("warn"); - } - - @Override - public boolean onCommand(final CommandSender sender, Command command, String commandName, String[] args) { - final WarnCommandParser parser = new WarnCommandParser(args, 1); - args = parser.getArgs(); - final boolean isSilent = parser.isSilent(); - - if (isSilent && !sender.hasPermission(command.getPermission() + ".silent")) { - sender.sendMessage(Message.getString("sender.error.noPermission")); - return true; - } - - if (parser.getPoints() != 1 && !sender.hasPermission(command.getPermission() + ".points")) { - sender.sendMessage(Message.getString("sender.error.noPermission")); - return true; - } - - if (args.length < 2) { - return false; - } - - if (CommandUtils.isValidNameDelimiter(args[0])) { - CommandUtils.handleMultipleNames(sender, commandName, args); - return true; - } - - if (args[0].equalsIgnoreCase(sender.getName())) { - sender.sendMessage(Message.getString("sender.error.noSelf")); - return true; - } - - // Check if UUID vs name - final String playerName = args[0]; - final boolean isUUID = playerName.length() > 16; - final Reason reason = parser.getReason(); - - Player onlinePlayer; - - if (isUUID) { - try { - onlinePlayer = plugin.getServer().getPlayer(UUID.fromString(playerName)); - } catch (IllegalArgumentException e) { - sender.sendMessage(Message.get("sender.error.notFound").set("player", playerName).toString()); - return true; - } - } else { - onlinePlayer = plugin.getServer().getPlayer(playerName); - } - - if (onlinePlayer == null) { - if (!sender.hasPermission("bm.command.warn.offline")) { - sender.sendMessage(Message.getString("sender.error.offlinePermission")); - return true; - } - } else if (!sender.hasPermission("bm.exempt.override.warn") && onlinePlayer.hasPermission("bm.exempt.warn")) { - Message.get("sender.error.exempt").set("player", onlinePlayer.getName()).sendTo(sender); - return true; - } - - plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() { - - @Override - public void run() { - final PlayerData player = CommandUtils.getPlayer(sender, playerName); - - if (player == null) { - sender.sendMessage(Message.get("sender.error.notFound").set("player", playerName).toString()); - return; - } - - if (plugin.getExemptionsConfig().isExempt(player, "warn")) { - sender.sendMessage(Message.get("sender.error.exempt").set("player", playerName).toString()); - return; - } - - try { - if (plugin.getPlayerWarnStorage().isRecentlyWarned(player)) { - Message.get("warn.error.cooldown").sendTo(sender); - return; - } - } catch (SQLException e) { - sender.sendMessage(Message.get("sender.error.exception").toString()); - e.printStackTrace(); - return; - } - - final PlayerData actor = CommandUtils.getActor(sender); - - if (actor == null) return; - - boolean isOnline = CommandUtils.getPlayer(player.getUUID()) != null; - - final PlayerWarnData warning = new PlayerWarnData(player, actor, reason.getMessage(), parser.getPoints(), isOnline); - - boolean created; - - try { - created = plugin.getPlayerWarnStorage().addWarning(warning, isSilent); - } catch (SQLException e) { - sender.sendMessage(Message.get("sender.error.exception").toString()); - e.printStackTrace(); - return; - } - - if (!created) { - return; - } - - CommandUtils.handlePrivateNotes(player, actor, reason); - - if (isOnline) { - Player bukkitPlayer = CommandUtils.getPlayer(player.getUUID()); - - Message warningMessage = Message.get("warn.player.warned") - .set("displayName", bukkitPlayer.getDisplayName()) - .set("player", player.getName()) - .set("playerId", player.getUUID().toString()) - .set("reason", warning.getReason()) - .set("actor", actor.getName()) - .set("points", parser.getPoints()); - - bukkitPlayer.sendMessage(warningMessage.toString()); - } - - Message message = Message.get("warn.notify") - .set("player", player.getName()) - .set("playerId", player.getUUID().toString()) - .set("actor", actor.getName()) - .set("reason", warning.getReason()) - .set("points", parser.getPoints()); - - if (!sender.hasPermission("bm.notify.warn")) { - message.sendTo(sender); - } - - if (!isSilent) CommandUtils.broadcast(message.toString(), "bm.notify.warn"); - - final List actionCommands; - - try { - actionCommands = plugin.getConfiguration().getWarningActions() - .getCommand(plugin.getPlayerWarnStorage().getPointsCount(player)); - } catch (SQLException e) { - e.printStackTrace(); - return; - } - - if (actionCommands == null || actionCommands.isEmpty()) { - return; - } - - for (final ActionCommand action : actionCommands) { - - plugin.getServer().getScheduler().runTaskLater(plugin, new Runnable() { - - @Override - public void run() { - String actionCommand = action.getCommand() - .replace("[player]", player.getName()) - .replace("[playerId]", player.getUUID().toString()) - .replace("[actor]", actor.getName()) - .replace("[reason]", warning.getReason()) - .replace("[points]", Double.toString(parser.getPoints())); - - plugin.getServer().dispatchCommand(plugin.getServer().getConsoleSender(), actionCommand); - } - }, action.getDelay()); - } - } - }); - - return true; - } -} \ No newline at end of file diff --git a/src/main/java/me/confuser/banmanager/commands/global/AddNoteAllCommand.java b/src/main/java/me/confuser/banmanager/commands/global/AddNoteAllCommand.java deleted file mode 100644 index 283272772..000000000 --- a/src/main/java/me/confuser/banmanager/commands/global/AddNoteAllCommand.java +++ /dev/null @@ -1,79 +0,0 @@ -package me.confuser.banmanager.commands.global; - -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.data.global.GlobalPlayerNoteData; -import me.confuser.banmanager.util.CommandUtils; -import me.confuser.bukkitutil.Message; -import me.confuser.bukkitutil.commands.BukkitCommand; -import org.apache.commons.lang.StringUtils; -import org.bukkit.ChatColor; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; - -import java.sql.SQLException; - -public class AddNoteAllCommand extends BukkitCommand { - - public AddNoteAllCommand() { - super("addnoteall"); - } - - @Override - public boolean onCommand(final CommandSender sender, Command command, String commandName, String[] args) { - if (args.length < 2) { - return false; - } - - if (args[0].equalsIgnoreCase(sender.getName())) { - sender.sendMessage(Message.getString("sender.error.noSelf")); - return true; - } - - // Check if UUID vs name - final String playerName = args[0]; - final String message = StringUtils.join(args, " ", 1, args.length); - - plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() { - - @Override - public void run() { - final PlayerData player = CommandUtils.getPlayer(sender, playerName); - - if (player == null) { - sender.sendMessage(Message.get("sender.error.notFound").set("player", playerName).toString()); - return; - } - - final PlayerData actor = CommandUtils.getActor(sender); - - if (actor == null) return; - - final GlobalPlayerNoteData note = new GlobalPlayerNoteData(player, actor, message); - int created; - - try { - created = plugin.getGlobalPlayerNoteStorage().create(note); - } catch (SQLException e) { - sender.sendMessage(Message.get("sender.error.exception").toString()); - e.printStackTrace(); - return; - } - - if (created != 1) { - return; - } - - Message.get("addnoteall.notify") - .set("actor", note.getActorName()) - .set("message", note.getMessageColours()) - .set("player", player.getName()) - .set("playerId", player.getUUID().toString()) - .sendTo(sender); - } - - }); - - return true; - } -} diff --git a/src/main/java/me/confuser/banmanager/commands/global/BanAllCommand.java b/src/main/java/me/confuser/banmanager/commands/global/BanAllCommand.java deleted file mode 100644 index 35e266a8e..000000000 --- a/src/main/java/me/confuser/banmanager/commands/global/BanAllCommand.java +++ /dev/null @@ -1,78 +0,0 @@ -package me.confuser.banmanager.commands.global; - -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.data.global.GlobalPlayerBanData; -import me.confuser.banmanager.util.CommandUtils; -import me.confuser.bukkitutil.Message; -import me.confuser.bukkitutil.commands.BukkitCommand; -import org.apache.commons.lang.StringUtils; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; - -import java.sql.SQLException; - -public class BanAllCommand extends BukkitCommand { - - public BanAllCommand() { - super("banall"); - } - - @Override - public boolean onCommand(final CommandSender sender, Command command, String commandName, String[] args) { - if (args.length < 2) { - return false; - } - - if (args[0].equalsIgnoreCase(sender.getName())) { - sender.sendMessage(Message.getString("sender.error.noSelf")); - return true; - } - - // Check if UUID vs name - final String playerName = args[0]; - final String reason = StringUtils.join(args, " ", 1, args.length); - - plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() { - - @Override - public void run() { - final PlayerData player = CommandUtils.getPlayer(sender, playerName); - - if (player == null) { - sender.sendMessage(Message.get("sender.error.notFound").set("player", playerName).toString()); - return; - } - - final PlayerData actor = CommandUtils.getActor(sender); - - if (actor == null) return; - - final GlobalPlayerBanData ban = new GlobalPlayerBanData(player, actor, reason); - int created; - - try { - created = plugin.getGlobalPlayerBanStorage().create(ban); - } catch (SQLException e) { - sender.sendMessage(Message.get("sender.error.exception").toString()); - e.printStackTrace(); - return; - } - - if (created != 1) { - return; - } - - Message.get("banall.notify") - .set("actor", ban.getActorName()) - .set("reason", ban.getReason()) - .set("player", player.getName()) - .set("playerId", player.getUUID().toString()) - .sendTo(sender); - } - - }); - - return true; - } -} diff --git a/src/main/java/me/confuser/banmanager/commands/global/BanIpAllCommand.java b/src/main/java/me/confuser/banmanager/commands/global/BanIpAllCommand.java deleted file mode 100644 index 6b51915c6..000000000 --- a/src/main/java/me/confuser/banmanager/commands/global/BanIpAllCommand.java +++ /dev/null @@ -1,102 +0,0 @@ -package me.confuser.banmanager.commands.global; - -import com.google.common.net.InetAddresses; -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.data.global.GlobalIpBanData; -import me.confuser.banmanager.util.IPUtils; -import me.confuser.banmanager.util.UUIDUtils; -import me.confuser.bukkitutil.Message; -import me.confuser.bukkitutil.commands.BukkitCommand; -import org.apache.commons.lang.StringUtils; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.sql.SQLException; - -public class BanIpAllCommand extends BukkitCommand { - - public BanIpAllCommand() { - super("banipall"); - } - - @Override - public boolean onCommand(final CommandSender sender, Command command, String commandName, String[] args) { - if (args.length < 2) { - return false; - } - - final String ipStr = args[0]; - final boolean isName = !InetAddresses.isInetAddress(ipStr); - - if (isName && ipStr.length() > 16) { - Message message = Message.get("sender.error.invalidIp"); - message.set("ip", ipStr); - - sender.sendMessage(message.toString()); - return true; - } - - final String reason = StringUtils.join(args, " ", 1, args.length); - - plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() { - - @Override - public void run() { - final long ip; - - if (isName) { - PlayerData player = plugin.getPlayerStorage().retrieve(ipStr, false); - if (player == null) { - sender.sendMessage(Message.get("sender.error.notFound").set("player", ipStr).toString()); - return; - } - - ip = player.getIp(); - } else { - ip = IPUtils.toLong(ipStr); - } - - final PlayerData actor; - - if (sender instanceof Player) { - try { - actor = plugin.getPlayerStorage().queryForId(UUIDUtils.toBytes((Player) sender)); - } catch (SQLException e) { - sender.sendMessage(Message.get("sender.error.exception").toString()); - e.printStackTrace(); - return; - } - } else { - actor = plugin.getPlayerStorage().getConsole(); - } - - final GlobalIpBanData ban = new GlobalIpBanData(ip, actor, reason); - int created; - - try { - created = plugin.getGlobalIpBanStorage().create(ban); - } catch (SQLException e) { - sender.sendMessage(Message.get("sender.error.exception").toString()); - e.printStackTrace(); - return; - } - - if (created != 1) { - return; - } - - Message.get("banipall.notify") - .set("actor", ban.getActorName()) - .set("reason", ban.getReason()) - .set("ip", ipStr) - .sendTo(sender); - } - - }); - - return true; - } - -} diff --git a/src/main/java/me/confuser/banmanager/commands/global/MuteAllCommand.java b/src/main/java/me/confuser/banmanager/commands/global/MuteAllCommand.java deleted file mode 100644 index cfcc15310..000000000 --- a/src/main/java/me/confuser/banmanager/commands/global/MuteAllCommand.java +++ /dev/null @@ -1,90 +0,0 @@ -package me.confuser.banmanager.commands.global; - -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.data.global.GlobalPlayerMuteData; -import me.confuser.banmanager.util.CommandParser; -import me.confuser.banmanager.util.CommandUtils; -import me.confuser.bukkitutil.Message; -import me.confuser.bukkitutil.commands.BukkitCommand; -import org.apache.commons.lang.StringUtils; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; - -import java.sql.SQLException; - -public class MuteAllCommand extends BukkitCommand { - - public MuteAllCommand() { - super("muteall"); - } - - @Override - public boolean onCommand(final CommandSender sender, Command command, String commandName, String[] args) { - CommandParser parser = new CommandParser(args); - args = parser.getArgs(); - - final boolean isSoft = parser.isSoft(); - - if (isSoft && !sender.hasPermission(command.getPermission() + ".soft")) { - sender.sendMessage(Message.getString("sender.error.noPermission")); - return true; - } - - if (args.length < 2) { - return false; - } - - if (args[0].equalsIgnoreCase(sender.getName())) { - sender.sendMessage(Message.getString("sender.error.noSelf")); - return true; - } - - // Check if UUID vs name - final String playerName = args[0]; - final String reason = StringUtils.join(args, " ", 1, args.length); - - plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() { - - @Override - public void run() { - final PlayerData player = CommandUtils.getPlayer(sender, playerName); - - if (player == null) { - sender.sendMessage(Message.get("sender.error.notFound").set("player", playerName).toString()); - return; - } - - final PlayerData actor = CommandUtils.getActor(sender); - - if (actor == null) return; - - final GlobalPlayerMuteData ban = new GlobalPlayerMuteData(player, actor, reason, isSoft); - int created; - - try { - created = plugin.getGlobalPlayerMuteStorage().create(ban); - } catch (SQLException e) { - sender.sendMessage(Message.get("sender.error.exception").toString()); - e.printStackTrace(); - return; - } - - if (created != 1) { - return; - } - - Message.get("muteall.notify") - .set("actor", ban.getActorName()) - .set("reason", ban.getReason()) - .set("player", player.getName()) - .set("playerId", player.getUUID().toString()) - .sendTo(sender); - } - - }); - - return true; - } - -} diff --git a/src/main/java/me/confuser/banmanager/commands/global/TempBanAllCommand.java b/src/main/java/me/confuser/banmanager/commands/global/TempBanAllCommand.java deleted file mode 100644 index 84ee19062..000000000 --- a/src/main/java/me/confuser/banmanager/commands/global/TempBanAllCommand.java +++ /dev/null @@ -1,98 +0,0 @@ -package me.confuser.banmanager.commands.global; - -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.configs.TimeLimitType; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.data.global.GlobalPlayerBanData; -import me.confuser.banmanager.util.CommandUtils; -import me.confuser.banmanager.util.DateUtils; -import me.confuser.bukkitutil.Message; -import me.confuser.bukkitutil.commands.BukkitCommand; -import org.apache.commons.lang.StringUtils; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; - -import java.sql.SQLException; - -public class TempBanAllCommand extends BukkitCommand { - - public TempBanAllCommand() { - super("tempbanall"); - } - - @Override - public boolean onCommand(final CommandSender sender, Command command, String commandName, String[] args) { - if (args.length < 3) { - return false; - } - - if (args[0].equalsIgnoreCase(sender.getName())) { - sender.sendMessage(Message.getString("sender.error.noSelf")); - return true; - } - - // Check if UUID vs name - final String playerName = args[0]; - long expiresCheck; - - try { - expiresCheck = DateUtils.parseDateDiff(args[1], true); - } catch (Exception e1) { - sender.sendMessage(Message.get("time.error.invalid").toString()); - return true; - } - - if (plugin.getConfiguration().getTimeLimits().isPastLimit(sender, TimeLimitType.PLAYER_BAN, expiresCheck)) { - Message.get("time.error.limit").sendTo(sender); - return true; - } - - final long expires = expiresCheck; - - final String reason = StringUtils.join(args, " ", 2, args.length); - - plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() { - - @Override - public void run() { - final PlayerData player = CommandUtils.getPlayer(sender, playerName); - - if (player == null) { - sender.sendMessage(Message.get("sender.error.notFound").set("player", playerName).toString()); - return; - } - - final PlayerData actor = CommandUtils.getActor(sender); - - if (actor == null) return; - - final GlobalPlayerBanData ban = new GlobalPlayerBanData(player, actor, reason, expires); - int created; - - try { - created = plugin.getGlobalPlayerBanStorage().create(ban); - } catch (SQLException e) { - sender.sendMessage(Message.get("sender.error.exception").toString()); - e.printStackTrace(); - return; - } - - if (created != 1) { - return; - } - - Message.get("tempbanall.notify") - .set("actor", ban.getActorName()) - .set("reason", ban.getReason()) - .set("expires", DateUtils.getDifferenceFormat(ban.getExpires())) - .set("player", player.getName()) - .set("playerId", player.getUUID().toString()) - .sendTo(sender); - } - - }); - - return true; - } - -} diff --git a/src/main/java/me/confuser/banmanager/commands/global/TempBanIpAllCommand.java b/src/main/java/me/confuser/banmanager/commands/global/TempBanIpAllCommand.java deleted file mode 100644 index 44e063af5..000000000 --- a/src/main/java/me/confuser/banmanager/commands/global/TempBanIpAllCommand.java +++ /dev/null @@ -1,121 +0,0 @@ -package me.confuser.banmanager.commands.global; - -import com.google.common.net.InetAddresses; -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.configs.TimeLimitType; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.data.global.GlobalIpBanData; -import me.confuser.banmanager.util.DateUtils; -import me.confuser.banmanager.util.IPUtils; -import me.confuser.banmanager.util.UUIDUtils; -import me.confuser.bukkitutil.Message; -import me.confuser.bukkitutil.commands.BukkitCommand; -import org.apache.commons.lang.StringUtils; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.sql.SQLException; - -public class TempBanIpAllCommand extends BukkitCommand { - - public TempBanIpAllCommand() { - super("tempbanipall"); - } - - @Override - public boolean onCommand(final CommandSender sender, Command command, String commandName, String[] args) { - if (args.length < 3) { - return false; - } - - final String ipStr = args[0]; - final boolean isName = !InetAddresses.isInetAddress(ipStr); - - if (isName && ipStr.length() > 16) { - Message message = Message.get("sender.error.invalidIp"); - message.set("ip", ipStr); - - sender.sendMessage(message.toString()); - return true; - } - - long expiresCheck; - - try { - expiresCheck = DateUtils.parseDateDiff(args[1], true); - } catch (Exception e1) { - sender.sendMessage(Message.get("time.error.invalid").toString()); - return true; - } - - if (plugin.getConfiguration().getTimeLimits().isPastLimit(sender, TimeLimitType.IP_BAN, expiresCheck)) { - Message.get("time.error.limit").sendTo(sender); - return true; - } - - final long expires = expiresCheck; - - final String reason = StringUtils.join(args, " ", 2, args.length); - - plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() { - - @Override - public void run() { - final long ip; - - if (isName) { - PlayerData player = plugin.getPlayerStorage().retrieve(ipStr, false); - if (player == null) { - sender.sendMessage(Message.get("sender.error.notFound").set("player", ipStr).toString()); - return; - } - - ip = player.getIp(); - } else { - ip = IPUtils.toLong(ipStr); - } - - final PlayerData actor; - - if (sender instanceof Player) { - try { - actor = plugin.getPlayerStorage().queryForId(UUIDUtils.toBytes((Player) sender)); - } catch (SQLException e) { - sender.sendMessage(Message.get("sender.error.exception").toString()); - e.printStackTrace(); - return; - } - } else { - actor = plugin.getPlayerStorage().getConsole(); - } - - final GlobalIpBanData ban = new GlobalIpBanData(ip, actor, reason, expires); - int created; - - try { - created = plugin.getGlobalIpBanStorage().create(ban); - } catch (SQLException e) { - sender.sendMessage(Message.get("sender.error.exception").toString()); - e.printStackTrace(); - return; - } - - if (created != 1) { - return; - } - - Message.get("tempbanipall.notify") - .set("ip", ipStr) - .set("actor", ban.getActorName()) - .set("reason", ban.getReason()) - .set("expires", DateUtils.getDifferenceFormat(ban.getExpires())) - .sendTo(sender); - } - - }); - - return true; - } - -} diff --git a/src/main/java/me/confuser/banmanager/commands/global/TempMuteAllCommand.java b/src/main/java/me/confuser/banmanager/commands/global/TempMuteAllCommand.java deleted file mode 100644 index 00650122b..000000000 --- a/src/main/java/me/confuser/banmanager/commands/global/TempMuteAllCommand.java +++ /dev/null @@ -1,121 +0,0 @@ -package me.confuser.banmanager.commands.global; - -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.configs.TimeLimitType; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.data.global.GlobalPlayerMuteData; -import me.confuser.banmanager.util.CommandParser; -import me.confuser.banmanager.util.CommandUtils; -import me.confuser.banmanager.util.DateUtils; -import me.confuser.banmanager.util.UUIDUtils; -import me.confuser.bukkitutil.Message; -import me.confuser.bukkitutil.commands.BukkitCommand; -import org.apache.commons.lang.StringUtils; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.sql.SQLException; - -public class TempMuteAllCommand extends BukkitCommand { - - public TempMuteAllCommand() { - super("tempmuteall"); - } - - @Override - public boolean onCommand(final CommandSender sender, Command command, String commandName, String[] args) { - CommandParser parser = new CommandParser(args); - args = parser.getArgs(); - - final boolean isSoft = parser.isSoft(); - - if (isSoft && !sender.hasPermission(command.getPermission() + ".soft")) { - sender.sendMessage(Message.getString("sender.error.noPermission")); - return true; - } - - if (args.length < 3) { - return false; - } - - if (args[0].equalsIgnoreCase(sender.getName())) { - sender.sendMessage(Message.getString("sender.error.noSelf")); - return true; - } - - // Check if UUID vs name - final String playerName = args[0]; - long expiresCheck; - - try { - expiresCheck = DateUtils.parseDateDiff(args[1], true); - } catch (Exception e1) { - sender.sendMessage(Message.get("invalidTime").toString()); - return true; - } - - if (plugin.getConfiguration().getTimeLimits().isPastLimit(sender, TimeLimitType.PLAYER_MUTE, expiresCheck)) { - Message.get("timeLimitError").sendTo(sender); - return true; - } - - final long expires = expiresCheck; - - final String reason = StringUtils.join(args, " ", 2, args.length); - - plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() { - - @Override - public void run() { - final PlayerData player = CommandUtils.getPlayer(sender, playerName); - - if (player == null) { - sender.sendMessage(Message.get("sender.error.notFound").set("player", playerName).toString()); - return; - } - - final PlayerData actor; - - if (sender instanceof Player) { - try { - actor = plugin.getPlayerStorage().queryForId(UUIDUtils.toBytes((Player) sender)); - } catch (SQLException e) { - sender.sendMessage(Message.get("sender.error.exception").toString()); - e.printStackTrace(); - return; - } - } else { - actor = plugin.getPlayerStorage().getConsole(); - } - - final GlobalPlayerMuteData mute = new GlobalPlayerMuteData(player, actor, reason, isSoft, expires); - int created; - - try { - created = plugin.getGlobalPlayerMuteStorage().create(mute); - } catch (SQLException e) { - sender.sendMessage(Message.get("sender.error.exception").toString()); - e.printStackTrace(); - return; - } - - if (created != 1) { - return; - } - - Message.get("tempmuteall.notify") - .set("actor", mute.getActorName()) - .set("reason", mute.getReason()) - .set("expires", DateUtils.getDifferenceFormat(mute.getExpires())) - .set("player", player.getName()) - .set("playerId", player.getUUID().toString()) - .sendTo(sender); - } - - }); - - return true; - } - -} diff --git a/src/main/java/me/confuser/banmanager/commands/global/UnbanAllCommand.java b/src/main/java/me/confuser/banmanager/commands/global/UnbanAllCommand.java deleted file mode 100644 index e05a6b670..000000000 --- a/src/main/java/me/confuser/banmanager/commands/global/UnbanAllCommand.java +++ /dev/null @@ -1,106 +0,0 @@ -package me.confuser.banmanager.commands.global; - -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.PlayerBanData; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.data.global.GlobalPlayerBanRecordData; -import me.confuser.banmanager.util.UUIDUtils; -import me.confuser.bukkitutil.Message; -import me.confuser.bukkitutil.commands.BukkitCommand; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.sql.SQLException; -import java.util.UUID; - -public class UnbanAllCommand extends BukkitCommand { - - public UnbanAllCommand() { - super("unbanall"); - } - - @Override - public boolean onCommand(final CommandSender sender, Command command, String commandName, String[] args) { - if (args.length < 1) { - return false; - } - - // Check if UUID vs name - final String playerName = args[0]; - final boolean isUUID = playerName.length() > 16; - boolean isBanned; - - if (isUUID) { - isBanned = plugin.getPlayerBanStorage().isBanned(UUID.fromString(playerName)); - } else { - isBanned = plugin.getPlayerBanStorage().isBanned(playerName); - } - - if (!isBanned) { - Message message = Message.get("unban.error.noExists"); - message.set("player", playerName); - - sender.sendMessage(message.toString()); - return true; - } - - plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() { - - @Override - public void run() { - PlayerBanData ban; - - if (isUUID) { - ban = plugin.getPlayerBanStorage().getBan(UUID.fromString(playerName)); - } else { - ban = plugin.getPlayerBanStorage().getBan(playerName); - } - - if (ban == null) { - sender.sendMessage(Message.get("sender.error.notFound").set("player", playerName).toString()); - return; - } - - PlayerData actor; - - if (sender instanceof Player) { - try { - actor = plugin.getPlayerStorage().queryForId(UUIDUtils.toBytes((Player) sender)); - } catch (SQLException e) { - sender.sendMessage(Message.get("sender.error.exception").toString()); - e.printStackTrace(); - return; - } - } else { - actor = plugin.getPlayerStorage().getConsole(); - } - - GlobalPlayerBanRecordData record = new GlobalPlayerBanRecordData(ban.getPlayer(), actor); - - int unbanned; - - try { - unbanned = plugin.getGlobalPlayerBanRecordStorage().create(record); - } catch (SQLException e) { - sender.sendMessage(Message.get("errorOccurred").toString()); - e.printStackTrace(); - return; - } - - if (unbanned == 0) { - return; - } - - Message.get("unbanall.notify") - .set("actor", actor.getName()) - .set("player", ban.getPlayer().getName()) - .set("playerId", ban.getPlayer().getUUID().toString()) - .sendTo(sender); - } - - }); - - return true; - } -} diff --git a/src/main/java/me/confuser/banmanager/commands/global/UnbanIpAllCommand.java b/src/main/java/me/confuser/banmanager/commands/global/UnbanIpAllCommand.java deleted file mode 100644 index 83a51daf7..000000000 --- a/src/main/java/me/confuser/banmanager/commands/global/UnbanIpAllCommand.java +++ /dev/null @@ -1,110 +0,0 @@ -package me.confuser.banmanager.commands.global; - -import com.google.common.net.InetAddresses; -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.IpBanData; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.data.global.GlobalIpBanRecordData; -import me.confuser.banmanager.util.IPUtils; -import me.confuser.banmanager.util.UUIDUtils; -import me.confuser.bukkitutil.Message; -import me.confuser.bukkitutil.commands.BukkitCommand; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.sql.SQLException; - -public class UnbanIpAllCommand extends BukkitCommand { - - public UnbanIpAllCommand() { - super("unbanipall"); - } - - @Override - public boolean onCommand(final CommandSender sender, Command command, String commandName, String[] args) { - if (args.length < 1) { - return false; - } - - // Check if UUID vs name - final String ipStr = args[0]; - final boolean isName = !InetAddresses.isInetAddress(ipStr); - - if (isName && ipStr.length() > 16) { - Message message = Message.get("invalidIp"); - message.set("ip", ipStr); - - sender.sendMessage(message.toString()); - return true; - } - - plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() { - - @Override - public void run() { - final long ip; - - if (isName) { - PlayerData player = plugin.getPlayerStorage().retrieve(ipStr, false); - if (player == null) { - sender.sendMessage(Message.get("sender.error.notFound").set("player", ipStr).toString()); - return; - } - - ip = player.getIp(); - } else { - ip = IPUtils.toLong(ipStr); - } - - IpBanData ban = plugin.getIpBanStorage().getBan(ip); - - if (ban == null) { - Message message = Message.get("unbanip.error.noExists"); - message.set("ip", ipStr); - - sender.sendMessage(message.toString()); - return; - } - - PlayerData actor; - - if (sender instanceof Player) { - try { - actor = plugin.getPlayerStorage().queryForId(UUIDUtils.toBytes((Player) sender)); - } catch (SQLException e) { - sender.sendMessage(Message.get("sender.error.exception").toString()); - e.printStackTrace(); - return; - } - } else { - actor = plugin.getPlayerStorage().getConsole(); - } - - GlobalIpBanRecordData record = new GlobalIpBanRecordData(ban.getIp(), actor); - - int unbanned; - - try { - unbanned = plugin.getGlobalIpBanRecordStorage().create(record); - } catch (SQLException e) { - sender.sendMessage(Message.get("errorOccurred").toString()); - e.printStackTrace(); - return; - } - - if (unbanned == 0) { - return; - } - - Message.get("unbanipall.notify") - .set("actor", actor.getName()) - .set("ip", ban.getIp()) - .sendTo(sender); - } - - }); - - return true; - } -} diff --git a/src/main/java/me/confuser/banmanager/commands/global/UnmuteAllCommand.java b/src/main/java/me/confuser/banmanager/commands/global/UnmuteAllCommand.java deleted file mode 100644 index e6327983e..000000000 --- a/src/main/java/me/confuser/banmanager/commands/global/UnmuteAllCommand.java +++ /dev/null @@ -1,106 +0,0 @@ -package me.confuser.banmanager.commands.global; - -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.data.PlayerMuteData; -import me.confuser.banmanager.data.global.GlobalPlayerMuteRecordData; -import me.confuser.banmanager.util.UUIDUtils; -import me.confuser.bukkitutil.Message; -import me.confuser.bukkitutil.commands.BukkitCommand; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.sql.SQLException; -import java.util.UUID; - -public class UnmuteAllCommand extends BukkitCommand { - - public UnmuteAllCommand() { - super("unmuteall"); - } - - @Override - public boolean onCommand(final CommandSender sender, Command command, String commandName, String[] args) { - if (args.length < 1) { - return false; - } - - // Check if UUID vs name - final String playerName = args[0]; - final boolean isUUID = playerName.length() > 16; - boolean isMuted; - - if (isUUID) { - isMuted = plugin.getPlayerMuteStorage().isMuted(UUID.fromString(playerName)); - } else { - isMuted = plugin.getPlayerMuteStorage().isMuted(playerName); - } - - if (!isMuted) { - Message message = Message.get("unmute.error.noExists"); - message.set("player", playerName); - - sender.sendMessage(message.toString()); - return true; - } - - plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() { - - @Override - public void run() { - PlayerMuteData mute; - - if (isUUID) { - mute = plugin.getPlayerMuteStorage().getMute(UUID.fromString(playerName)); - } else { - mute = plugin.getPlayerMuteStorage().getMute(playerName); - } - - if (mute == null) { - sender.sendMessage(Message.get("sender.error.notFound").set("player", playerName).toString()); - return; - } - - PlayerData actor; - - if (sender instanceof Player) { - try { - actor = plugin.getPlayerStorage().queryForId(UUIDUtils.toBytes((Player) sender)); - } catch (SQLException e) { - sender.sendMessage(Message.get("sender.error.exception").toString()); - e.printStackTrace(); - return; - } - } else { - actor = plugin.getPlayerStorage().getConsole(); - } - - GlobalPlayerMuteRecordData record = new GlobalPlayerMuteRecordData(mute.getPlayer(), actor); - - int unmuted; - - try { - unmuted = plugin.getGlobalPlayerMuteRecordStorage().create(record); - } catch (SQLException e) { - sender.sendMessage(Message.get("errorOccurred").toString()); - e.printStackTrace(); - return; - } - - if (unmuted == 0) { - return; - } - - Message.get("unmuteall.notify") - .set("actor", actor.getName()) - .set("player", mute.getPlayer().getName()) - .set("playerId", mute.getPlayer().getUUID().toString()) - .sendTo(sender); - } - - }); - - return true; - } -} diff --git a/src/main/java/me/confuser/banmanager/commands/report/AssignSubCommand.java b/src/main/java/me/confuser/banmanager/commands/report/AssignSubCommand.java deleted file mode 100644 index 62b6b946a..000000000 --- a/src/main/java/me/confuser/banmanager/commands/report/AssignSubCommand.java +++ /dev/null @@ -1,131 +0,0 @@ -package me.confuser.banmanager.commands.report; - -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.data.PlayerReportData; -import me.confuser.banmanager.util.CommandUtils; -import me.confuser.banmanager.util.UUIDUtils; -import me.confuser.bukkitutil.Message; -import me.confuser.bukkitutil.commands.SubCommand; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.sql.SQLException; - -public class AssignSubCommand extends SubCommand { - - public AssignSubCommand() { - super("assign"); - } - - @Override - public boolean onCommand(final CommandSender sender, final String[] args) { - if (args.length == 0) return false; - if (!(sender instanceof Player) && args.length != 2) return false; - - if (args.length != 1 && !sender.hasPermission("bm.command.report.assign.other")) { - Message.get("sender.error.noPermission").sendTo(sender); - return true; - } - - if (CommandUtils.isValidNameDelimiter(args[0])) { - CommandUtils.handleMultipleNames(sender, "reports assign", args); - return true; - } - - final Integer id; - - try { - id = Integer.parseInt(args[0]); - } catch (NumberFormatException e) { - Message.get("report.tp.error.invalidId").set("id", args[0]).sendTo(sender); - return true; - } - - plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() { - - @Override - public void run() { - final PlayerReportData data; - - try { - data = plugin.getPlayerReportStorage().queryForId(id); - } catch (SQLException e) { - sender.sendMessage(Message.getString("sender.error.exception")); - e.printStackTrace(); - return; - } - - if (data == null) { - sender.sendMessage(Message.getString("report.error.notFound")); - return; - } - - final PlayerData player; - if (args.length == 2) { - player = plugin.getPlayerStorage().retrieve(args[1], false); - } else { - try { - player = plugin.getPlayerStorage().queryForId(UUIDUtils.toBytes((Player) sender)); - } catch (SQLException e) { - sender.sendMessage(Message.getString("sender.error.exception")); - e.printStackTrace(); - return; - } - } - - if (player == null) { - sender.sendMessage(Message.get("sender.error.notFound").toString()); - return; - } - - data.setAssignee(player); - - try { - data.setState(plugin.getReportStateStorage().queryForId(2)); - plugin.getPlayerReportStorage().update(data); - } catch (SQLException e) { - sender.sendMessage(Message.getString("sender.error.exception")); - e.printStackTrace(); - return; - } - - Message.get("report.assign.player") - .set("id", data.getId()) - .set("player", player.getName()) - .sendTo(sender); - - plugin.getServer().getScheduler().runTask(plugin, new Runnable() { - - @Override - public void run() { - Player bukkitPlayer = CommandUtils.getPlayer(player.getUUID()); - - if (bukkitPlayer == null) return; - - Message.get("report.assign.notify") - .set("id", data.getId()) - .set("displayName", bukkitPlayer.getDisplayName()) - .set("player", player.getName()) - .set("playerId", player.getUUID().toString()) - .set("reason", data.getReason()) - .set("actor", sender.getName()).sendTo(bukkitPlayer); - - } - }); - } - }); - - return true; - } - - @Override - public String getHelp() { - return " [player]"; - } - - @Override - public String getPermission() { - return "command.reports.assign"; - } -} diff --git a/src/main/java/me/confuser/banmanager/commands/report/CloseSubCommand.java b/src/main/java/me/confuser/banmanager/commands/report/CloseSubCommand.java deleted file mode 100644 index 2d1fe2d95..000000000 --- a/src/main/java/me/confuser/banmanager/commands/report/CloseSubCommand.java +++ /dev/null @@ -1,147 +0,0 @@ -package me.confuser.banmanager.commands.report; - -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.data.PlayerReportCommandData; -import me.confuser.banmanager.data.PlayerReportCommentData; -import me.confuser.banmanager.data.PlayerReportData; -import me.confuser.banmanager.util.CommandUtils; -import me.confuser.bukkitutil.Message; -import me.confuser.bukkitutil.commands.SubCommand; -import org.apache.commons.lang.StringUtils; -import org.bukkit.command.CommandSender; - -import java.sql.SQLException; - -public class CloseSubCommand extends SubCommand { - - public CloseSubCommand() { - super("close"); - } - - @Override - public boolean onCommand(final CommandSender sender, final String[] args) { - if (args.length == 0) return false; - - if (CommandUtils.isValidNameDelimiter(args[0])) { - CommandUtils.handleMultipleNames(sender, "reports close", args); - return true; - } - - final int id; - - try { - id = Integer.parseInt(args[0]); - } catch (NumberFormatException e) { - Message.get("report.tp.error.invalidId").set("id", args[0]).sendTo(sender); - return true; - } - - plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() { - - @Override - public void run() { - final PlayerReportData data; - - try { - data = plugin.getPlayerReportStorage().queryForId(id); - } catch (SQLException e) { - sender.sendMessage(Message.getString("sender.error.exception")); - e.printStackTrace(); - return; - } - - if (data == null) { - sender.sendMessage(Message.getString("report.tp.error.notFound")); - return; - } - - try { - data.setState(plugin.getReportStateStorage().queryForId(4)); - plugin.getPlayerReportStorage().update(data); - } catch (SQLException e) { - sender.sendMessage(Message.getString("sender.error.exception")); - e.printStackTrace(); - return; - } - - if (args.length == 1) { - String message = Message.get("report.close.notify.closed") - .set("actor", data.getActor().getName()) - .set("id", data.getId()) - .toString(); - - CommandUtils.broadcast(message, "bm.notify.report.closed", sender); - return; - } - - PlayerData actor = CommandUtils.getActor(sender); - - if (args[1].startsWith("/")) { - PlayerReportCommandData commandData = new PlayerReportCommandData(data, actor, args[1] - .substring(1), StringUtils.join(args, " ", 2, args.length)); - - final String command = StringUtils.join(args, " ", 1, args.length); - - // Run command as actor - plugin.getServer().getScheduler().runTask(plugin, new Runnable() { - - @Override - public void run() { - Message.get("report.close.dispatch").set("command", command).sendTo(sender); - plugin.getServer().dispatchCommand(sender, command.substring(1)); - } - }); - - try { - plugin.getPlayerReportCommandStorage().create(commandData); - } catch (SQLException e) { - sender.sendMessage(Message.getString("sender.error.exception")); - e.printStackTrace(); - return; - } - - String message = Message.get("report.close.notify.command") - .set("actor", data.getActor().getName()) - .set("id", data.getId()) - .set("command", command) - .toString(); - - CommandUtils.broadcast(message, "bm.notify.report.closed", sender); - } else { - String comment = CommandUtils.getReason(1, args).getMessage(); - PlayerReportCommentData commentData = new PlayerReportCommentData(data, actor, comment); - - try { - plugin.getPlayerReportCommentStorage().create(commentData); - } catch (SQLException e) { - sender.sendMessage(Message.getString("sender.error.exception")); - e.printStackTrace(); - return; - } - - String message = Message.get("report.close.notify.comment") - .set("actor", data.getActor().getName()) - .set("id", data.getId()) - .set("comment", comment) - .toString(); - - CommandUtils.broadcast(message, "bm.notify.report.closed", sender); - } - - } - }); - - return true; - } - - @Override - public String getHelp() { - return " [/command || comment]"; - } - - @Override - public String getPermission() { - return "command.reports.close"; - } -} diff --git a/src/main/java/me/confuser/banmanager/commands/report/InfoSubCommand.java b/src/main/java/me/confuser/banmanager/commands/report/InfoSubCommand.java deleted file mode 100644 index 83f81587c..000000000 --- a/src/main/java/me/confuser/banmanager/commands/report/InfoSubCommand.java +++ /dev/null @@ -1,98 +0,0 @@ -package me.confuser.banmanager.commands.report; - -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.PlayerReportData; -import me.confuser.banmanager.data.PlayerReportLocationData; -import me.confuser.bukkitutil.Message; -import me.confuser.bukkitutil.commands.PlayerSubCommand; -import org.apache.commons.lang.time.FastDateFormat; -import org.bukkit.Location; -import org.bukkit.World; -import org.bukkit.entity.Player; - -import java.sql.SQLException; - -public class InfoSubCommand extends PlayerSubCommand { - - public InfoSubCommand() { - super("info"); - } - - @Override - public boolean onPlayerCommand(final Player player, String[] args) { - if (args.length != 1) return false; - - final int id; - - try { - id = Integer.parseInt(args[0]); - } catch (NumberFormatException e) { - Message.get("report.info.error.invalidId").set("id", args[0]).sendTo(player); - return true; - } - - plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() { - - @Override - public void run() { - final PlayerReportData data; - - try { - data = plugin.getPlayerReportStorage().queryForId(id); - } catch (SQLException e) { - player.sendMessage(Message.getString("sender.error.exception")); - e.printStackTrace(); - return; - } - - if (data == null) { - Message.get("report.info.error.notFound").sendTo(player); - return; - } - - String dateTimeFormat = Message.getString("report.info.dateTimeFormat"); - FastDateFormat dateFormatter = FastDateFormat.getInstance(dateTimeFormat); - - Message.get("report.info.notify.report") - .set("id", data.getId()) - .set("player", data.getPlayer().getName()) - .set("actor", data.getActor().getName()) - .set("reason", data.getReason()) - .set("created", dateFormatter.format(data.getCreated() * 1000L)) - .sendTo(player); - - PlayerReportLocationData location; - - try { - location = plugin.getPlayerReportLocationStorage().getByReportId(id); - } catch (SQLException e) { - player.sendMessage(Message.getString("sender.error.exception")); - e.printStackTrace(); - return; - } - - if (location == null) return; - - Message.get("report.info.notify.location") - .set("world", location.getWorld()) - .set("x", location.getX()) - .set("y", location.getY()) - .set("z", location.getZ()) - .sendTo(player); - - } - }); - - return true; - } - - @Override - public String getHelp() { - return ""; - } - - @Override - public String getPermission() { - return "command.reports.info"; - } -} diff --git a/src/main/java/me/confuser/banmanager/commands/report/ListSubCommand.java b/src/main/java/me/confuser/banmanager/commands/report/ListSubCommand.java deleted file mode 100644 index 68094850c..000000000 --- a/src/main/java/me/confuser/banmanager/commands/report/ListSubCommand.java +++ /dev/null @@ -1,93 +0,0 @@ -package me.confuser.banmanager.commands.report; - -import com.j256.ormlite.stmt.SelectArg; -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.ReportState; -import me.confuser.banmanager.util.CommandUtils; -import me.confuser.banmanager.util.UUIDUtils; -import me.confuser.bukkitutil.Message; -import me.confuser.bukkitutil.commands.SubCommand; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.sql.SQLException; -import java.util.List; - -public class ListSubCommand extends SubCommand { - - public ListSubCommand() { - super("list"); - } - - @Override - public boolean onCommand(final CommandSender sender, final String[] args) { - plugin.getServer().getScheduler().runTask(plugin, new Runnable() { - - @Override - public void run() { - int page = 1; - Integer state = null; - - if (args.length >= 1) { - try { - page = Integer.parseInt(args[0]); - } catch (NumberFormatException e) { - Message.get("report.list.error.invalidPage").set("page", args[0]).sendTo(sender); - return; - } - } - - if (args.length == 2) { - try { - List states = plugin.getReportStateStorage().queryForEq("name", new SelectArg(args[1])); - - if (states.size() == 0) { - Message.get("report.list.error.invalidState").set("state", args[1]).sendTo(sender); - return; - } - - state = states.get(0).getId(); - } catch (SQLException e) { - sender.sendMessage(Message.get("sender.error.exception").toString()); - e.printStackTrace(); - return; - } - } - - ReportList reports; - - try { - if (!(sender instanceof Player) || sender.hasPermission("bm.command.reports.list.others")) { - reports = plugin.getPlayerReportStorage().getReports(page, state, null); - } else { - reports = plugin.getPlayerReportStorage() - .getReports(page, state, UUIDUtils.getUUID((Player) sender)); - } - } catch (SQLException e) { - sender.sendMessage(Message.get("sender.error.exception").toString()); - e.printStackTrace(); - return; - } - - if (reports == null || reports.getList().size() == 0) { - Message.get("report.list.noResults").sendTo(sender); - return; - } - - CommandUtils.sendReportList(reports, sender, page); - } - }); - - return true; - } - - @Override - public String getHelp() { - return "[page] [state]"; - } - - @Override - public String getPermission() { - return "command.reports.list"; - } -} diff --git a/src/main/java/me/confuser/banmanager/commands/report/ReportList.java b/src/main/java/me/confuser/banmanager/commands/report/ReportList.java deleted file mode 100644 index e9982b4a0..000000000 --- a/src/main/java/me/confuser/banmanager/commands/report/ReportList.java +++ /dev/null @@ -1,21 +0,0 @@ -package me.confuser.banmanager.commands.report; - -import lombok.Getter; -import me.confuser.banmanager.data.PlayerReportData; - -import java.util.List; - -public class ReportList { - @Getter - private List list; - @Getter - private long count; - @Getter - private long maxPage; - - public ReportList(List list, long count, long maxPage) { - this.list = list; - this.count = count; - this.maxPage = maxPage; - } -} diff --git a/src/main/java/me/confuser/banmanager/commands/report/TeleportSubCommand.java b/src/main/java/me/confuser/banmanager/commands/report/TeleportSubCommand.java deleted file mode 100644 index 25633f0f8..000000000 --- a/src/main/java/me/confuser/banmanager/commands/report/TeleportSubCommand.java +++ /dev/null @@ -1,105 +0,0 @@ -package me.confuser.banmanager.commands.report; - -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.PlayerReportLocationData; -import me.confuser.bukkitutil.Message; -import me.confuser.bukkitutil.commands.PlayerSubCommand; -import org.apache.commons.lang.time.FastDateFormat; -import org.bukkit.Location; -import org.bukkit.World; -import org.bukkit.entity.Player; - -import java.sql.SQLException; - -public class TeleportSubCommand extends PlayerSubCommand { - - public TeleportSubCommand() { - super("tp"); - } - - @Override - public boolean onPlayerCommand(final Player player, String[] args) { - if (args.length != 1) return false; - - final int id; - - try { - id = Integer.parseInt(args[0]); - } catch (NumberFormatException e) { - Message.get("report.tp.error.invalidId").set("id", args[0]).sendTo(player); - return true; - } - - plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() { - - @Override - public void run() { - final PlayerReportLocationData data; - - try { - data = plugin.getPlayerReportLocationStorage().getByReportId(id); - } catch (SQLException e) { - player.sendMessage(Message.getString("sender.error.exception")); - e.printStackTrace(); - return; - } - - if (data == null) { - Message.get("report.tp.error.notFound").sendTo(player); - return; - } - - final World world = plugin.getServer().getWorld(data.getWorld()); - - if (world == null) { - Message.get("report.tp.error.worldNotFound").set("world", data.getWorld()).sendTo(player); - return; - } - - String dateTimeFormat = Message.getString("report.tp.dateTimeFormat"); - FastDateFormat dateFormatter = FastDateFormat.getInstance(dateTimeFormat); - - Message.get("report.tp.notify.report") - .set("id", data.getReport().getId()) - .set("player", data.getReport().getPlayer().getName()) - .set("actor", data.getReport().getActor().getName()) - .set("reason", data.getReport().getReason()) - .set("created", dateFormatter - .format(data.getReport().getCreated() * 1000L)) - .sendTo(player); - - Message.get("report.tp.notify.location") - .set("world", data.getWorld()) - .set("x", data.getX()) - .set("y", data.getY()) - .set("z", data.getZ()) - .sendTo(player); - - plugin.getServer().getScheduler().runTask(plugin, new Runnable() { - - @Override - public void run() { - Location location = new Location(world, data.getX(), data.getY(), data.getZ(), data.getYaw(), data.getPitch()); - - // Teleport safety checks - if (player.isInsideVehicle()) player.leaveVehicle(); - - player.teleport(location); - } - }); - } - }); - - return true; - } - - @Override - public String getHelp() { - return ""; - } - - @Override - public String getPermission() { - return "command.reports.tp"; - } -} diff --git a/src/main/java/me/confuser/banmanager/commands/report/UnassignSubCommand.java b/src/main/java/me/confuser/banmanager/commands/report/UnassignSubCommand.java deleted file mode 100644 index 555144d4c..000000000 --- a/src/main/java/me/confuser/banmanager/commands/report/UnassignSubCommand.java +++ /dev/null @@ -1,84 +0,0 @@ -package me.confuser.banmanager.commands.report; - -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.PlayerReportData; -import me.confuser.banmanager.util.CommandUtils; -import me.confuser.bukkitutil.Message; -import me.confuser.bukkitutil.commands.SubCommand; -import org.bukkit.command.CommandSender; - -import java.sql.SQLException; - -public class UnassignSubCommand extends SubCommand { - - public UnassignSubCommand() { - super("unassign"); - } - - @Override - public boolean onCommand(final CommandSender sender, final String[] args) { - if (args.length != 1) return false; - - if (CommandUtils.isValidNameDelimiter(args[0])) { - CommandUtils.handleMultipleNames(sender, "reports unassign", args); - return true; - } - - final int id; - - try { - id = Integer.parseInt(args[0]); - } catch (NumberFormatException e) { - Message.get("report.tp.error.invalidId").set("id", args[0]).sendTo(sender); - return true; - } - - plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() { - - @Override - public void run() { - final PlayerReportData data; - - try { - data = plugin.getPlayerReportStorage().queryForId(id); - } catch (SQLException e) { - sender.sendMessage(Message.getString("sender.error.exception")); - e.printStackTrace(); - return; - } - - if (data == null) { - sender.sendMessage(Message.getString("report.tp.error.notFound")); - return; - } - - data.setAssignee(null); - - try { - data.setState(plugin.getReportStateStorage().queryForId(1)); - plugin.getPlayerReportStorage().update(data); - } catch (SQLException e) { - sender.sendMessage(Message.getString("sender.error.exception")); - e.printStackTrace(); - return; - } - - Message.get("report.unassign.player") - .set("id", data.getId()) - .sendTo(sender); - } - }); - - return true; - } - - @Override - public String getHelp() { - return ""; - } - - @Override - public String getPermission() { - return "command.reports.unassign"; - } -} diff --git a/src/main/java/me/confuser/banmanager/commands/utils/MissingPlayersSubCommand.java b/src/main/java/me/confuser/banmanager/commands/utils/MissingPlayersSubCommand.java deleted file mode 100644 index 8c9c88ac2..000000000 --- a/src/main/java/me/confuser/banmanager/commands/utils/MissingPlayersSubCommand.java +++ /dev/null @@ -1,128 +0,0 @@ -package me.confuser.banmanager.commands.utils; - -import com.j256.ormlite.stmt.StatementBuilder; -import com.j256.ormlite.support.CompiledStatement; -import com.j256.ormlite.support.DatabaseConnection; -import com.j256.ormlite.support.DatabaseResults; -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.util.UUIDUtils; -import me.confuser.bukkitutil.Message; -import me.confuser.bukkitutil.commands.SubCommand; -import org.bukkit.command.CommandSender; - -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; - -public class MissingPlayersSubCommand extends SubCommand { - - private static List types = new ArrayList() { - - { - add("playerBans"); - add("playerKicks"); - add("playerMutes"); - add("playerNotes"); - add("playerReports"); - add("playerWarnings"); - } - }; - - public MissingPlayersSubCommand() { - super("missingplayers"); - } - - @Override - public boolean onCommand(final CommandSender sender, final String[] args) { - sender.sendMessage("Scanning database"); - - plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() { - - @Override - public void run() { - DatabaseConnection connection; - ArrayList players = new ArrayList(); - - try { - connection = plugin.getLocalConn().getReadOnlyConnection(); - } catch (SQLException e) { - e.printStackTrace(); - - Message.get("sender.error.exception").sendTo(sender); - - return; - } - - String playerTableName = plugin.getConfiguration().getLocalDb().getTable("players").getTableName(); - - for (String type : types) { - String tableName = plugin.getConfiguration().getLocalDb().getTable(type).getTableName(); - String sql = "SELECT b.player_id FROM " + tableName + " b LEFT JOIN `" + playerTableName + "` p ON b.player_id = p.id WHERE p.id IS NULL"; - DatabaseResults result = null; - - try { - CompiledStatement statement = connection - .compileStatement(sql, StatementBuilder.StatementType.SELECT, null, DatabaseConnection - .DEFAULT_RESULT_FLAGS); - - result = statement.runQuery(null); - - while (result.next()) { - players.add(UUIDUtils.fromBytes(result.getBytes(0))); - } - } catch (SQLException e) { - e.printStackTrace(); - - Message.get("sender.error.exception").sendTo(sender); - } finally { - if (result != null) result.closeQuietly(); - } - } - - connection.closeQuietly(); - - if (players.size() == 0) { - Message.get("bmutils.missingplayers.noneFound").sendTo(sender); - return; - } - - Message.get("bmutils.missingplayers.found").set("amount", players.size()).sendTo(sender); - - int count = 0; - - for (UUID uuid : players) { - try { - String name = "Unknown"; - - if (BanManager.getPlugin().getConfiguration().isOnlineMode()) { - name = UUIDUtils.getCurrentName(uuid); - } - - plugin.getPlayerStorage().createIfNotExists(uuid, name); - - count++; - } catch (Exception e) { - e.printStackTrace(); - - Message.get("bmutils.missingplayers.failedLookup").set("uuid", uuid.toString()).sendTo(sender); - } - } - - Message.get("bmutils.missingplayers.complete").set("amount", count).sendTo(sender); - } - }); - - return true; - } - - @Override - public String getHelp() { - return null; - } - - @Override - public String getPermission() { - return "command.bmutils.missingplayers"; - } -} diff --git a/src/main/java/me/confuser/banmanager/configs/ActionCommand.java b/src/main/java/me/confuser/banmanager/configs/ActionCommand.java deleted file mode 100644 index 0b7f96ccc..000000000 --- a/src/main/java/me/confuser/banmanager/configs/ActionCommand.java +++ /dev/null @@ -1,16 +0,0 @@ -package me.confuser.banmanager.configs; - -import lombok.Getter; - -public class ActionCommand { - - @Getter - private final String command; - @Getter - private final long delay; - - public ActionCommand(String command, long delay) { - this.command = command; - this.delay = delay; - } -} diff --git a/src/main/java/me/confuser/banmanager/configs/ConsoleConfig.java b/src/main/java/me/confuser/banmanager/configs/ConsoleConfig.java deleted file mode 100644 index 2bba615b4..000000000 --- a/src/main/java/me/confuser/banmanager/configs/ConsoleConfig.java +++ /dev/null @@ -1,41 +0,0 @@ -package me.confuser.banmanager.configs; - -import java.util.UUID; -import lombok.Getter; - -import me.confuser.banmanager.BanManager; -import me.confuser.bukkitutil.configs.Config; - -public class ConsoleConfig extends Config { - - @Getter - private String name; - @Getter - private UUID uuid; - - public ConsoleConfig() { - super("console.yml"); - } - - @Override - public void afterLoad() { - if (conf.getString("uuid", "0").equals("0")) { - uuid = UUID.randomUUID(); - save(); - } else { - uuid = UUID.fromString(conf.getString("uuid")); - } - - name = conf.getString("name"); - } - - @Override - public void onSave() { - if (uuid == null) { - return; - } - - conf.set("uuid", uuid.toString()); - conf.set("name", name); - } -} diff --git a/src/main/java/me/confuser/banmanager/configs/DatabaseConfig.java b/src/main/java/me/confuser/banmanager/configs/DatabaseConfig.java deleted file mode 100644 index 089b8e07e..000000000 --- a/src/main/java/me/confuser/banmanager/configs/DatabaseConfig.java +++ /dev/null @@ -1,74 +0,0 @@ -package me.confuser.banmanager.configs; - -import com.j256.ormlite.table.DatabaseTableConfig; -import lombok.Getter; -import org.bukkit.configuration.ConfigurationSection; - -import java.util.HashMap; -import java.util.Map; - -public abstract class DatabaseConfig { - - @Getter - private final String host; - @Getter - private final int port; - @Getter - private final String name; - @Getter - private final String user; - @Getter - private final String password; - @Getter - private final boolean useSSL; - @Getter - private final boolean verifyServerCertificate; - @Getter - private final boolean isEnabled; - @Getter - private int maxConnections; - @Getter - private int leakDetection; - @Getter - private HashMap> tables = new HashMap<>(); - - private DatabaseConfig(ConfigurationSection conf) { - host = conf.getString("host"); - port = conf.getInt("port", 3306); - name = conf.getString("name"); - user = conf.getString("user"); - password = conf.getString("password"); - isEnabled = conf.getBoolean("enabled"); - maxConnections = conf.getInt("maxConnections", 10); - leakDetection = conf.getInt("leakDetection", 0); - useSSL = conf.getBoolean("useSSL", false); - verifyServerCertificate = conf.getBoolean("verifyServerCertificate", false); - - if (maxConnections > 30) maxConnections = 30; - } - - DatabaseConfig(ConfigurationSection conf, HashMap types) { - this(conf); - - for (Map.Entry entry : types.entrySet()) { - addTable(entry.getKey(), new DatabaseTableConfig<>(entry.getValue(), conf - .getString("tables." + entry.getKey()), null)); - } - } - - public String getJDBCUrl() { - return "jdbc:mysql://" + host + ":" + port + "/" + name + - "?autoReconnect=true&failOverReadOnly=false&maxReconnects=10&useUnicode=true&characterEncoding=utf-8" + - "&useSSL=" + useSSL + - "&verifyServerCertificate=" + verifyServerCertificate; - } - - public DatabaseTableConfig getTable(String table) { - return tables.get(table); - } - - // Used by ReportsLogger - public void addTable(String key, DatabaseTableConfig config) { - tables.put(key, config); - } -} diff --git a/src/main/java/me/confuser/banmanager/configs/DefaultConfig.java b/src/main/java/me/confuser/banmanager/configs/DefaultConfig.java deleted file mode 100644 index df6dd5f27..000000000 --- a/src/main/java/me/confuser/banmanager/configs/DefaultConfig.java +++ /dev/null @@ -1,228 +0,0 @@ -package me.confuser.banmanager.configs; - -import lombok.Getter; -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.util.IPUtils; -import me.confuser.bukkitutil.configs.Config; -import org.bukkit.command.PluginCommand; -import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.event.EventPriority; - -import java.io.File; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; - -public class DefaultConfig extends Config { - - @Getter - private DatabaseConfig localDb; - @Getter - private DatabaseConfig globalDb; - @Getter - private TimeLimitsConfig timeLimits; - @Getter - private HashSet mutedBlacklistCommands; - @Getter - private HashSet softMutedBlacklistCommands; - @Getter - private boolean duplicateIpCheckEnabled = true; - @Getter - private HashSet bypassPlayerIps; - @Getter - private boolean kickLoggingEnabled = false; - @Getter - private boolean debugEnabled = false; - @Getter - private long warningCooldown; - @Getter - private long reportCooldown; - @Getter - private WarningActionsConfig warningActions; - @Getter - private boolean displayNotificationsEnabled = true; - @Getter - private boolean onlineMode = true; - @Getter - private boolean checkForUpdates = false; - @Getter - private boolean offlineAutoComplete = true; - @Getter - private boolean punishAlts = false; - @Getter - private boolean denyAlts = false; - @Getter - private HashMap cleanUps; - @Getter - private int maxOnlinePerIp = 0; - @Getter - private int maxMultiaccountsRecently = 0; - @Getter - private long multiaccountsTime = 300L; - @Getter - private HooksConfig hooksConfig; - @Getter - private boolean broadcastOnSync = false; - @Getter - private boolean checkOnJoin = false; - @Getter - private boolean createNoteReasons = false; - @Getter - private boolean warningMutesEnabled = false; - @Getter - private boolean logIpsEnabled = true; - @Getter - private EventPriority chatPriority; - - public DefaultConfig() { - super("config.yml"); - } - - public DefaultConfig(File file) { - super(file); - } - - @Override - public void afterLoad() { - localDb = new LocalDatabaseConfig(conf.getConfigurationSection("databases.local")); - - if (conf.getConfigurationSection("databases.external") != null) { - convertToGlobal(); - } - - globalDb = new GlobalDatabaseConfig(conf.getConfigurationSection("databases.global")); - timeLimits = new TimeLimitsConfig(conf.getConfigurationSection("timeLimits")); - duplicateIpCheckEnabled = conf.getBoolean("duplicateIpCheck", true); - onlineMode = conf.getBoolean("onlineMode", true); - checkForUpdates = conf.getBoolean("checkForUpdates", false); - offlineAutoComplete = conf.getBoolean("offlineAutoComplete", true); - - bypassPlayerIps = new HashSet<>(); - for (String ip : conf.getStringList("bypassDuplicateChecks")) { - bypassPlayerIps.add(IPUtils.toLong(ip)); - } - - reportCooldown = conf.getLong("reportCooldown", 0); - warningCooldown = conf.getLong("warningCooldown", 0); - warningActions = new WarningActionsConfig(conf.getConfigurationSection("warningActions")); - kickLoggingEnabled = conf.getBoolean("logKicks", false); - debugEnabled = conf.getBoolean("debug", false); - displayNotificationsEnabled = conf.getBoolean("displayNotifications", true); - punishAlts = conf.getBoolean("punishAlts", false); - denyAlts = conf.getBoolean("denyAlts", false); - - cleanUps = new HashMap<>(6); - for (String type : conf.getConfigurationSection("cleanUp").getKeys(false)) { - cleanUps.put(type, new CleanUp(conf.getInt("cleanUp." + type))); - } - - maxOnlinePerIp = conf.getInt("maxOnlinePerIp", 0); - maxMultiaccountsRecently = conf.getInt("maxMultiaccountsRecently", 0); - multiaccountsTime = conf.getLong("multiaccountsTime", 300L); - - hooksConfig = new HooksConfig(conf.getConfigurationSection("hooks")); - - broadcastOnSync = conf.getBoolean("broadcastOnSync", false); - checkOnJoin = conf.getBoolean("checkOnJoin", false); - createNoteReasons = conf.getBoolean("createNoteReasons", false); - warningMutesEnabled = conf.getBoolean("warningMute", true); - logIpsEnabled = conf.getBoolean("logIps", true); - - mutedBlacklistCommands = new HashSet<>(); - softMutedBlacklistCommands = new HashSet<>(); - - try { - chatPriority = EventPriority.valueOf(conf.getString("chatPriority", "NORMAL").toUpperCase()); - } catch (Exception e) { - chatPriority = EventPriority.NORMAL; - plugin.getLogger().warning("Invalid chatPriority option, using normal priority"); - } - - // Run this after startup to ensure all aliases are found - plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() { - - @Override - public void run() { - plugin.getLogger().info("The following commands are blocked whilst muted:"); - handleBlockedCommands(conf.getStringList("mutedCommandBlacklist"), mutedBlacklistCommands); - - plugin.getLogger().info("The following commands are blocked whilst soft muted:"); - handleBlockedCommands(conf.getStringList("softMutedCommandBlacklist"), softMutedBlacklistCommands); - } - - }); - } - - private void convertToGlobal() { - plugin.getLogger().info("Converting external connection details to global"); - - ConfigurationSection section = conf.getConfigurationSection("databases.external"); - - conf.set("databases.global.enabled", section.getBoolean("enabled")); - conf.set("databases.global.host", section.getString("host")); - conf.set("databases.global.port", section.getInt("port")); - conf.set("databases.global.name", section.getString("name")); - conf.set("databases.global.user", section.getString("user")); - conf.set("databases.global.password", section.getString("password")); - conf.set("databases.global.maxConnections", section.getInt("maxConnections")); - conf.set("databases.global.leakDetection", section.getInt("leakDetection")); - - // Tables - conf.set("databases.global.tables.playerBans", section.getString("tables.playerBans")); - conf.set("databases.global.tables.playerUnbans", section.getString("tables.playerUnbans")); - conf.set("databases.global.tables.playerMutes", section.getString("tables.playerMutes")); - conf.set("databases.global.tables.playerUnmutes", section.getString("tables.playerUnmutes")); - conf.set("databases.global.tables.playerNotes", section.getString("tables.playerNotes")); - conf.set("databases.global.tables.ipBans", section.getString("tables.ipBans")); - conf.set("databases.global.tables.ipUnbans", section.getString("tables.ipUnbans")); - - conf.set("databases.external", null); - save(); - - plugin.getLogger().info("Converted external connection details to global"); - } - - private void handleBlockedCommands(List blocked, HashSet set) { - for (String cmd : blocked) { - set.add(cmd); - StringBuilder infoBuilder = new StringBuilder(cmd); - - // Check for aliases - PluginCommand command = plugin.getServer().getPluginCommand(cmd); - if (command == null) { - plugin.getLogger().info(cmd); - continue; - } - - infoBuilder.append(" - "); - - if (!set.contains(command.getName())) { - set.add(command.getName()); - infoBuilder.append(command.getName()).append(' '); - } - - for (String aliasCmd : command.getAliases()) { - infoBuilder.append(aliasCmd).append(' '); - set.add(aliasCmd); - // Block the annoying /plugin:cmd too - set.add(command.getPlugin().getDescription().getName().toLowerCase() + ":" + aliasCmd); - } - - plugin.getLogger().info(infoBuilder.toString()); - } - } - - @Override - public void onSave() { - - } - - public boolean isBlockedCommand(String cmd) { - return mutedBlacklistCommands.contains(cmd); - } - - public boolean isSoftBlockedCommand(String cmd) { - return softMutedBlacklistCommands.contains(cmd); - } - -} diff --git a/src/main/java/me/confuser/banmanager/configs/GeoIpConfig.java b/src/main/java/me/confuser/banmanager/configs/GeoIpConfig.java deleted file mode 100644 index a9541ee86..000000000 --- a/src/main/java/me/confuser/banmanager/configs/GeoIpConfig.java +++ /dev/null @@ -1,145 +0,0 @@ -package me.confuser.banmanager.configs; - -import com.maxmind.geoip2.DatabaseReader; -import com.maxmind.geoip2.model.CountryResponse; -import lombok.Getter; -import me.confuser.banmanager.BanManager; -import me.confuser.bukkitutil.configs.Config; - -import java.io.*; -import java.net.URL; -import java.net.URLConnection; -import java.util.HashSet; -import java.util.zip.GZIPInputStream; - -public class GeoIpConfig extends Config { - - @Getter - private boolean enabled = false; - @Getter - private DatabaseReader cityDatabase; - @Getter - private DatabaseReader countryDatabase; - private HashSet countries; - @Getter - private String type; - - public GeoIpConfig() { - super("geoip.yml"); - } - - @Override - public void afterLoad() { - enabled = conf.getBoolean("enabled", false); - - if (!enabled) return; - - File cityFile = new File(plugin.getDataFolder(), "city.mmdb"); - String cityDownloadUrl = conf.getString("download.city"); - File countryFile = new File(plugin.getDataFolder(), "country.mmdb"); - String countryDownloadUrl = conf.getString("download.country"); - - long lastUpdated = conf.getLong("download.lastUpdated"); - boolean outdated = (System.currentTimeMillis() - lastUpdated) > 2592000000L; // older than 30 days? - - if (!cityFile.exists() || outdated) { - plugin.getLogger().info("Downloading city database"); - try { - downloadDatabase(cityDownloadUrl, cityFile); - } catch (IOException e) { - enabled = false; - plugin.getLogger().severe("Unable to download city database"); - e.printStackTrace(); - return; - } - } - - if (!countryFile.exists() || outdated) { - plugin.getLogger().info("Downloading country database"); - try { - downloadDatabase(countryDownloadUrl, countryFile); - } catch (IOException e) { - enabled = false; - plugin.getLogger().severe("Unable to download country database"); - e.printStackTrace(); - return; - } - } - - if (cityFile.exists()) { - plugin.getLogger().info("Loading city database"); - try { - cityDatabase = new DatabaseReader.Builder(cityFile).build(); - } catch (IOException e) { - plugin.getLogger().severe("Failed loading city database"); - enabled = false; - e.printStackTrace(); - return; - } - } - - if (countryFile.exists()) { - plugin.getLogger().info("Loading country database"); - try { - countryDatabase = new DatabaseReader.Builder(countryFile).build(); - } catch (IOException e) { - plugin.getLogger().severe("Failed loading city database"); - enabled = false; - e.printStackTrace(); - return; - } - } - - if (!enabled) return; - - if (outdated) { - conf.set("download.lastUpdated", System.currentTimeMillis()); - save(); - } - - plugin.getLogger().info("Successfully loaded GeoIP databases"); - - countries = new HashSet<>(conf.getStringList("countries.list")); - type = conf.getString("countries.type"); - - plugin.getLogger().info("Loaded " + countries.size() + " countries on the " + type); - } - - public boolean isCountryAllowed(CountryResponse countryResponse) { - if (type.equals("blacklist")) { - return !countries.contains(countryResponse.getCountry().getIsoCode()); - } else { - return countries.contains(countryResponse.getCountry().getIsoCode()); - } - } - - @Override - public void onSave() { - } - - private void downloadDatabase(String downloadUrl, File location) throws IOException { - if (location.exists()) { - location.delete(); - } - - URL url = new URL(downloadUrl); - URLConnection con = url.openConnection(); - - con.setConnectTimeout(6000); - con.connect(); - - InputStream input = new GZIPInputStream(con.getInputStream()); - - OutputStream output = new FileOutputStream(location); - - byte[] buffer = new byte[1024]; - - int length; - while ((length = input.read(buffer)) > 0) { - output.write(buffer, 0, length); - } - - output.close(); - input.close(); - } -} diff --git a/src/main/java/me/confuser/banmanager/configs/MessagesConfig.java b/src/main/java/me/confuser/banmanager/configs/MessagesConfig.java deleted file mode 100644 index b12812f78..000000000 --- a/src/main/java/me/confuser/banmanager/configs/MessagesConfig.java +++ /dev/null @@ -1,21 +0,0 @@ -package me.confuser.banmanager.configs; - -import me.confuser.banmanager.BanManager; -import me.confuser.bukkitutil.Message; -import me.confuser.bukkitutil.configs.Config; - -public class MessagesConfig extends Config { - - public MessagesConfig() { - super("messages.yml"); - } - - public void afterLoad() { - Message.load(conf); - } - - public void onSave() { - - } - -} diff --git a/src/main/java/me/confuser/banmanager/configs/SchedulesConfig.java b/src/main/java/me/confuser/banmanager/configs/SchedulesConfig.java deleted file mode 100644 index 7eb85be26..000000000 --- a/src/main/java/me/confuser/banmanager/configs/SchedulesConfig.java +++ /dev/null @@ -1,52 +0,0 @@ -package me.confuser.banmanager.configs; - -import me.confuser.banmanager.BanManager; -import me.confuser.bukkitutil.configs.Config; - -import java.util.HashMap; - -public class SchedulesConfig extends Config { - - private HashMap schedules = new HashMap<>(6); - private HashMap lastChecked = new HashMap<>(4); - - public SchedulesConfig() { - super("schedules.yml"); - } - - public int getSchedule(String schedule) { - return schedules.get(schedule); - } - - public long getLastChecked(String lastChecked) { - Long checked = this.lastChecked.get(lastChecked); - - if (checked == null) return 0; - - return checked; - } - - public void setLastChecked(String key, long value) { - lastChecked.put(key, value); - } - - @Override - public void afterLoad() { - for (String key : conf.getConfigurationSection("scheduler").getKeys(false)) { - schedules.put(key, conf.getInt(("scheduler." + key), 0)); - } - - for (String key : conf.getConfigurationSection("lastChecked").getKeys(false)) { - lastChecked.put(key, conf.getLong(("lastChecked." + key), 0)); - } - - } - - @Override - public void onSave() { - if (lastChecked.size() > 0) { - conf.set("lastChecked", lastChecked); - } - } - -} diff --git a/src/main/java/me/confuser/banmanager/configs/WarningActionsConfig.java b/src/main/java/me/confuser/banmanager/configs/WarningActionsConfig.java deleted file mode 100644 index dbf2abb0d..000000000 --- a/src/main/java/me/confuser/banmanager/configs/WarningActionsConfig.java +++ /dev/null @@ -1,86 +0,0 @@ -package me.confuser.banmanager.configs; - -import lombok.Getter; -import me.confuser.banmanager.BanManager; -import org.apache.commons.lang.StringUtils; -import org.apache.commons.lang.math.NumberUtils; -import org.bukkit.configuration.ConfigurationSection; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class WarningActionsConfig { - - private BanManager plugin = BanManager.getPlugin(); - @Getter - private boolean isEnabled = false; - private HashMap> actions; - - public WarningActionsConfig(ConfigurationSection config) { - isEnabled = config.getBoolean("enabled", false); - actions = new HashMap<>(); - - if (!isEnabled) return; - - ConfigurationSection actionsConf = config.getConfigurationSection("actions"); - - if (actionsConf == null) return; - - for (String amount : actionsConf.getKeys(false)) { - if (!StringUtils.isNumeric(amount)) { - plugin.getLogger().warning("Invalid warning action, " + amount + " is not numeric"); - continue; - } - - // New check - List> mapList = actionsConf.getMapList(amount); - if (mapList != null && mapList.size() != 0) { - List actionCommands = new ArrayList<>(mapList.size()); - - for (Map map : mapList) { - if (map.get("cmd") == null) { - plugin.getLogger().severe("Missing cmd from warningActions " + amount); - continue; - } - - long delay = 0; - - if (map.get("delay") != null) { - try { - delay = Long.valueOf((Integer) map.get("delay")); - } catch (NumberFormatException e) { - plugin.getLogger().severe("Invalid delay for " + map.get("cmd")); - continue; - } - - delay = delay * 20L; // Convert from seconds to ticks - } - - actionCommands.add(new ActionCommand((String) map.get("cmd"), delay)); - } - - this.actions.put(NumberUtils.toDouble(amount), actionCommands); - } else { - List actions = actionsConf.getStringList(amount); - if (actions.size() == 0) continue; - - plugin.getLogger() - .warning("warningActions amount " + amount + " is using a deprecated list, please use new cmd and delay syntax"); - List actionCommands = new ArrayList<>(actions.size()); - - for (String action : actions) { - actionCommands.add(new ActionCommand(action, 0)); - } - - this.actions.put(NumberUtils.toDouble(amount), actionCommands); - } - } - } - - public List getCommand(double amount) { - return actions.get(amount); - } - -} diff --git a/src/main/java/me/confuser/banmanager/data/IpBanData.java b/src/main/java/me/confuser/banmanager/data/IpBanData.java deleted file mode 100644 index b0c82a6e8..000000000 --- a/src/main/java/me/confuser/banmanager/data/IpBanData.java +++ /dev/null @@ -1,80 +0,0 @@ -package me.confuser.banmanager.data; - -import me.confuser.banmanager.storage.mysql.ByteArray; - -import com.j256.ormlite.field.DatabaseField; -import com.j256.ormlite.table.DatabaseTable; -import lombok.Getter; - -@DatabaseTable -public class IpBanData { - - @Getter - @DatabaseField(generatedId = true) - private int id; - @Getter - @DatabaseField(canBeNull = false, columnDefinition = "INT UNSIGNED NOT NULL") - private long ip; - @Getter - @DatabaseField(canBeNull = false) - private String reason; - @Getter - @DatabaseField(canBeNull = false, foreign = true, foreignAutoRefresh = true, persisterClass = ByteArray.class, columnDefinition = "BINARY(16) NOT NULL") - private PlayerData actor; - - // Should always be database time - @Getter - @DatabaseField(index = true, columnDefinition = "INT(10) NOT NULL") - private long created = System.currentTimeMillis() / 1000L; - @Getter - @DatabaseField(index = true, columnDefinition = "INT(10) NOT NULL") - private long updated = System.currentTimeMillis() / 1000L; - @Getter - @DatabaseField(index = true, columnDefinition = "INT(10) NOT NULL") - private long expires = 0; - - IpBanData() { - - } - - public IpBanData(long ip, PlayerData actor, String reason) { - this.ip = ip; - this.reason = reason; - this.actor = actor; - } - - public IpBanData(long ip, PlayerData actor, String reason, long expires) { - this(ip, actor, reason); - - this.expires = expires; - } - - public IpBanData(long ip, PlayerData actor, String reason, long expires, long created) { - this(ip, actor, reason, expires); - - this.created = created; - } - - public IpBanData(int id, long ip, PlayerData actor, String reason, long expires, long created, long updated) { - this(ip, actor, reason, expires, created); - - this.id = id; - this.updated = updated; - } - - public IpBanData(IpBanRecord record) { - this(record.getIp(), record.getPastActor(), record.getReason(), record.getExpired(), record.getPastCreated()); - } - - public boolean hasExpired() { - return getExpires() != 0 && getExpires() <= (System.currentTimeMillis() / 1000L); - } - - public boolean equalsBan(IpBanData ban) { - return ban.getReason().equals(this.reason) - && ban.getExpires() == expires - && ban.getCreated() == this.created - && ban.getIp() == this.ip - && ban.getActor().getUUID().equals(this.actor.getUUID()); - } -} diff --git a/src/main/java/me/confuser/banmanager/data/IpMuteData.java b/src/main/java/me/confuser/banmanager/data/IpMuteData.java deleted file mode 100644 index 74bdf5eb0..000000000 --- a/src/main/java/me/confuser/banmanager/data/IpMuteData.java +++ /dev/null @@ -1,82 +0,0 @@ -package me.confuser.banmanager.data; - -import com.j256.ormlite.field.DatabaseField; -import com.j256.ormlite.table.DatabaseTable; -import lombok.Getter; -import me.confuser.banmanager.storage.mysql.ByteArray; - -@DatabaseTable -public class IpMuteData { - - @Getter - @DatabaseField(generatedId = true) - private int id; - @Getter - @DatabaseField(index = true, canBeNull = false, columnDefinition = "INT UNSIGNED NOT NULL") - private long ip; - @Getter - @DatabaseField(canBeNull = false) - private String reason; - @Getter - @DatabaseField(canBeNull = false, foreign = true, foreignAutoRefresh = true, persisterClass = ByteArray.class, columnDefinition = "BINARY(16) NOT NULL") - private PlayerData actor; - - // Should always be database time - @Getter - @DatabaseField(index = true, columnDefinition = "INT(10) NOT NULL") - private long created = System.currentTimeMillis() / 1000L; - @Getter - @DatabaseField(index = true, columnDefinition = "INT(10) NOT NULL") - private long updated = System.currentTimeMillis() / 1000L; - @Getter - @DatabaseField(index = true, columnDefinition = "INT(10) NOT NULL") - private long expires = 0; - - @DatabaseField(index = true) - @Getter - private boolean soft = false; - - IpMuteData() { - - } - - public IpMuteData(long ip, PlayerData actor, String reason, boolean soft) { - this.ip = ip; - this.actor = actor; - this.reason = reason; - this.soft = soft; - } - - public IpMuteData(long ip, PlayerData actor, String reason, boolean soft, long expires) { - this(ip, actor, reason, soft); - this.expires = expires; - } - - public IpMuteData(long ip, PlayerData actor, String reason, boolean soft, long expires, long created) { - this(ip, actor, reason, soft, expires); - this.created = created; - } - - public IpMuteData(int id, long ip, PlayerData actor, String reason, boolean soft, long expires, long created, long updated) { - this(ip, actor, reason, soft, expires, created); - - this.id = id; - this.updated = updated; - } - - public IpMuteData(IpMuteRecord record) { - this(record.getIp(), record.getPastActor(), record.getReason(), record.isSoft(), record.getExpired(), record.getPastCreated()); - } - - public boolean hasExpired() { - return getExpires() != 0 && getExpires() <= (System.currentTimeMillis() / 1000L); - } - - public boolean equalsMute(IpMuteData mute) { - return mute.getReason().equals(this.reason) - && mute.getExpires() == expires - && mute.getCreated() == this.created - && mute.getIp() == this.ip - && mute.getActor().getUUID().equals(this.actor.getUUID()); - } -} diff --git a/src/main/java/me/confuser/banmanager/data/IpRangeBanData.java b/src/main/java/me/confuser/banmanager/data/IpRangeBanData.java deleted file mode 100644 index 6d70e00fe..000000000 --- a/src/main/java/me/confuser/banmanager/data/IpRangeBanData.java +++ /dev/null @@ -1,93 +0,0 @@ -package me.confuser.banmanager.data; - -import com.google.common.collect.Range; -import com.j256.ormlite.field.DatabaseField; -import com.j256.ormlite.table.DatabaseTable; -import lombok.Getter; -import me.confuser.banmanager.storage.mysql.ByteArray; - -@DatabaseTable -public class IpRangeBanData { - - @Getter - @DatabaseField(generatedId = true) - private int id; - - @Getter - @DatabaseField(canBeNull = false, columnDefinition = "INT UNSIGNED NOT NULL", index = true) - private long fromIp; - - @Getter - @DatabaseField(canBeNull = false, columnDefinition = "INT UNSIGNED NOT NULL", index = true) - private long toIp; - - @Getter - @DatabaseField(canBeNull = false) - private String reason; - - @Getter - @DatabaseField(canBeNull = false, foreign = true, foreignAutoRefresh = true, persisterClass = ByteArray.class, columnDefinition = "BINARY(16) NOT NULL") - private PlayerData actor; - - // Should always be database time - @Getter - @DatabaseField(index = true, columnDefinition = "INT(10) NOT NULL") - private long created = System.currentTimeMillis() / 1000L; - @Getter - @DatabaseField(index = true, columnDefinition = "INT(10) NOT NULL") - private long updated = System.currentTimeMillis() / 1000L; - @Getter - @DatabaseField(index = true, columnDefinition = "INT(10) NOT NULL") - private long expires = 0; - - IpRangeBanData() { - - } - - public IpRangeBanData(long fromIp, long toIp, PlayerData actor, String reason) { - this.fromIp = fromIp; - this.toIp = toIp; - this.reason = reason; - this.actor = actor; - } - - public IpRangeBanData(long fromIp, long toIp, PlayerData actor, String reason, long expires) { - this(fromIp, toIp, actor, reason); - - this.expires = expires; - } - - public IpRangeBanData(long fromIp, long toIp, PlayerData actor, String reason, long expires, long created) { - this(fromIp, toIp, actor, reason, expires); - - this.created = created; - } - - public IpRangeBanData(int id, long fromIp, long toIp, PlayerData actor, String reason, long expires, long created, long updated) { - this(fromIp, toIp, actor, reason, expires, created); - - this.id = id; - this.updated = updated; - } - - public boolean hasExpired() { - return getExpires() != 0 && getExpires() <= (System.currentTimeMillis() / 1000L); - } - - public boolean inRange(long ip) { - return ip > fromIp && ip < toIp; - } - - public Range getRange() { - return Range.closed(fromIp, toIp); - } - - public boolean equalsBan(IpRangeBanData ban) { - return ban.getReason().equals(this.reason) - && ban.getExpires() == expires - && ban.getCreated() == this.created - && ban.getFromIp() == this.fromIp - && ban.getToIp() == this.toIp - && ban.getActor().getUUID().equals(this.actor.getUUID()); - } -} diff --git a/src/main/java/me/confuser/banmanager/data/PlayerData.java b/src/main/java/me/confuser/banmanager/data/PlayerData.java deleted file mode 100644 index 459f40528..000000000 --- a/src/main/java/me/confuser/banmanager/data/PlayerData.java +++ /dev/null @@ -1,84 +0,0 @@ -package me.confuser.banmanager.data; - -import java.net.InetAddress; -import java.util.UUID; - -import lombok.Setter; -import me.confuser.banmanager.storage.PlayerStorage; -import me.confuser.banmanager.storage.mysql.ByteArray; -import me.confuser.banmanager.util.IPUtils; -import me.confuser.banmanager.util.UUIDUtils; - -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; - -import com.j256.ormlite.field.DatabaseField; -import com.j256.ormlite.table.DatabaseTable; -import lombok.Getter; - -@DatabaseTable(tableName = "players", daoClass = PlayerStorage.class) -public class PlayerData { - - @DatabaseField(id = true, persisterClass = ByteArray.class, columnDefinition = "BINARY(16) NOT NULL") - @Getter - private byte[] id; - @DatabaseField(index = true, width = 16, columnDefinition = "VARCHAR(16) NOT NULL") - @Getter - @Setter - private String name; - @Getter - @DatabaseField(index = true, columnDefinition = "INT UNSIGNED NOT NULL") - private long ip; - @Getter - @DatabaseField(columnDefinition = "INT(10) NOT NULL") - private long lastSeen = System.currentTimeMillis() / 1000L; - - private UUID uuid = null; - - PlayerData() { - - } - - public PlayerData(Player player) { - uuid = UUIDUtils.getUUID(player); - id = UUIDUtils.toBytes(uuid); - name = player.getName(); - ip = IPUtils.toLong(player.getAddress().getAddress()); - } - - public PlayerData(UUID uuid, String name) { - this.uuid = uuid; - this.id = UUIDUtils.toBytes(uuid); - this.name = name; - this.ip = IPUtils.toLong("127.0.0.1"); - this.lastSeen = System.currentTimeMillis() / 1000L; - } - - public PlayerData(UUID uuid, String name, InetAddress ip) { - this.uuid = uuid; - this.id = UUIDUtils.toBytes(uuid); - this.name = name; - this.ip = IPUtils.toLong(ip); - this.lastSeen = System.currentTimeMillis() / 1000L; - } - - public PlayerData(UUID uuid, String name, long ip, long lastSeen) { - this.uuid = uuid; - this.id = UUIDUtils.toBytes(uuid); - this.name = name; - this.ip = ip; - this.lastSeen = lastSeen; - } - - public UUID getUUID() { - if (uuid == null) { - uuid = UUIDUtils.fromBytes(id); - } - - return uuid; - } - - public Player getPlayer() { - return Bukkit.getPlayer(uuid); - } -} diff --git a/src/main/java/me/confuser/banmanager/data/PlayerHistoryData.java b/src/main/java/me/confuser/banmanager/data/PlayerHistoryData.java deleted file mode 100644 index bbadc1602..000000000 --- a/src/main/java/me/confuser/banmanager/data/PlayerHistoryData.java +++ /dev/null @@ -1,39 +0,0 @@ -package me.confuser.banmanager.data; - -import com.j256.ormlite.field.DatabaseField; -import com.j256.ormlite.table.DatabaseTable; -import lombok.Getter; -import lombok.Setter; -import me.confuser.banmanager.storage.mysql.ByteArray; - -@DatabaseTable -public class PlayerHistoryData { - - @Getter - @DatabaseField(generatedId = true) - private int id; - @Getter - @DatabaseField(canBeNull = false, foreign = true, persisterClass = ByteArray.class, columnDefinition = "BINARY(16) NOT NULL") - private PlayerData player; - @Getter - @DatabaseField(index = true, canBeNull = false, columnDefinition = "INT UNSIGNED NOT NULL") - private long ip; - - // Should always be database time - @Getter - @DatabaseField(index = true, columnDefinition = "INT(10) NOT NULL") - private long join = System.currentTimeMillis() / 1000L; - @Getter - @Setter - @DatabaseField(index = true, columnDefinition = "INT(10) NOT NULL") - private long leave = System.currentTimeMillis() / 1000L; - - PlayerHistoryData() { - - } - - public PlayerHistoryData(PlayerData player) { - this.player = player; - this.ip = player.getIp(); - } -} diff --git a/src/main/java/me/confuser/banmanager/data/PlayerKickData.java b/src/main/java/me/confuser/banmanager/data/PlayerKickData.java deleted file mode 100644 index 552b01fe6..000000000 --- a/src/main/java/me/confuser/banmanager/data/PlayerKickData.java +++ /dev/null @@ -1,46 +0,0 @@ -package me.confuser.banmanager.data; - -import me.confuser.banmanager.storage.mysql.ByteArray; - -import com.j256.ormlite.field.DatabaseField; -import com.j256.ormlite.table.DatabaseTable; -import lombok.Getter; - -@DatabaseTable -public class PlayerKickData { - - @Getter - @DatabaseField(generatedId = true) - private int id; - @Getter - @DatabaseField(canBeNull = false, foreign = true, foreignAutoRefresh = true, persisterClass = ByteArray.class, columnDefinition = "BINARY(16) NOT NULL") - private PlayerData player; - @Getter - @DatabaseField(canBeNull = false) - private String reason; - @Getter - @DatabaseField(canBeNull = false, foreign = true, foreignAutoRefresh = true, persisterClass = ByteArray.class, columnDefinition = "BINARY(16) NOT NULL") - private PlayerData actor; - // Should always be database time - @DatabaseField(index = true, columnDefinition = "INT(10) NOT NULL") - @Getter - private long created = System.currentTimeMillis() / 1000L; - - PlayerKickData() { - - } - - public PlayerKickData(PlayerData player, PlayerData actor, String reason) { - this.player = player; - this.reason = reason; - this.actor = actor; - } - - // Imports only! - public PlayerKickData(PlayerData player, PlayerData actor, String reason, long created) { - this.player = player; - this.reason = reason; - this.actor = actor; - this.created = created; - } -} diff --git a/src/main/java/me/confuser/banmanager/data/global/GlobalIpBanData.java b/src/main/java/me/confuser/banmanager/data/global/GlobalIpBanData.java deleted file mode 100644 index 8d069a6b9..000000000 --- a/src/main/java/me/confuser/banmanager/data/global/GlobalIpBanData.java +++ /dev/null @@ -1,81 +0,0 @@ -package me.confuser.banmanager.data.global; - -import com.j256.ormlite.field.DatabaseField; -import lombok.Getter; -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.IpBanData; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.storage.PlayerStorage; -import me.confuser.banmanager.storage.mysql.ByteArray; -import me.confuser.banmanager.util.UUIDUtils; - -import java.sql.SQLException; -import java.util.UUID; - -public class GlobalIpBanData { - - @DatabaseField(generatedId = true) - @Getter - private int id; - - @Getter - @DatabaseField(canBeNull = false, columnDefinition = "INT UNSIGNED NOT NULL") - private long ip; - - @DatabaseField(canBeNull = false) - @Getter - private String reason; - - @DatabaseField(columnName = "actorUuid", canBeNull = false, index = true, persisterClass = ByteArray.class, columnDefinition = "BINARY(16) NOT NULL") - private byte[] actorUuidBytes; - - @DatabaseField(canBeNull = false, width = 16, columnDefinition = "VARCHAR(16) NOT NULL") - @Getter - private String actorName; - - // Should always be database time - @DatabaseField(index = true, columnDefinition = "INT(10) NOT NULL") - @Getter - private long created = System.currentTimeMillis() / 1000L; - - @DatabaseField(index = true, columnDefinition = "INT(10) NOT NULL") - @Getter - private long expires = 0; - - private UUID actorUUID; - - private PlayerStorage playerStorage = BanManager.getPlugin().getPlayerStorage(); - - GlobalIpBanData() { - - } - - public GlobalIpBanData(long ip, PlayerData actor, String reason) { - this.ip = ip; - this.reason = reason; - this.actorUuidBytes = actor.getId(); - this.actorName = actor.getName(); - } - - public GlobalIpBanData(long ip, PlayerData actor, String reason, long expires) { - this(ip, actor, reason); - - this.expires = expires; - } - - public UUID getActorUUID() { - if (actorUUID == null) { - actorUUID = UUIDUtils.fromBytes(actorUuidBytes); - } - - return actorUUID; - } - - public PlayerData getActor() throws SQLException { - return playerStorage.createIfNotExists(getActorUUID(), getActorName()); - } - - public IpBanData toLocal() throws SQLException { - return new IpBanData(ip, getActor(), reason, expires, created); - } -} diff --git a/src/main/java/me/confuser/banmanager/listeners/BanListener.java b/src/main/java/me/confuser/banmanager/listeners/BanListener.java deleted file mode 100644 index 35608ac8e..000000000 --- a/src/main/java/me/confuser/banmanager/listeners/BanListener.java +++ /dev/null @@ -1,178 +0,0 @@ -package me.confuser.banmanager.listeners; - -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.*; -import me.confuser.banmanager.events.IpBannedEvent; -import me.confuser.banmanager.events.IpRangeBannedEvent; -import me.confuser.banmanager.events.NameBannedEvent; -import me.confuser.banmanager.events.PlayerBannedEvent; -import me.confuser.banmanager.util.CommandUtils; -import me.confuser.banmanager.util.DateUtils; -import me.confuser.banmanager.util.IPUtils; -import me.confuser.bukkitutil.Message; -import me.confuser.bukkitutil.listeners.Listeners; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; - -import java.util.List; - -public class BanListener extends Listeners { - - @EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR) - public void notifyOnBan(PlayerBannedEvent event) { - PlayerBanData ban = event.getBan(); - - String broadcastPermission; - Message message; - - if (ban.getExpires() == 0) { - broadcastPermission = "bm.notify.ban"; - message = Message.get("ban.notify"); - } else { - broadcastPermission = "bm.notify.tempban"; - message = Message.get("tempban.notify"); - message.set("expires", DateUtils.getDifferenceFormat(ban.getExpires())); - } - - message.set("player", ban.getPlayer().getName()) - .set("playerId", ban.getPlayer().getUUID().toString()) - .set("actor", ban.getActor().getName()) - .set("reason", ban.getReason()); - - if (!event.isSilent()) { - CommandUtils.broadcast(message.toString(), broadcastPermission); - } - - // Check if the sender is online and does not have the - // broadcastPermission - Player player; - if ((player = CommandUtils.getPlayer(ban.getActor().getUUID())) == null) { - return; - } - - if (event.isSilent() || !player.hasPermission(broadcastPermission)) { - message.sendTo(player); - } - } - - @EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR) - public void notifyOnIpBan(IpBannedEvent event) { - IpBanData ban = event.getBan(); - - String broadcastPermission; - Message message; - - if (ban.getExpires() == 0) { - broadcastPermission = "bm.notify.banip"; - message = Message.get("banip.notify"); - } else { - broadcastPermission = "bm.notify.tempbanip"; - message = Message.get("tempbanip.notify"); - message.set("expires", DateUtils.getDifferenceFormat(ban.getExpires())); - } - - List players = plugin.getPlayerStorage().getDuplicates(ban.getIp()); - StringBuilder playerNames = new StringBuilder(); - - for (PlayerData player : players) { - playerNames.append(player.getName()); - playerNames.append(", "); - } - - if (playerNames.length() == 0) return; - if (playerNames.length() >= 2) playerNames.setLength(playerNames.length() - 2); - - message.set("ip", IPUtils.toString(ban.getIp())).set("actor", ban.getActor().getName()) - .set("reason", ban.getReason()) - .set("players", playerNames.toString()); - - if (!event.isSilent()) { - CommandUtils.broadcast(message.toString(), broadcastPermission); - } - - // Check if the sender is online and does not have the - // broadcastPermission - Player player; - if ((player = CommandUtils.getPlayer(ban.getActor().getUUID())) == null) { - return; - } - - if (event.isSilent() || !player.hasPermission(broadcastPermission)) { - message.sendTo(player); - } - } - - @EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR) - public void notifyOnIpRangeBan(IpRangeBannedEvent event) { - IpRangeBanData ban = event.getBan(); - - String broadcastPermission; - Message message; - - if (ban.getExpires() == 0) { - broadcastPermission = "bm.notify.baniprange"; - message = Message.get("baniprange.notify"); - } else { - broadcastPermission = "bm.notify.tempbaniprange"; - message = Message.get("tempbaniprange.notify"); - message.set("expires", DateUtils.getDifferenceFormat(ban.getExpires())); - } - - message.set("from", IPUtils.toString(ban.getFromIp())) - .set("to", IPUtils.toString(ban.getToIp())) - .set("actor", ban.getActor().getName()) - .set("reason", ban.getReason()); - - if (!event.isSilent()) { - CommandUtils.broadcast(message.toString(), broadcastPermission); - } - - // Check if the sender is online and does not have the - // broadcastPermission - Player player; - if ((player = CommandUtils.getPlayer(ban.getActor().getUUID())) == null) { - return; - } - - if (event.isSilent() || !player.hasPermission(broadcastPermission)) { - message.sendTo(player); - } - } - - @EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR) - public void notifyOnNameBan(NameBannedEvent event) { - NameBanData ban = event.getBan(); - - String broadcastPermission; - Message message; - - if (ban.getExpires() == 0) { - broadcastPermission = "bm.notify.banname"; - message = Message.get("banname.notify"); - } else { - broadcastPermission = "bm.notify.tempbanname"; - message = Message.get("tempbanname.notify"); - message.set("expires", DateUtils.getDifferenceFormat(ban.getExpires())); - } - - message.set("name", ban.getName()) - .set("actor", ban.getActor().getName()) - .set("reason", ban.getReason()); - - if (!event.isSilent()) { - CommandUtils.broadcast(message.toString(), broadcastPermission); - } - - // Check if the sender is online and does not have the - // broadcastPermission - Player player; - if ((player = CommandUtils.getPlayer(ban.getActor().getUUID())) == null) { - return; - } - - if (event.isSilent() || !player.hasPermission(broadcastPermission)) { - message.sendTo(player); - } - } -} diff --git a/src/main/java/me/confuser/banmanager/listeners/ChatListener.java b/src/main/java/me/confuser/banmanager/listeners/ChatListener.java deleted file mode 100644 index fc150aa90..000000000 --- a/src/main/java/me/confuser/banmanager/listeners/ChatListener.java +++ /dev/null @@ -1,140 +0,0 @@ -package me.confuser.banmanager.listeners; - -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.IpMuteData; -import me.confuser.banmanager.data.PlayerMuteData; -import me.confuser.banmanager.data.PlayerWarnData; -import me.confuser.banmanager.util.CommandUtils; -import me.confuser.banmanager.util.DateUtils; -import me.confuser.banmanager.util.IPUtils; -import me.confuser.banmanager.util.UUIDUtils; -import me.confuser.bukkitutil.Message; -import me.confuser.bukkitutil.listeners.Listeners; -import org.bukkit.event.player.AsyncPlayerChatEvent; - -import java.sql.SQLException; -import java.util.UUID; - -public class ChatListener extends Listeners { - - public void onPlayerChat(AsyncPlayerChatEvent event) { - UUID uuid = UUIDUtils.getUUID(event.getPlayer()); - - if (!plugin.getPlayerMuteStorage().isMuted(uuid)) { - if (plugin.getPlayerWarnStorage().isMuted(uuid)) { - PlayerWarnData warning = plugin.getPlayerWarnStorage().getMute(uuid); - - if (warning.getReason().toLowerCase().equals(event.getMessage().toLowerCase())) { - plugin.getPlayerWarnStorage().removeMute(uuid); - Message.get("warn.player.disallowed.removed").sendTo(event.getPlayer()); - } else { - Message.get("warn.player.disallowed.header").sendTo(event.getPlayer()); - Message.get("warn.player.disallowed.reason").set("reason", warning.getReason()).sendTo(event.getPlayer()); - } - - event.setCancelled(true); - } - - return; - } - - PlayerMuteData mute = plugin.getPlayerMuteStorage().getMute(uuid); - - if (mute.hasExpired()) { - try { - plugin.getPlayerMuteStorage().unmute(mute, plugin.getPlayerStorage().getConsole()); - } catch (SQLException e) { - e.printStackTrace(); - } - return; - } - - if (mute.isSoft()) { - event.getRecipients().clear(); - event.getRecipients().add(event.getPlayer()); - return; - } - - event.setCancelled(true); - - Message broadcast = Message.get("mute.player.broadcast") - .set("message", event.getMessage()) - .set("displayName", event.getPlayer().getDisplayName()) - .set("player", event.getPlayer().getName()) - .set("playerId", uuid.toString()) - .set("reason", mute.getReason()) - .set("actor", mute.getActor().getName()); - - CommandUtils.broadcast(broadcast.toString(), "bm.notify.muted"); - - Message message; - - if (mute.getExpires() == 0) { - message = Message.get("mute.player.disallowed"); - } else { - message = Message.get("tempmute.player.disallowed") - .set("expires", DateUtils.getDifferenceFormat(mute.getExpires())); - } - - message.set("displayName", event.getPlayer().getDisplayName()) - .set("player", event.getPlayer().getName()) - .set("playerId", uuid.toString()) - .set("reason", mute.getReason()) - .set("actor", mute.getActor().getName()); - - event.getPlayer().sendMessage(message.toString()); - } - - public void onIpChat(AsyncPlayerChatEvent event) { - if (!plugin.getIpMuteStorage().isMuted(event.getPlayer().getAddress().getAddress())) { - return; - } - - IpMuteData mute = plugin.getIpMuteStorage().getMute(event.getPlayer().getAddress().getAddress()); - - if (mute.hasExpired()) { - try { - plugin.getIpMuteStorage().unmute(mute, plugin.getPlayerStorage().getConsole()); - } catch (SQLException e) { - e.printStackTrace(); - } - return; - } - - if (mute.isSoft()) { - event.getRecipients().clear(); - event.getRecipients().add(event.getPlayer()); - return; - } - - event.setCancelled(true); - - Message broadcast = Message.get("muteip.ip.broadcast") - .set("message", event.getMessage()) - .set("displayName", event.getPlayer().getDisplayName()) - .set("player", event.getPlayer().getName()) - .set("playerId", UUIDUtils.getUUID(event.getPlayer()).toString()) - .set("reason", mute.getReason()) - .set("actor", mute.getActor().getName()); - - CommandUtils.broadcast(broadcast.toString(), "bm.notify.mutedip"); - - Message message; - - if (mute.getExpires() == 0) { - message = Message.get("muteip.ip.disallowed"); - } else { - message = Message.get("tempmuteip.ip.disallowed") - .set("expires", DateUtils.getDifferenceFormat(mute.getExpires())); - } - - message.set("displayName", event.getPlayer().getDisplayName()) - .set("player", event.getPlayer().getName()) - .set("playerId", UUIDUtils.getUUID(event.getPlayer()).toString()) - .set("reason", mute.getReason()) - .set("actor", mute.getActor().getName()) - .set("ip", IPUtils.toString(mute.getIp())); - - event.getPlayer().sendMessage(message.toString()); - } -} diff --git a/src/main/java/me/confuser/banmanager/listeners/CommandListener.java b/src/main/java/me/confuser/banmanager/listeners/CommandListener.java deleted file mode 100644 index df6fadb9a..000000000 --- a/src/main/java/me/confuser/banmanager/listeners/CommandListener.java +++ /dev/null @@ -1,52 +0,0 @@ -package me.confuser.banmanager.listeners; - -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.util.UUIDUtils; -import me.confuser.bukkitutil.Message; -import me.confuser.bukkitutil.listeners.Listeners; -import org.apache.commons.lang.StringUtils; -import org.bukkit.event.EventHandler; -import org.bukkit.event.player.PlayerCommandPreprocessEvent; - -import java.util.UUID; - -public class CommandListener extends Listeners { - - @EventHandler - public void onCommand(PlayerCommandPreprocessEvent event) { - UUID id = UUIDUtils.getUUID(event.getPlayer()); - - if (!plugin.getPlayerMuteStorage().isMuted(id)) { - return; - } - - // Split the command - String[] args = event.getMessage().split(" ", 6); - - // Get rid of the first / - String cmd = args[0].replace("/", "").toLowerCase(); - - boolean isSoft = plugin.getPlayerMuteStorage().getMute(id).isSoft(); - boolean deepCheck = isSoft ? !plugin.getConfiguration().isSoftBlockedCommand(cmd) : !plugin.getConfiguration().isBlockedCommand(cmd); - - if (deepCheck) { - // Check if arguments blocked - boolean shouldCancel = false; - for (int i = 1; i < args.length; i++) { - String check = cmd + " " + StringUtils.join(args, " ", 1, i + 1); - - if ((isSoft && plugin.getConfiguration().isSoftBlockedCommand(check)) || plugin.getConfiguration().isBlockedCommand(check)) { - shouldCancel = true; - cmd = check; - break; - } - } - - if (!shouldCancel) return; - } - - event.setCancelled(true); - - if (!isSoft) event.getPlayer().sendMessage(Message.get("mute.player.blocked").set("command", cmd).toString()); - } -} diff --git a/src/main/java/me/confuser/banmanager/listeners/HookListener.java b/src/main/java/me/confuser/banmanager/listeners/HookListener.java deleted file mode 100644 index c3e75de58..000000000 --- a/src/main/java/me/confuser/banmanager/listeners/HookListener.java +++ /dev/null @@ -1,306 +0,0 @@ -package me.confuser.banmanager.listeners; - -import com.google.common.collect.ImmutableMap; -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.configs.ActionCommand; -import me.confuser.banmanager.configs.Hook; -import me.confuser.banmanager.configs.HooksConfig; -import me.confuser.banmanager.events.*; -import me.confuser.banmanager.util.IPUtils; -import me.confuser.bukkitutil.listeners.Listeners; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; - -import java.util.List; -import java.util.Map; - -public class HookListener extends Listeners { - - // TODO refactor to reduce duplicate code - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onBan(final PlayerBanEvent event) { - HooksConfig config = plugin.getConfiguration().getHooksConfig(); - final Hook hook = event.getBan().getExpires() == 0 ? config.getHook("ban") : config.getHook("tempban"); - - if (hook == null) return; - - if (hook.getPre().size() != 0) { - executeCommands(hook.getPre(), ImmutableMap.of( - "player", event.getBan().getPlayer().getName() - , "playerId", event.getBan().getPlayer().getUUID().toString() - , "actor", event.getBan().getActor().getName() - , "reason", event.getBan().getReason() - , "expires", Long.toString(event.getBan().getExpires()) - )); - } - } - - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onBan(final PlayerBannedEvent event) { - HooksConfig config = plugin.getConfiguration().getHooksConfig(); - final Hook hook = event.getBan().getExpires() == 0 ? config.getHook("ban") : config.getHook("tempban"); - - if (hook == null) return; - - if (hook.getPost().size() != 0) { - executeCommands(hook.getPost(), ImmutableMap.of( - "player", event.getBan().getPlayer().getName() - , "playerId", event.getBan().getPlayer().getUUID().toString() - , "actor", event.getBan().getActor().getName() - , "reason", event.getBan().getReason() - , "expires", Long.toString(event.getBan().getExpires()) - )); - } - } - - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onUnban(final PlayerUnbanEvent event) { - HooksConfig config = plugin.getConfiguration().getHooksConfig(); - final Hook hook = config.getHook("unban"); - - if (hook == null) return; - - if (hook.getPost().size() != 0) { - executeCommands(hook.getPost(), ImmutableMap.of( - "player", event.getBan().getPlayer().getName() - , "playerId", event.getBan().getPlayer().getUUID().toString() - , "actor", event.getActor().getName() - , "reason", event.getReason() - , "expires", Long.toString(event.getBan().getExpires()) - )); - } - } - - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onMute(final PlayerMuteEvent event) { - HooksConfig config = plugin.getConfiguration().getHooksConfig(); - final Hook hook = event.getMute().getExpires() == 0 ? config.getHook("mute") : config.getHook("tempmute"); - - if (hook == null) return; - - if (hook.getPre().size() != 0) { - executeCommands(hook.getPre(), ImmutableMap.of( - "player", event.getMute().getPlayer().getName() - , "playerId", event.getMute().getPlayer().getUUID().toString() - , "actor", event.getMute().getActor().getName() - , "reason", event.getMute().getReason() - , "expires", Long.toString(event.getMute().getExpires()) - )); - } - } - - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onMute(final PlayerMutedEvent event) { - HooksConfig config = plugin.getConfiguration().getHooksConfig(); - final Hook hook = event.getMute().getExpires() == 0 ? config.getHook("mute") : config.getHook("tempmute"); - - if (hook == null) return; - - if (hook.getPost().size() != 0) { - executeCommands(hook.getPost(), ImmutableMap.of( - "player", event.getMute().getPlayer().getName() - , "playerId", event.getMute().getPlayer().getUUID().toString() - , "actor", event.getMute().getActor().getName() - , "reason", event.getMute().getReason() - , "expires", Long.toString(event.getMute().getExpires()) - )); - } - } - - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onUnmute(final PlayerUnmuteEvent event) { - HooksConfig config = plugin.getConfiguration().getHooksConfig(); - final Hook hook = config.getHook("unmute"); - - if (hook == null) return; - - if (hook.getPost().size() != 0) { - executeCommands(hook.getPost(), ImmutableMap.of( - "player", event.getMute().getPlayer().getName() - , "playerId", event.getMute().getPlayer().getUUID().toString() - , "actor", event.getActor().getName() - , "reason", event.getReason() - , "expires", Long.toString(event.getMute().getExpires()) - )); - } - } - - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onBan(final IpBanEvent event) { - HooksConfig config = plugin.getConfiguration().getHooksConfig(); - final Hook hook = event.getBan().getExpires() == 0 ? config.getHook("ipban") : config.getHook("tempipban"); - - if (hook == null) return; - - if (hook.getPre().size() != 0) { - executeCommands(hook.getPre(), ImmutableMap.of( - "ip", IPUtils.toString(event.getBan().getIp()) - , "actor", event.getBan().getActor().getName() - , "reason", event.getBan().getReason() - , "expires", Long.toString(event.getBan().getExpires()) - )); - } - } - - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onBan(final IpBannedEvent event) { - HooksConfig config = plugin.getConfiguration().getHooksConfig(); - final Hook hook = event.getBan().getExpires() == 0 ? config.getHook("ipban") : config.getHook("tempipban"); - - if (hook == null) return; - - if (hook.getPost().size() != 0) { - executeCommands(hook.getPost(), ImmutableMap.of( - "ip", IPUtils.toString(event.getBan().getIp()) - , "actor", event.getBan().getActor().getName() - , "reason", event.getBan().getReason() - , "expires", Long.toString(event.getBan().getExpires()) - )); - } - } - - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onUnban(final IpUnbanEvent event) { - HooksConfig config = plugin.getConfiguration().getHooksConfig(); - final Hook hook = config.getHook("unbanip"); - - if (hook == null) return; - - if (hook.getPost().size() != 0) { - executeCommands(hook.getPost(), ImmutableMap.of( - "ip", IPUtils.toString(event.getBan().getIp()) - , "actor", event.getActor().getName() - , "reason", event.getReason() - , "expires", Long.toString(event.getBan().getExpires()) - )); - } - } - - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onBan(final IpRangeBanEvent event) { - HooksConfig config = plugin.getConfiguration().getHooksConfig(); - final Hook hook = event.getBan().getExpires() == 0 ? config.getHook("iprangeban") : config - .getHook("temprangeipban"); - - if (hook == null) return; - - if (hook.getPre().size() != 0) { - executeCommands(hook.getPre(), ImmutableMap.of( - "from", IPUtils.toString(event.getBan().getFromIp()) - , "to", IPUtils.toString(event.getBan().getToIp()) - , "actor", event.getBan().getActor().getName() - , "reason", event.getBan().getReason() - , "expires", Long.toString(event.getBan().getExpires()) - )); - } - } - - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onBan(final IpRangeBannedEvent event) { - HooksConfig config = plugin.getConfiguration().getHooksConfig(); - final Hook hook = event.getBan().getExpires() == 0 ? config.getHook("iprangeban") : config - .getHook("temprangeipban"); - - if (hook == null) return; - - if (hook.getPost().size() != 0) { - executeCommands(hook.getPost(), ImmutableMap.of( - "from", IPUtils.toString(event.getBan().getFromIp()) - , "to", IPUtils.toString(event.getBan().getToIp()) - , "actor", event.getBan().getActor().getName() - , "reason", event.getBan().getReason() - , "expires", Long.toString(event.getBan().getExpires()) - )); - } - } - - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onUnban(final IpRangeUnbanEvent event) { - HooksConfig config = plugin.getConfiguration().getHooksConfig(); - final Hook hook = config.getHook("unbaniprange"); - - if (hook == null) return; - - if (hook.getPost().size() != 0) { - executeCommands(hook.getPost(), ImmutableMap.of( - "from", IPUtils.toString(event.getBan().getFromIp()) - , "to", IPUtils.toString(event.getBan().getToIp()) - , "actor", event.getActor().getName() - , "reason", event.getReason() - , "expires", Long.toString(event.getBan().getExpires()) - )); - } - } - - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onWarn(final PlayerWarnEvent event) { - HooksConfig config = plugin.getConfiguration().getHooksConfig(); - final Hook hook = config.getHook("warn"); - - if (hook == null) return; - - if (hook.getPre().size() != 0) { - executeCommands(hook.getPre(), ImmutableMap.of( - "player", event.getWarning().getPlayer().getName() - , "playerId", event.getWarning().getPlayer().getUUID().toString() - , "actor", event.getWarning().getActor().getName() - , "reason", event.getWarning().getReason() - , "expires", Long.toString(event.getWarning().getExpires()) - )); - } - } - - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onWarn(final PlayerWarnedEvent event) { - HooksConfig config = plugin.getConfiguration().getHooksConfig(); - final Hook hook = event.getWarning().getExpires() == 0 ? config.getHook("warn") : config.getHook("tempwarn"); - - if (hook == null) return; - - if (hook.getPost().size() != 0) { - executeCommands(hook.getPost(), ImmutableMap.of( - "player", event.getWarning().getPlayer().getName() - , "playerId", event.getWarning().getPlayer().getUUID().toString() - , "actor", event.getWarning().getActor().getName() - , "reason", event.getWarning().getReason() - , "expires", Long.toString(event.getWarning().getExpires()) - )); - } - } - - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onNote(final PlayerNoteCreatedEvent event) { - HooksConfig config = plugin.getConfiguration().getHooksConfig(); - final Hook hook = config.getHook("note"); - - if (hook == null) return; - - if (hook.getPost().size() != 0) { - executeCommands(hook.getPost(), ImmutableMap.of( - "player", event.getNote().getPlayer().getName() - , "playerId", event.getNote().getPlayer().getUUID().toString() - , "actor", event.getNote().getActor().getName() - , "message", event.getNote().getMessage() - )); - } - } - - private void executeCommands(List commands, final Map messages) { - for (final ActionCommand command : commands) { - plugin.getServer().getScheduler().runTaskLater(plugin, new Runnable() { - - @Override - public void run() { - String hookCommand = command.getCommand(); - - for (Map.Entry entry : messages.entrySet()) { - hookCommand = hookCommand.replace("[" + entry.getKey() + "]", entry.getValue()); - } - - plugin.getServer().dispatchCommand(plugin.getServer().getConsoleSender(), hookCommand); - } - - }, command.getDelay()); - } - } -} diff --git a/src/main/java/me/confuser/banmanager/listeners/JoinListener.java b/src/main/java/me/confuser/banmanager/listeners/JoinListener.java deleted file mode 100644 index 1b8a8eed0..000000000 --- a/src/main/java/me/confuser/banmanager/listeners/JoinListener.java +++ /dev/null @@ -1,530 +0,0 @@ -package me.confuser.banmanager.listeners; - -import com.google.common.cache.Cache; -import com.google.common.cache.CacheBuilder; -import com.j256.ormlite.dao.CloseableIterator; -import com.maxmind.geoip2.exception.GeoIp2Exception; -import com.maxmind.geoip2.model.CountryResponse; -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.commands.report.ReportList; -import me.confuser.banmanager.data.*; -import me.confuser.banmanager.util.*; -import me.confuser.bukkitutil.Message; -import me.confuser.bukkitutil.listeners.Listeners; -import org.apache.commons.lang.time.FastDateFormat; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.player.AsyncPlayerPreLoginEvent; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerLoginEvent; - -import java.io.IOException; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; -import java.util.concurrent.TimeUnit; - -public class JoinListener extends Listeners { - - // Used for throttling attempted join messages - Cache joinCache = CacheBuilder.newBuilder() - .expireAfterWrite(1, TimeUnit.MINUTES) - .concurrencyLevel(2) - .maximumSize(100) - .build(); - - @EventHandler(priority = EventPriority.HIGHEST) - public void banCheck(final AsyncPlayerPreLoginEvent event) { - if (plugin.getConfiguration().isCheckOnJoin()) { - // Check for new bans/mutes - if (!plugin.getIpBanStorage().isBanned(event.getAddress())) { - try { - IpBanData ban = plugin.getIpBanStorage().retrieveBan(IPUtils.toLong(event.getAddress())); - - if (ban != null) plugin.getIpBanStorage().addBan(ban); - } catch (SQLException e) { - e.printStackTrace(); - } - } - - if (!plugin.getPlayerBanStorage().isBanned(UUIDUtils.getUUID(event))) { - try { - PlayerBanData ban = plugin.getPlayerBanStorage().retrieveBan(UUIDUtils.getUUID(event)); - - if (ban != null) plugin.getPlayerBanStorage().addBan(ban); - } catch (SQLException e) { - e.printStackTrace(); - } - } - - if (!plugin.getPlayerMuteStorage().isMuted(UUIDUtils.getUUID(event))) { - try { - PlayerMuteData mute = plugin.getPlayerMuteStorage().retrieveMute(UUIDUtils.getUUID(event)); - - if (mute != null) plugin.getPlayerMuteStorage().addMute(mute); - } catch (SQLException e) { - e.printStackTrace(); - } - } - } - - if (plugin.getIpRangeBanStorage().isBanned(event.getAddress())) { - IpRangeBanData data = plugin.getIpRangeBanStorage().getBan(event.getAddress()); - - if (data.hasExpired()) { - try { - plugin.getIpRangeBanStorage().unban(data, plugin.getPlayerStorage().getConsole()); - } catch (SQLException e) { - e.printStackTrace(); - } - - return; - } - - Message message; - - if (data.getExpires() == 0) { - message = Message.get("baniprange.ip.disallowed"); - } else { - message = Message.get("tempbaniprange.ip.disallowed"); - message.set("expires", DateUtils.getDifferenceFormat(data.getExpires())); - } - - message.set("ip", event.getAddress().toString()); - message.set("reason", data.getReason()); - message.set("actor", data.getActor().getName()); - - event.setLoginResult(AsyncPlayerPreLoginEvent.Result.KICK_BANNED); - event.setKickMessage(message.toString()); - return; - } - - if (plugin.getIpBanStorage().isBanned(event.getAddress())) { - IpBanData data = plugin.getIpBanStorage().getBan(event.getAddress()); - - if (data.hasExpired()) { - try { - plugin.getIpBanStorage().unban(data, plugin.getPlayerStorage().getConsole()); - } catch (SQLException e) { - e.printStackTrace(); - } - - return; - } - - Message message; - - if (data.getExpires() == 0) { - message = Message.get("banip.ip.disallowed"); - } else { - message = Message.get("tempbanip.ip.disallowed"); - message.set("expires", DateUtils.getDifferenceFormat(data.getExpires())); - } - - message.set("ip", event.getAddress().toString()); - message.set("reason", data.getReason()); - message.set("actor", data.getActor().getName()); - - event.setLoginResult(AsyncPlayerPreLoginEvent.Result.KICK_BANNED); - event.setKickMessage(message.toString()); - handleJoinDeny(event.getAddress().toString(), data.getReason()); - return; - } - - if (plugin.getNameBanStorage().isBanned(event.getName())) { - NameBanData data = plugin.getNameBanStorage().getBan(event.getName()); - - if (data.hasExpired()) { - try { - plugin.getNameBanStorage().unban(data, plugin.getPlayerStorage().getConsole()); - } catch (SQLException e) { - e.printStackTrace(); - } - - return; - } - - Message message; - - if (data.getExpires() == 0) { - message = Message.get("banname.name.disallowed"); - } else { - message = Message.get("tempbanname.name.disallowed"); - message.set("expires", DateUtils.getDifferenceFormat(data.getExpires())); - } - - message.set("name", event.getName()); - message.set("reason", data.getReason()); - message.set("actor", data.getActor().getName()); - - event.setLoginResult(AsyncPlayerPreLoginEvent.Result.KICK_BANNED); - event.setKickMessage(message.toString()); - return; - } - - PlayerBanData data = plugin.getPlayerBanStorage().getBan(UUIDUtils.getUUID(event)); - - if (data != null && data.hasExpired()) { - try { - plugin.getPlayerBanStorage().unban(data, plugin.getPlayerStorage().getConsole()); - } catch (SQLException e) { - e.printStackTrace(); - } - - return; - } - - if (data == null) { - return; - } - - Message message; - - if (data.getExpires() == 0) { - message = Message.get("ban.player.disallowed"); - } else { - message = Message.get("tempban.player.disallowed"); - message.set("expires", DateUtils.getDifferenceFormat(data.getExpires())); - } - - message.set("player", data.getPlayer().getName()); - message.set("reason", data.getReason()); - message.set("actor", data.getActor().getName()); - - event.setLoginResult(AsyncPlayerPreLoginEvent.Result.KICK_BANNED); - event.setKickMessage(message.toString()); - handleJoinDeny(data.getPlayer(), data.getReason()); - } - - private void handleJoinDeny(PlayerData player, String reason) { - if (joinCache.getIfPresent(player.getName()) != null) return; - - joinCache.put(player.getName(), System.currentTimeMillis()); - Message message = Message.get("deniedNotify.player").set("player", player.getName()).set("reason", reason); - - CommandUtils.broadcast(message.toString(), "bm.notify.denied.player"); - } - - private void handleJoinDeny(String ip, String reason) { - if (joinCache.getIfPresent(ip) != null) return; - - joinCache.put(ip, System.currentTimeMillis()); - Message message = Message.get("deniedNotify.ip").set("ip", ip).set("reason", reason); - - CommandUtils.broadcast(message.toString(), "bm.notify.denied.ip"); - } - - @EventHandler(priority = EventPriority.MONITOR) - public void onJoin(AsyncPlayerPreLoginEvent event) { - PlayerData player = new PlayerData(UUIDUtils.getUUID(event), event.getName(), event.getAddress()); - - try { - plugin.getPlayerStorage().createOrUpdate(player); - } catch (SQLException e) { - e.printStackTrace(); - return; - } - - if (plugin.getConfiguration().isLogIpsEnabled()) plugin.getPlayerHistoryStorage().create(player); - - } - - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onJoin(final PlayerJoinEvent event) { - plugin.getServer().getScheduler().runTaskLaterAsynchronously(plugin, new Runnable() { - - public void run() { - // Handle quick disconnects - if (event.getPlayer() == null || !event.getPlayer().isOnline()) { - return; - } - - UUID id = UUIDUtils.getUUID(event.getPlayer()); - CloseableIterator notesItr = null; - - try { - notesItr = plugin.getPlayerNoteStorage().getNotes(id); - ArrayList notes = new ArrayList<>(); - String dateTimeFormat = Message.getString("notes.dateTimeFormat"); - FastDateFormat dateFormatter = FastDateFormat.getInstance(dateTimeFormat); - - while (notesItr != null && notesItr.hasNext()) { - PlayerNoteData note = notesItr.next(); - - Message noteMessage = Message.get("notes.note") - .set("player", note.getActor().getName()) - .set("message", note.getMessageColours()) - .set("created", dateFormatter.format(note.getCreated() * 1000L)); - - notes.add(noteMessage.toString()); - } - - if (notes.size() != 0) { - Message noteJoinMessage = Message.get("notes.joinAmount") - .set("amount", notes.size()) - .set("player", event.getPlayer().getName()); - - CommandUtils.broadcast(JSONCommandUtils - .notesAmount(event.getPlayer().getName(), noteJoinMessage), "bm.notify.notes.joinAmount"); - - String header = Message.get("notes.header") - .set("player", event.getPlayer().getName()) - .toString(); - - CommandUtils.broadcast(header, "bm.notify.notes.join"); - - for (String message : notes) { - CommandUtils.broadcast(message, "bm.notify.notes.join"); - } - - } - } catch (SQLException e) { - e.printStackTrace(); - } finally { - if (notesItr != null) notesItr.closeQuietly(); - } - - CloseableIterator warnings = null; - try { - warnings = plugin.getPlayerWarnStorage().getUnreadWarnings(id); - - while (warnings.hasNext()) { - PlayerWarnData warning = warnings.next(); - - Message.get("warn.player.warned") - .set("displayName", event.getPlayer().getDisplayName()) - .set("player", event.getPlayer().getName()) - .set("reason", warning.getReason()) - .set("actor", warning.getActor().getName()) - .sendTo(event.getPlayer()); - - warning.setRead(true); - // TODO Move to one update query to set all warnings for player to read - plugin.getPlayerWarnStorage().update(warning); - } - } catch (SQLException e) { - e.printStackTrace(); - } finally { - if (warnings != null) warnings.closeQuietly(); - } - - if (event.getPlayer().hasPermission("bm.notify.reports.open")) { - try { - ReportList openReports = plugin.getPlayerReportStorage().getReports(1, 1); - - if (openReports == null || openReports.getList().size() != 0) { - CommandUtils.sendReportList(openReports, event.getPlayer(), 1); - } - } catch (SQLException e) { - e.printStackTrace(); - } - } - - if (event.getPlayer().hasPermission("bm.notify.reports.assigned")) { - try { - ReportList assignedReports = plugin.getPlayerReportStorage().getReports(1, 2, id); - - if (assignedReports == null || assignedReports.getList().size() != 0) { - CommandUtils.sendReportList(assignedReports, event.getPlayer(), 1); - } - } catch (SQLException e) { - e.printStackTrace(); - } - } - - } - }, 20L); - } - - @EventHandler(priority = EventPriority.MONITOR) - public void onPlayerLogin(final PlayerLoginEvent event) { - if (event.getResult() != PlayerLoginEvent.Result.ALLOWED) { - return; - } - - if (plugin.getGeoIpConfig().isEnabled() && !event.getPlayer().hasPermission("bm.exempt.country")) { - try { - CountryResponse countryResponse = plugin.getGeoIpConfig().getCountryDatabase().country(event.getAddress()); - - if (!plugin.getGeoIpConfig().isCountryAllowed(countryResponse)) { - Message message = Message.get("deniedCountry") - .set("country", countryResponse.getCountry().getName()) - .set("countryIso", countryResponse.getCountry().getIsoCode()); - event.disallow(PlayerLoginEvent.Result.KICK_BANNED, message.toString()); - return; - } - - } catch (IOException | GeoIp2Exception e) { - } - } - - if (plugin.getConfiguration().getMaxOnlinePerIp() > 0) { - long ip = IPUtils.toLong(event.getAddress()); - int count = 0; - - for (Player player : plugin.getServer().getOnlinePlayers()) { - if (IPUtils.toLong(player.getAddress().getAddress()) == ip) count++; - } - - if (count >= plugin.getConfiguration().getMaxOnlinePerIp()) { - event.disallow(PlayerLoginEvent.Result.KICK_OTHER, Message.getString("deniedMaxIp")); - return; - } - - } - - if (plugin.getConfiguration().getMaxMultiaccountsRecently() > 0) { - long ip = IPUtils.toLong(event.getAddress()); - long timediff = plugin.getConfiguration().getMultiaccountsTime(); - - List multiaccountPlayers = plugin.getPlayerStorage().getDuplicatesInTime(ip, timediff); - - if (multiaccountPlayers.size() > plugin.getConfiguration().getMaxMultiaccountsRecently()) { - event.disallow(PlayerLoginEvent.Result.KICK_OTHER, Message.getString("deniedMultiaccounts")); - return; - } - - } - - if (!plugin.getConfiguration().isDuplicateIpCheckEnabled()) { - return; - } - - if (event.getPlayer().hasPermission("bm.exempt.alts")) return; - - plugin.getServer().getScheduler().runTaskLaterAsynchronously(plugin, new Runnable() { - - public void run() { - final long ip = IPUtils.toLong(event.getAddress()); - final UUID uuid = UUIDUtils.getUUID(event.getPlayer()); - List duplicates = plugin.getPlayerBanStorage().getDuplicates(ip); - - if (duplicates.isEmpty()) { - return; - } - - if (plugin.getConfiguration().isDenyAlts()) { - denyAlts(duplicates, uuid); - } - - if (plugin.getConfiguration().isPunishAlts()) { - try { - punishAlts(duplicates, uuid); - } catch (SQLException e) { - e.printStackTrace(); - } - } - - StringBuilder sb = new StringBuilder(); - - for (PlayerData player : duplicates) { - if (player.getUUID().equals(uuid)) { - continue; - } - - sb.append(player.getName()); - sb.append(", "); - } - - if (sb.length() == 0) return; - if (sb.length() >= 2) sb.setLength(sb.length() - 2); - - Message message = Message.get("duplicateIP"); - message.set("player", event.getPlayer().getName()); - message.set("players", sb.toString()); - - CommandUtils.broadcast(message.toString(), "bm.notify.duplicateips"); - } - }, 20L); - } - - private void denyAlts(List duplicates, final UUID uuid) { - if (plugin.getPlayerBanStorage().isBanned(uuid)) return; - - for (final PlayerData player : duplicates) { - if (player.getUUID().equals(uuid)) continue; - - final PlayerBanData ban = plugin.getPlayerBanStorage().getBan(player.getUUID()); - - if (ban == null) continue; - if (ban.hasExpired()) continue; - - plugin.getServer().getScheduler().runTask(plugin, new Runnable() { - - @Override - public void run() { - Player bukkitPlayer = CommandUtils.getPlayer(uuid); - - Message kickMessage = Message.get("denyalts.player.disallowed") - .set("player", player.getName()) - .set("reason", ban.getReason()) - .set("actor", ban.getActor().getName()); - - bukkitPlayer.kickPlayer(kickMessage.toString()); - } - }); - } - } - - private void punishAlts(List duplicates, UUID uuid) throws SQLException { - - if (!plugin.getPlayerBanStorage().isBanned(uuid)) { - // Auto ban - for (PlayerData player : duplicates) { - if (player.getUUID().equals(uuid)) { - continue; - } - - PlayerBanData ban = plugin.getPlayerBanStorage().getBan(player.getUUID()); - - if (ban == null) continue; - if (ban.hasExpired()) continue; - - final PlayerBanData newBan = new PlayerBanData(plugin.getPlayerStorage().queryForId(UUIDUtils.toBytes(uuid)) - , plugin.getPlayerStorage().getConsole() - , ban.getReason() - , ban.getExpires()); - - plugin.getPlayerBanStorage().ban(newBan, false); - - plugin.getServer().getScheduler().runTask(plugin, new Runnable() { - - @Override - public void run() { - Player bukkitPlayer = CommandUtils.getPlayer(newBan.getPlayer().getUUID()); - - Message kickMessage = Message.get("ban.player.kick") - .set("displayName", bukkitPlayer.getDisplayName()) - .set("player", newBan.getPlayer().getName()) - .set("reason", newBan.getReason()) - .set("actor", newBan.getActor().getName()); - - bukkitPlayer.kickPlayer(kickMessage.toString()); - } - }); - } - } else if (!plugin.getPlayerMuteStorage().isMuted(uuid)) { - // Auto mute - for (PlayerData player : duplicates) { - if (player.getUUID().equals(uuid)) { - continue; - } - - PlayerMuteData mute = plugin.getPlayerMuteStorage().getMute(player.getUUID()); - - if (mute == null) continue; - if (mute.hasExpired()) continue; - - PlayerMuteData newMute = new PlayerMuteData(plugin.getPlayerStorage().queryForId(UUIDUtils.toBytes(uuid)) - , plugin.getPlayerStorage().getConsole() - , mute.getReason() - , mute.isSoft() - , mute.getExpires()); - - plugin.getPlayerMuteStorage().mute(newMute, false); - } - } - } -} \ No newline at end of file diff --git a/src/main/java/me/confuser/banmanager/listeners/LeaveListener.java b/src/main/java/me/confuser/banmanager/listeners/LeaveListener.java deleted file mode 100644 index e175ee9c4..000000000 --- a/src/main/java/me/confuser/banmanager/listeners/LeaveListener.java +++ /dev/null @@ -1,43 +0,0 @@ -package me.confuser.banmanager.listeners; - -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.PlayerHistoryData; -import me.confuser.banmanager.util.UUIDUtils; -import me.confuser.bukkitutil.listeners.Listeners; -import org.bukkit.event.EventHandler; -import org.bukkit.event.player.PlayerQuitEvent; - -import java.sql.SQLException; -import java.util.UUID; - -public class LeaveListener extends Listeners { - - @EventHandler - public void onLeave(PlayerQuitEvent event) { - UUID id = UUIDUtils.getUUID(event.getPlayer()); - - if (plugin.getConfiguration().isLogIpsEnabled()) { - final PlayerHistoryData data = plugin.getPlayerHistoryStorage().remove(id); - - if (data == null) { - plugin.getLogger().warning("Could not find " + event.getPlayer().getName() + " session history, perhaps they " + - "disconnected too quickly?"); - return; - } - - data.setLeave(System.currentTimeMillis() / 1000L); - - plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() { - - @Override - public void run() { - try { - plugin.getPlayerHistoryStorage().create(data); - } catch (SQLException e) { - e.printStackTrace(); - } - } - }); - } - } -} diff --git a/src/main/java/me/confuser/banmanager/listeners/MuteListener.java b/src/main/java/me/confuser/banmanager/listeners/MuteListener.java deleted file mode 100644 index 7e2e13e1e..000000000 --- a/src/main/java/me/confuser/banmanager/listeners/MuteListener.java +++ /dev/null @@ -1,106 +0,0 @@ -package me.confuser.banmanager.listeners; - -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.IpMuteData; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.data.PlayerMuteData; -import me.confuser.banmanager.events.IpMutedEvent; -import me.confuser.banmanager.events.PlayerMutedEvent; -import me.confuser.banmanager.util.CommandUtils; -import me.confuser.banmanager.util.DateUtils; -import me.confuser.banmanager.util.IPUtils; -import me.confuser.bukkitutil.Message; -import me.confuser.bukkitutil.listeners.Listeners; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; - -import java.util.List; - -public class MuteListener extends Listeners { - - @EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR) - public void notifyOnMute(PlayerMutedEvent event) { - PlayerMuteData mute = event.getMute(); - - String broadcastPermission; - Message message; - - if (mute.getExpires() == 0) { - broadcastPermission = "bm.notify.mute"; - message = Message.get("mute.notify"); - } else { - broadcastPermission = "bm.notify.tempmute"; - message = Message.get("tempmute.notify"); - message.set("expires", DateUtils.getDifferenceFormat(mute.getExpires())); - } - - message.set("player", mute.getPlayer().getName()) - .set("playerId", mute.getPlayer().getUUID().toString()) - .set("actor", mute.getActor().getName()) - .set("reason", mute.getReason()); - - if (!event.isSilent()) { - CommandUtils.broadcast(message.toString(), broadcastPermission); - } - - // Check if the sender is online and does not have the - // broadcastPermission - Player player; - if ((player = CommandUtils.getPlayer(mute.getActor().getUUID())) == null) { - return; - } - - if (event.isSilent() || !player.hasPermission(broadcastPermission)) { - message.sendTo(player); - } - } - - @EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR) - public void notifyOnMute(IpMutedEvent event) { - IpMuteData mute = event.getMute(); - - String broadcastPermission; - Message message; - - if (mute.getExpires() == 0) { - broadcastPermission = "bm.notify.muteip"; - message = Message.get("muteip.notify"); - } else { - broadcastPermission = "bm.notify.tempmuteip"; - message = Message.get("tempmuteip.notify"); - message.set("expires", DateUtils.getDifferenceFormat(mute.getExpires())); - } - - List players = plugin.getPlayerStorage().getDuplicates(mute.getIp()); - StringBuilder playerNames = new StringBuilder(); - - for (PlayerData player : players) { - playerNames.append(player.getName()); - playerNames.append(", "); - } - - if (playerNames.length() == 0) return; - if (playerNames.length() >= 2) playerNames.setLength(playerNames.length() - 2); - - message.set("ip", IPUtils.toString(mute.getIp())) - .set("actor", mute.getActor().getName()) - .set("reason", mute.getReason()) - .set("players", playerNames.toString()); - - if (!event.isSilent()) { - CommandUtils.broadcast(message.toString(), broadcastPermission); - } - - // Check if the sender is online and does not have the - // broadcastPermission - Player player; - if ((player = CommandUtils.getPlayer(mute.getActor().getUUID())) == null) { - return; - } - - if (event.isSilent() || !player.hasPermission(broadcastPermission)) { - message.sendTo(player); - } - } -} diff --git a/src/main/java/me/confuser/banmanager/listeners/NoteListener.java b/src/main/java/me/confuser/banmanager/listeners/NoteListener.java deleted file mode 100644 index af8894922..000000000 --- a/src/main/java/me/confuser/banmanager/listeners/NoteListener.java +++ /dev/null @@ -1,41 +0,0 @@ -package me.confuser.banmanager.listeners; - -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.PlayerNoteData; -import me.confuser.banmanager.events.PlayerNoteCreatedEvent; -import me.confuser.banmanager.util.CommandUtils; -import me.confuser.bukkitutil.Message; -import me.confuser.bukkitutil.listeners.Listeners; -import org.bukkit.ChatColor; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; - -public class NoteListener extends Listeners { - - @EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR) - public void notifyOnNote(PlayerNoteCreatedEvent event) { - PlayerNoteData note = event.getNote(); - - Message message = Message.get("notes.notify"); - - message.set("player", note.getPlayer().getName()) - .set("playerId", note.getPlayer().getUUID().toString()) - .set("actor", note.getActor().getName()) - .set("message", note.getMessageColours()); - - CommandUtils.broadcast(message.toString(), "bm.notify.notes"); - - // Check if the sender is online and does not have the - // broadcastPermission - Player player; - if ((player = CommandUtils.getPlayer(note.getActor().getUUID())) == null) { - return; - } - - if (!player.hasPermission("bm.notify.notes")) { - message.sendTo(player); - } - } - -} diff --git a/src/main/java/me/confuser/banmanager/listeners/ReportListener.java b/src/main/java/me/confuser/banmanager/listeners/ReportListener.java deleted file mode 100644 index 11917964e..000000000 --- a/src/main/java/me/confuser/banmanager/listeners/ReportListener.java +++ /dev/null @@ -1,97 +0,0 @@ -package me.confuser.banmanager.listeners; - -import com.j256.ormlite.stmt.DeleteBuilder; -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.data.PlayerReportData; -import me.confuser.banmanager.data.PlayerReportLocationData; -import me.confuser.banmanager.events.PlayerReportDeletedEvent; -import me.confuser.banmanager.events.PlayerReportedEvent; -import me.confuser.banmanager.util.CommandUtils; -import me.confuser.banmanager.util.UUIDUtils; -import me.confuser.bukkitutil.Message; -import me.confuser.bukkitutil.listeners.Listeners; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; - -import java.sql.SQLException; - -public class ReportListener extends Listeners { - - @EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR) - public void notifyOnReport(PlayerReportedEvent event) { - PlayerReportData report = event.getReport(); - - Message message = Message.get("report.notify"); - - message.set("player", report.getPlayer().getName()) - .set("playerId", report.getPlayer().getUUID().toString()) - .set("actor", report.getActor().getName()) - .set("reason", report.getReason()) - .set("id", report.getId()); - - CommandUtils.broadcast(message.toString(), "bm.notify.report"); - - // Check if the sender is online and does not have the - // broadcastPermission - Player player; - if ((player = CommandUtils.getPlayer(report.getActor().getUUID())) == null) { - return; - } - - if (!player.hasPermission("bm.notify.report")) { - message.sendTo(player); - } - } - - @EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR) - public void storeLocation(PlayerReportedEvent event) { - PlayerReportData report = event.getReport(); - - Player player = CommandUtils.getPlayer(report.getPlayer().getUUID()); - Player actor = CommandUtils.getPlayer(report.getActor().getUUID()); - - try { - createLocation(report, player); - } catch (SQLException e) { - e.printStackTrace(); - } - - try { - createLocation(report, actor); - } catch (SQLException e) { - e.printStackTrace(); - } - } - - private void createLocation(PlayerReportData report, Player player) throws SQLException { - if (player == null) return; - - PlayerData playerData = plugin.getPlayerStorage().queryForId(UUIDUtils.toBytes(player)); - plugin.getPlayerReportLocationStorage() - .create(new PlayerReportLocationData(report, playerData, player.getLocation())); - } - - @EventHandler - public void deleteReferences(PlayerReportDeletedEvent event) { - int id = event.getReport().getId(); - - - try { - DeleteBuilder location = plugin.getPlayerReportLocationStorage().deleteBuilder(); - location.where().eq("report_id", id); - location.delete(); - - DeleteBuilder commands = plugin.getPlayerReportCommandStorage().deleteBuilder(); - commands.where().eq("report_id", id); - commands.delete(); - - DeleteBuilder comments = plugin.getPlayerReportCommentStorage().deleteBuilder(); - comments.where().eq("report_id", id); - comments.delete(); - } catch (SQLException e) { - e.printStackTrace(); - } - } -} diff --git a/src/main/java/me/confuser/banmanager/runnables/BanSync.java b/src/main/java/me/confuser/banmanager/runnables/BanSync.java deleted file mode 100644 index 60a1e130c..000000000 --- a/src/main/java/me/confuser/banmanager/runnables/BanSync.java +++ /dev/null @@ -1,100 +0,0 @@ -package me.confuser.banmanager.runnables; - -import com.j256.ormlite.dao.CloseableIterator; -import me.confuser.banmanager.data.PlayerBanData; -import me.confuser.banmanager.data.PlayerBanRecord; -import me.confuser.banmanager.storage.PlayerBanStorage; -import me.confuser.banmanager.util.CommandUtils; -import me.confuser.bukkitutil.Message; -import org.bukkit.entity.Player; - -import java.sql.SQLException; - -public class BanSync extends BmRunnable { - - private PlayerBanStorage banStorage = plugin.getPlayerBanStorage(); - - public BanSync() { - super("playerBans"); - } - - @Override - public void run() { - newBans(); - newUnbans(); - } - - private void newBans() { - - CloseableIterator itr = null; - try { - itr = banStorage.findBans(lastChecked); - - while (itr.hasNext()) { - final PlayerBanData ban = itr.next(); - - if (banStorage.isBanned(ban.getPlayer().getUUID())) { - if (ban.getUpdated() < lastChecked) continue; - - if (ban.equalsBan(banStorage.getBan(ban.getPlayer().getUUID()))) { - continue; - } - } - - banStorage.addBan(ban); - - plugin.getServer().getScheduler().runTask(plugin, new Runnable() { - - @Override - public void run() { - Player bukkitPlayer = CommandUtils.getPlayer(ban.getPlayer().getUUID()); - - if (bukkitPlayer == null) return; - - Message kickMessage = Message.get("ban.player.kick") - .set("displayName", bukkitPlayer.getDisplayName()) - .set("player", ban.getPlayer().getName()) - .set("reason", ban.getReason()) - .set("actor", ban.getActor().getName()); - - bukkitPlayer.kickPlayer(kickMessage.toString()); - } - }); - - } - } catch (SQLException e) { - e.printStackTrace(); - } finally { - if (itr != null) itr.closeQuietly(); - } - - } - - private void newUnbans() { - - CloseableIterator itr = null; - try { - itr = plugin.getPlayerBanRecordStorage().findUnbans(lastChecked); - - while (itr.hasNext()) { - final PlayerBanRecord ban = itr.next(); - - if (!banStorage.isBanned(ban.getPlayer().getUUID())) { - continue; - } - - if (!ban.equalsBan(banStorage.getBan(ban.getPlayer().getUUID()))) { - continue; - } - - banStorage.removeBan(ban.getPlayer().getUUID()); - - } - } catch (SQLException e) { - e.printStackTrace(); - } finally { - if (itr != null) itr.closeQuietly(); - } - - } -} diff --git a/src/main/java/me/confuser/banmanager/runnables/GlobalBanSync.java b/src/main/java/me/confuser/banmanager/runnables/GlobalBanSync.java deleted file mode 100644 index 74a48cf44..000000000 --- a/src/main/java/me/confuser/banmanager/runnables/GlobalBanSync.java +++ /dev/null @@ -1,115 +0,0 @@ -package me.confuser.banmanager.runnables; - -import com.j256.ormlite.dao.CloseableIterator; -import me.confuser.banmanager.data.PlayerBanData; -import me.confuser.banmanager.data.global.GlobalPlayerBanData; -import me.confuser.banmanager.data.global.GlobalPlayerBanRecordData; -import me.confuser.banmanager.storage.PlayerBanStorage; -import me.confuser.banmanager.storage.global.GlobalPlayerBanRecordStorage; -import me.confuser.banmanager.storage.global.GlobalPlayerBanStorage; -import me.confuser.banmanager.util.CommandUtils; -import me.confuser.banmanager.util.DateUtils; -import me.confuser.bukkitutil.Message; -import org.bukkit.entity.Player; - -import java.sql.SQLException; - -public class GlobalBanSync extends BmRunnable { - - private GlobalPlayerBanStorage banStorage = plugin.getGlobalPlayerBanStorage(); - private PlayerBanStorage localBanStorage = plugin.getPlayerBanStorage(); - private GlobalPlayerBanRecordStorage recordStorage = plugin.getGlobalPlayerBanRecordStorage(); - - public GlobalBanSync() { - super("externalPlayerBans"); - } - - @Override - public void run() { - newBans(); - newUnbans(); - } - - - private void newBans() { - - CloseableIterator itr = null; - try { - itr = banStorage.findBans(lastChecked); - - while (itr.hasNext()) { - GlobalPlayerBanData ban = itr.next(); - - final PlayerBanData localBan = ban.toLocal(); - - if (localBanStorage.retrieveBan(ban.getUUID()) != null) { - // Global ban overrides local - localBanStorage - .unban(localBan, ban.getActor()); - } else if (localBanStorage.isBanned(ban.getUUID())) { - localBanStorage.removeBan(ban.getUUID()); - } - - localBanStorage.ban(localBan, false); - - plugin.getServer().getScheduler().runTask(plugin, new Runnable() { - - @Override - public void run() { - // TODO move into a listener - Player bukkitPlayer = CommandUtils.getPlayer(localBan.getPlayer().getUUID()); - - if (bukkitPlayer == null) return; - - Message kickMessage; - - if (localBan.getExpires() == 0) { - kickMessage = Message.get("ban.player.kick"); - } else { - kickMessage = Message.get("tempban.player.kick"); - kickMessage.set("expires", DateUtils.getDifferenceFormat(localBan.getExpires())); - } - - kickMessage - .set("displayName", bukkitPlayer.getDisplayName()) - .set("player", localBan.getPlayer().getName()) - .set("reason", localBan.getReason()) - .set("actor", localBan.getActor().getName()); - - bukkitPlayer.kickPlayer(kickMessage.toString()); - } - }); - - } - } catch (SQLException e) { - e.printStackTrace(); - } finally { - if (itr != null) itr.closeQuietly(); - } - - } - - private void newUnbans() { - - CloseableIterator itr = null; - try { - itr = recordStorage.findUnbans(lastChecked); - - while (itr.hasNext()) { - GlobalPlayerBanRecordData record = itr.next(); - - if (!localBanStorage.isBanned(record.getUUID())) { - continue; - } - - localBanStorage.unban(localBanStorage.getBan(record.getUUID()), record.getActor()); - - } - } catch (SQLException e) { - e.printStackTrace(); - } finally { - if (itr != null) itr.closeQuietly(); - } - - } -} diff --git a/src/main/java/me/confuser/banmanager/runnables/GlobalIpSync.java b/src/main/java/me/confuser/banmanager/runnables/GlobalIpSync.java deleted file mode 100644 index 9934d46f3..000000000 --- a/src/main/java/me/confuser/banmanager/runnables/GlobalIpSync.java +++ /dev/null @@ -1,101 +0,0 @@ -package me.confuser.banmanager.runnables; - -import com.j256.ormlite.dao.CloseableIterator; -import me.confuser.banmanager.data.IpBanData; -import me.confuser.banmanager.data.global.GlobalIpBanData; -import me.confuser.banmanager.data.global.GlobalIpBanRecordData; -import me.confuser.banmanager.storage.IpBanStorage; -import me.confuser.banmanager.storage.global.GlobalIpBanRecordStorage; -import me.confuser.banmanager.storage.global.GlobalIpBanStorage; -import me.confuser.banmanager.util.IPUtils; -import me.confuser.bukkitutil.Message; -import org.bukkit.entity.Player; - -import java.sql.SQLException; - -public class GlobalIpSync extends BmRunnable { - - private GlobalIpBanStorage banStorage = plugin.getGlobalIpBanStorage(); - private IpBanStorage localBanStorage = plugin.getIpBanStorage(); - private GlobalIpBanRecordStorage recordStorage = plugin.getGlobalIpBanRecordStorage(); - - public GlobalIpSync() { - super("externalIpBans"); - } - - @Override - public void run() { - newBans(); - newUnbans(); - } - - - private void newBans() { - - CloseableIterator itr = null; - try { - itr = banStorage.findBans(lastChecked); - - while (itr.hasNext()) { - GlobalIpBanData ban = itr.next(); - - final IpBanData localBan = ban.toLocal(); - - if (localBanStorage.retrieveBan(ban.getIp()) != null) { - // Global ban overrides local - localBanStorage - .unban(localBan, ban.getActor()); - } else if (localBanStorage.isBanned(ban.getIp())) { - localBanStorage.removeBan(ban.getIp()); - } - - localBanStorage.ban(localBan, false); - - plugin.getServer().getScheduler().runTask(plugin, new Runnable() { - - @Override - public void run() { - Message kickMessage = Message.get("banip.ip.kick").set("reason", localBan.getReason()) - .set("actor", localBan.getActor().getName()); - - for (Player onlinePlayer : plugin.getServer().getOnlinePlayers()) { - if (IPUtils.toLong(onlinePlayer.getAddress().getAddress()) == localBan.getIp()) { - onlinePlayer.kickPlayer(kickMessage.toString()); - } - } - } - }); - - } - } catch (SQLException e) { - e.printStackTrace(); - } finally { - if (itr != null) itr.closeQuietly(); - } - - } - - private void newUnbans() { - - CloseableIterator itr = null; - try { - itr = recordStorage.findUnbans(lastChecked); - - while (itr.hasNext()) { - GlobalIpBanRecordData record = itr.next(); - - if (!localBanStorage.isBanned(record.getIp())) { - continue; - } - - localBanStorage.unban(localBanStorage.getBan(record.getIp()), record.getActor()); - - } - } catch (SQLException e) { - e.printStackTrace(); - } finally { - if (itr != null) itr.closeQuietly(); - } - - } -} diff --git a/src/main/java/me/confuser/banmanager/runnables/GlobalMuteSync.java b/src/main/java/me/confuser/banmanager/runnables/GlobalMuteSync.java deleted file mode 100644 index 1e95adc78..000000000 --- a/src/main/java/me/confuser/banmanager/runnables/GlobalMuteSync.java +++ /dev/null @@ -1,81 +0,0 @@ -package me.confuser.banmanager.runnables; - -import com.j256.ormlite.dao.CloseableIterator; -import me.confuser.banmanager.data.PlayerMuteData; -import me.confuser.banmanager.data.global.GlobalPlayerMuteData; -import me.confuser.banmanager.data.global.GlobalPlayerMuteRecordData; -import me.confuser.banmanager.storage.PlayerMuteStorage; -import me.confuser.banmanager.storage.global.GlobalPlayerMuteRecordStorage; -import me.confuser.banmanager.storage.global.GlobalPlayerMuteStorage; - -import java.sql.SQLException; - -public class GlobalMuteSync extends BmRunnable { - - private GlobalPlayerMuteStorage muteStorage = plugin.getGlobalPlayerMuteStorage(); - private PlayerMuteStorage localMuteStorage = plugin.getPlayerMuteStorage(); - private GlobalPlayerMuteRecordStorage recordStorage = plugin.getGlobalPlayerMuteRecordStorage(); - - public GlobalMuteSync() { - super("externalPlayerMutes"); - } - - @Override - public void run() { - newUnmutes(); - newMutes(); - } - - private void newMutes() { - - CloseableIterator itr = null; - try { - itr = muteStorage.findMutes(lastChecked); - - while (itr.hasNext()) { - GlobalPlayerMuteData mute = itr.next(); - - final PlayerMuteData localMute = mute.toLocal(); - - if (localMuteStorage.retrieveMute(mute.getUUID()) != null) { - // Global mute overrides local - localMuteStorage - .unmute(localMute, mute.getActor()); - } else if (localMuteStorage.isMuted(mute.getUUID())) { - localMuteStorage.removeMute(mute.getUUID()); - } - - localMuteStorage.mute(localMute, false); - - } - } catch (SQLException e) { - e.printStackTrace(); - } finally { - if (itr != null) itr.closeQuietly(); - } - - } - - private void newUnmutes() { - - CloseableIterator itr = null; - try { - itr = recordStorage.findUnmutes(lastChecked); - - while (itr.hasNext()) { - GlobalPlayerMuteRecordData record = itr.next(); - - if (!localMuteStorage.isMuted(record.getUUID())) { - continue; - } - - localMuteStorage.unmute(localMuteStorage.getMute(record.getUUID()), record.getActor()); - - } - } catch (SQLException e) { - e.printStackTrace(); - } finally { - if (itr != null) itr.closeQuietly(); - } - } -} diff --git a/src/main/java/me/confuser/banmanager/runnables/NameSync.java b/src/main/java/me/confuser/banmanager/runnables/NameSync.java deleted file mode 100644 index a7aef427c..000000000 --- a/src/main/java/me/confuser/banmanager/runnables/NameSync.java +++ /dev/null @@ -1,95 +0,0 @@ -package me.confuser.banmanager.runnables; - -import com.j256.ormlite.dao.CloseableIterator; -import me.confuser.banmanager.data.NameBanData; -import me.confuser.banmanager.data.NameBanRecord; -import me.confuser.banmanager.storage.NameBanStorage; -import me.confuser.bukkitutil.Message; -import org.bukkit.entity.Player; - -import java.sql.SQLException; - -public class NameSync extends BmRunnable { - - private NameBanStorage banStorage = plugin.getNameBanStorage(); - - public NameSync() { - super("nameBans"); - } - - @Override - public void run() { - newBans(); - newUnbans(); - } - - private void newBans() { - - CloseableIterator itr = null; - try { - itr = banStorage.findBans(lastChecked); - - while (itr.hasNext()) { - final NameBanData ban = itr.next(); - - if (banStorage.isBanned(ban.getName()) && ban.getUpdated() < lastChecked) { - continue; - } - - banStorage.addBan(ban); - - plugin.getServer().getScheduler().runTask(plugin, new Runnable() { - - @Override - public void run() { - Player bukkitPlayer = plugin.getServer().getPlayer(ban.getName()); - - if (bukkitPlayer == null) return; - - Message kickMessage = Message.get("ban.player.kick") - .set("displayName", bukkitPlayer.getDisplayName()) - .set("name", ban.getName()) - .set("reason", ban.getReason()) - .set("actor", ban.getActor().getName()); - - bukkitPlayer.kickPlayer(kickMessage.toString()); - } - }); - - } - } catch (SQLException e) { - e.printStackTrace(); - } finally { - if (itr != null) itr.closeQuietly(); - } - - } - - private void newUnbans() { - - CloseableIterator itr = null; - try { - itr = plugin.getNameBanRecordStorage().findUnbans(lastChecked); - - while (itr.hasNext()) { - final NameBanRecord ban = itr.next(); - - if (!banStorage.isBanned(ban.getName())) { - continue; - } - - if (!ban.equalsBan(banStorage.getBan(ban.getName()))) { - continue; - } - - banStorage.removeBan(ban.getName()); - - } - } catch (SQLException e) { - e.printStackTrace(); - } finally { - if (itr != null) itr.closeQuietly(); - } - - } -} diff --git a/src/main/java/me/confuser/banmanager/runnables/SaveLastChecked.java b/src/main/java/me/confuser/banmanager/runnables/SaveLastChecked.java deleted file mode 100644 index e0e84ea8d..000000000 --- a/src/main/java/me/confuser/banmanager/runnables/SaveLastChecked.java +++ /dev/null @@ -1,14 +0,0 @@ -package me.confuser.banmanager.runnables; - -import me.confuser.banmanager.BanManager; - -public class SaveLastChecked implements Runnable { - - private BanManager plugin = BanManager.getPlugin(); - - @Override - public void run() { - plugin.getSchedulesConfig().save(); - } - -} diff --git a/src/main/java/me/confuser/banmanager/runnables/WarningSync.java b/src/main/java/me/confuser/banmanager/runnables/WarningSync.java deleted file mode 100644 index 226aa1b10..000000000 --- a/src/main/java/me/confuser/banmanager/runnables/WarningSync.java +++ /dev/null @@ -1,78 +0,0 @@ -package me.confuser.banmanager.runnables; - -import com.j256.ormlite.dao.CloseableIterator; -import me.confuser.banmanager.data.PlayerWarnData; -import me.confuser.banmanager.storage.PlayerWarnStorage; -import me.confuser.banmanager.util.CommandUtils; -import me.confuser.bukkitutil.Message; -import org.bukkit.entity.Player; - -import java.sql.SQLException; - -public class WarningSync extends BmRunnable { - - private PlayerWarnStorage warnStorage = plugin.getPlayerWarnStorage(); - - public WarningSync() { - super("playerWarnings"); - } - - @Override - public void run() { - newWarnings(); - } - - private void newWarnings() { - - CloseableIterator itr = null; - try { - itr = warnStorage.findWarnings(lastChecked); - - while (itr.hasNext()) { - final PlayerWarnData warn = itr.next(); - - if (warn.isRead()) { - continue; - } - - plugin.getServer().getScheduler().runTask(plugin, new Runnable() { - - @Override - public void run() { - Player bukkitPlayer = CommandUtils.getPlayer(warn.getPlayer().getUUID()); - - if (bukkitPlayer == null) return; - - Message.get("warn.player.warned") - .set("displayName", bukkitPlayer.getPlayer().getDisplayName()) - .set("player", warn.getPlayer().getName()) - .set("reason", warn.getReason()) - .set("actor", warn.getActor().getName()) - .sendTo(bukkitPlayer); - - warn.setRead(true); - - plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() { - @Override - public void run() { - try { - plugin.getPlayerWarnStorage().update(warn); - } catch (SQLException e) { - e.printStackTrace(); - } - } - }); - - } - }); - - } - } catch (SQLException e) { - e.printStackTrace(); - } finally { - if (itr != null) itr.closeQuietly(); - } - - } - -} diff --git a/src/main/java/me/confuser/banmanager/storage/ActivityStorage.java b/src/main/java/me/confuser/banmanager/storage/ActivityStorage.java deleted file mode 100644 index 1ff8f2ae4..000000000 --- a/src/main/java/me/confuser/banmanager/storage/ActivityStorage.java +++ /dev/null @@ -1,306 +0,0 @@ -package me.confuser.banmanager.storage; - -import com.j256.ormlite.field.SqlType; -import com.j256.ormlite.stmt.StatementBuilder; -import com.j256.ormlite.support.CompiledStatement; -import com.j256.ormlite.support.ConnectionSource; -import com.j256.ormlite.support.DatabaseConnection; -import com.j256.ormlite.support.DatabaseResults; -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.PlayerData; - -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class ActivityStorage { - - private BanManager plugin = BanManager.getPlugin(); - // Queries - final String sinceSql = "SELECT type, name, actor, created FROM" + - " ( SELECT 'Ban' type, p.name AS name, actor.name AS actor, created" + - " FROM " + plugin.getPlayerBanStorage().getTableConfig().getTableName() + - " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig().getTableName() + " p ON player_id = p.id" + - " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig() - .getTableName() + " actor ON actor_id = actor.id" + - " WHERE created >= ?" + - - " UNION ALL" + - - " SELECT 'Ban' type, p.name AS name, actor.name AS actor, pastCreated as created" + - " FROM " + plugin.getPlayerBanRecordStorage().getTableConfig().getTableName() + - " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig().getTableName() + " p ON player_id = p.id" + - " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig() - .getTableName() + " actor ON actor_id = actor.id" + - " WHERE pastCreated >= ?" + - - " UNION ALL" + - - " SELECT 'Unban' type, p.name AS name, actor.name AS actor, created" + - " FROM " + plugin.getPlayerBanRecordStorage().getTableConfig().getTableName() + - " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig().getTableName() + " p ON player_id = p.id" + - " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig() - .getTableName() + " actor ON actor_id = actor.id" + - " WHERE created >= ?" + - - " UNION ALL" + - - " SELECT 'Warning' type, p.name AS name, actor.name AS actor, created" + - " FROM " + plugin.getPlayerWarnStorage().getTableConfig().getTableName() + - " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig().getTableName() + " p ON player_id = p.id" + - " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig() - .getTableName() + " actor ON actor_id = actor.id" + - " WHERE created >= ?" + - - " UNION ALL" + - - " SELECT 'Mute' type, p.name AS name, actor.name AS actor, created" + - " FROM " + plugin.getPlayerMuteStorage().getTableConfig().getTableName() + - " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig().getTableName() + " p ON player_id = p.id" + - " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig() - .getTableName() + " actor ON actor_id = actor.id" + - " WHERE created >= ?" + - - " UNION ALL" + - - " SELECT 'Mute' type, p.name AS name, actor.name AS actor, pastCreated as created" + - " FROM " + plugin.getPlayerMuteRecordStorage().getTableConfig().getTableName() + - " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig().getTableName() + " p ON player_id = p.id" + - " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig() - .getTableName() + " actor ON actor_id = actor.id" + - " WHERE pastCreated >= ?" + - - " UNION ALL" + - - " SELECT 'Unmute' type, p.name AS name, actor.name AS actor, created" + - " FROM " + plugin.getPlayerMuteRecordStorage().getTableConfig().getTableName() + - " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig().getTableName() + " p ON player_id = p.id" + - " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig() - .getTableName() + " actor ON actor_id = actor.id" + - " WHERE created >= ?" + - - " UNION ALL" + - - " SELECT 'Note' type, p.name AS name, actor.name AS actor, created" + - " FROM " + plugin.getPlayerNoteStorage().getTableConfig().getTableName() + - " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig().getTableName() + " p ON player_id = p.id" + - " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig() - .getTableName() + " actor ON actor_id = actor.id" + - " WHERE created >= ?" + - - " UNION ALL" + - - " SELECT 'Ban' type, INET_NTOA(ib.ip) AS name, actor.name AS actor, created" + - " FROM " + plugin.getIpBanStorage().getTableConfig().getTableName() + " ib" + - " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig() - .getTableName() + " actor ON actor_id = actor.id" + - " WHERE created >= ?" + - - " UNION ALL" + - - " SELECT 'Ban' type, INET_NTOA(ibr.ip) AS name, actor.name AS actor, pastCreated AS created" + - " FROM " + plugin.getIpBanRecordStorage().getTableConfig().getTableName() + " ibr" + - " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig() - .getTableName() + " actor ON actor_id = actor.id" + - " WHERE pastCreated >= ?" + - - " UNION ALL" + - - " SELECT 'Unban' type, INET_NTOA(ibr.ip) AS name, actor.name AS actor, created" + - " FROM " + plugin.getIpBanRecordStorage().getTableConfig().getTableName() + " ibr" + - " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig() - .getTableName() + " actor ON actor_id = actor.id" + - " WHERE created >= ?" + - - " UNION ALL" + - - " SELECT 'Ban' type, CONCAT_WS(' - ', INET_NTOA(fromIp), INET_NTOA(toIp)) AS name, actor.name AS actor, created" + - " FROM " + plugin.getIpRangeBanStorage().getTableConfig().getTableName() + - " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig() - .getTableName() + " actor ON actor_id = actor.id" + - " WHERE created >= ?" + - - " UNION ALL" + - - " SELECT 'Ban' type, CONCAT_WS(' - ', INET_NTOA(fromIp), INET_NTOA(toIp)) AS name, actor.name AS actor, pastCreated AS created" + - " FROM " + plugin.getIpRangeBanRecordStorage().getTableConfig().getTableName() + - " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig() - .getTableName() + " actor ON actor_id = actor.id" + - " WHERE pastCreated >= ?" + - - " UNION ALL" + - - " SELECT 'Unban' type, CONCAT_WS(' - ', INET_NTOA(fromIp), INET_NTOA(toIp)) AS name, actor.name AS actor, created" + - " FROM " + plugin.getIpRangeBanRecordStorage().getTableConfig().getTableName() + - " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig() - .getTableName() + " actor ON actor_id = actor.id" + - " WHERE created >= ?" + - - " ) subquery" + - " ORDER BY created DESC, FIELD(type, 'Ban', 'Unban', 'Warning', 'Mute', 'Unmute', 'Note')"; - private final String sincePlayerSql = "SELECT type, name, created FROM" + - " ( SELECT 'Ban' type, p.name AS name, created" + - " FROM " + plugin.getPlayerBanStorage().getTableConfig().getTableName() + - " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig().getTableName() + " p ON player_id = p.id" + - " WHERE created >= ? AND actor_id = ?" + - - " UNION ALL" + - - " SELECT 'Ban' type, p.name AS name, pastCreated as created" + - " FROM " + plugin.getPlayerBanRecordStorage().getTableConfig().getTableName() + - " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig().getTableName() + " p ON player_id = p.id" + - " WHERE pastCreated >= ? AND actor_id = ?" + - - " UNION ALL" + - - " SELECT 'Unban' type, p.name AS name, created" + - " FROM " + plugin.getPlayerBanRecordStorage().getTableConfig().getTableName() + - " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig().getTableName() + " p ON player_id = p.id" + - " WHERE created >= ? AND actor_id = ?" + - - " UNION ALL" + - - " SELECT 'Warning' type, p.name AS name, created" + - " FROM " + plugin.getPlayerWarnStorage().getTableConfig().getTableName() + - " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig().getTableName() + " p ON player_id = p.id" + - " WHERE created >= ? AND actor_id = ?" + - - " UNION ALL" + - - " SELECT 'Mute' type, p.name AS name, created" + - " FROM " + plugin.getPlayerMuteStorage().getTableConfig().getTableName() + - " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig().getTableName() + " p ON player_id = p.id" + - " WHERE created >= ? AND actor_id = ?" + - - " UNION ALL" + - - " SELECT 'Mute' type, p.name AS name, pastCreated as created" + - " FROM " + plugin.getPlayerMuteRecordStorage().getTableConfig().getTableName() + - " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig().getTableName() + " p ON player_id = p.id" + - " WHERE pastCreated >= ? AND actor_id = ?" + - - " UNION ALL" + - - " SELECT 'Unmute' type, p.name AS name, created" + - " FROM " + plugin.getPlayerMuteRecordStorage().getTableConfig().getTableName() + - " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig().getTableName() + " p ON player_id = p.id" + - " WHERE created >= ? AND actor_id = ?" + - - " UNION ALL" + - - " SELECT 'Note' type, p.name AS name, created" + - " FROM " + plugin.getPlayerNoteStorage().getTableConfig().getTableName() + - " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig().getTableName() + " p ON player_id = p.id" + - " WHERE created >= ? AND actor_id = ?" + - - " UNION ALL" + - - " SELECT 'Ban' type, INET_NTOA(ib.ip) AS name, created" + - " FROM " + plugin.getIpBanStorage().getTableConfig().getTableName() + " ib" + - " WHERE created >= ? AND actor_id = ?" + - - " UNION ALL" + - - " SELECT 'Ban' type, INET_NTOA(ibr.ip) AS name, pastCreated AS created" + - " FROM " + plugin.getIpBanRecordStorage().getTableConfig().getTableName() + " ibr" + - " WHERE pastCreated >= ? AND actor_id = ?" + - - " UNION ALL" + - - " SELECT 'Unban' type, INET_NTOA(ibr.ip) AS name, created" + - " FROM " + plugin.getIpBanRecordStorage().getTableConfig().getTableName() + " ibr" + - " WHERE created >= ? AND actor_id = ?" + - - " UNION ALL" + - - " SELECT 'Ban' type, CONCAT_WS(' - ', INET_NTOA(fromIp), INET_NTOA(toIp)) AS name, created" + - " FROM " + plugin.getIpRangeBanStorage().getTableConfig().getTableName() + - " WHERE created >= ? AND actor_id = ?" + - - " UNION ALL" + - - " SELECT 'Ban' type, CONCAT_WS(' - ', INET_NTOA(fromIp), INET_NTOA(toIp)) AS name, pastCreated AS created" + - " FROM " + plugin.getIpRangeBanRecordStorage().getTableConfig().getTableName() + - " WHERE pastCreated >= ? AND actor_id = ?" + - - " UNION ALL" + - - " SELECT 'Unban' type, CONCAT_WS(' - ', INET_NTOA(fromIp), INET_NTOA(toIp)) AS name, created" + - " FROM " + plugin.getIpRangeBanRecordStorage().getTableConfig().getTableName() + - " WHERE created >= ? AND actor_id = ?" + - - " ) subquery" + - " ORDER BY created DESC, FIELD(type, 'Ban', 'Unban', 'Warning', 'Mute', 'Unmute', 'Note')"; - private ConnectionSource localConn; - - public ActivityStorage(ConnectionSource localConn) { - this.localConn = localConn; - } - - public List> getSince(long since) { - return getSince(since, null); - } - - public List> getSince(long since, PlayerData actor) { - DatabaseConnection connection; - - try { - connection = localConn.getReadOnlyConnection(); - } catch (SQLException e) { - e.printStackTrace(); - - return null; - } - - final DatabaseResults result; - boolean hasActor = actor != null; - - try { - CompiledStatement statement = connection - .compileStatement(hasActor ? sincePlayerSql : sinceSql, StatementBuilder.StatementType.SELECT, null, DatabaseConnection.DEFAULT_RESULT_FLAGS); - - int maxItems = hasActor ? 28 : 14; - - for (int i = 0; i < maxItems; i++) { - statement.setObject(i, since, SqlType.LONG); - if (hasActor) { - i++; - statement.setObject(i, actor.getId(), SqlType.BYTE_ARRAY); - } - } - result = statement.runQuery(null); - } catch (SQLException e) { - e.printStackTrace(); - connection.closeQuietly(); - - return null; - } - - List> results = new ArrayList<>(); - - try { - while (result.next()) { - Map map = new HashMap<>(hasActor ? 3 : 4); - if (hasActor) { - map.put("type", result.getString(0)); - map.put("player", result.getString(1)); - map.put("created", result.getLong(2)); - } else { - map.put("type", result.getString(0)); - map.put("player", result.getString(1)); - map.put("actor", result.getString(2)); - map.put("created", result.getLong(3)); - } - results.add(map); - } - } catch (SQLException e) { - e.printStackTrace(); - } finally { - result.closeQuietly(); - } - connection.closeQuietly(); - return results; - } -} diff --git a/src/main/java/me/confuser/banmanager/storage/HistoryStorage.java b/src/main/java/me/confuser/banmanager/storage/HistoryStorage.java deleted file mode 100644 index 31b9c3d93..000000000 --- a/src/main/java/me/confuser/banmanager/storage/HistoryStorage.java +++ /dev/null @@ -1,251 +0,0 @@ -package me.confuser.banmanager.storage; - -import com.j256.ormlite.field.SqlType; -import com.j256.ormlite.stmt.StatementBuilder; -import com.j256.ormlite.support.CompiledStatement; -import com.j256.ormlite.support.ConnectionSource; -import com.j256.ormlite.support.DatabaseConnection; -import com.j256.ormlite.support.DatabaseResults; -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.util.parsers.InfoCommandParser; -import org.bukkit.ChatColor; - -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.HashMap; - -public class HistoryStorage { - - private BanManager plugin = BanManager.getPlugin(); - private ConnectionSource localConn; - - // Queries - final String banSql = "SELECT t.id, 'Ban' type, actor.name AS actor, pastCreated as created, reason, '' AS meta" + - " FROM " + plugin.getPlayerBanRecordStorage().getTableConfig().getTableName() + " t" + - " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig() - .getTableName() + " actor ON pastActor_id = actor.id" + - " WHERE player_id = ?"; - final String muteSql = "SELECT t.id, 'Mute' type, actor.name AS actor, pastCreated as created, reason, '' AS meta" + - " FROM " + plugin.getPlayerMuteRecordStorage().getTableConfig().getTableName() + " t" + - " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig() - .getTableName() + " actor ON pastActor_id = actor.id" + - " WHERE player_id = ?"; - final String kickSql = "SELECT t.id, 'Kick' type, actor.name AS actor, created, reason, '' AS meta" + - " FROM " + plugin.getPlayerKickStorage().getTableConfig().getTableName() + " t" + - " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig() - .getTableName() + " actor ON actor_id = actor.id" + - " WHERE player_id = ?"; - final String warningSql = "SELECT t.id, 'Warning' type, actor.name AS actor, created, reason, points AS meta" + - " FROM " + plugin.getPlayerWarnStorage().getTableConfig().getTableName() + " t" + - " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig() - .getTableName() + " actor ON actor_id = actor.id" + - " WHERE player_id = ?"; - final String noteSql = "SELECT t.id, 'Note' type, actor.name AS actor, created, message AS reason, '' AS meta" + - " FROM " + plugin.getPlayerNoteStorage().getTableConfig().getTableName() + " t" + - " LEFT JOIN " + plugin.getPlayerStorage().getTableConfig() - .getTableName() + " actor ON actor_id = actor.id" + - " WHERE player_id = ?"; - - private final String playerSql = "SELECT id, type, actor, created, reason, meta FROM" + - " ( {QUERIES}" + - " ) subquery" + - " ORDER BY created DESC, FIELD(type, 'Ban', 'Warning', 'Mute', 'Kick', 'Note')"; - - public HistoryStorage(ConnectionSource localConn) { - this.localConn = localConn; - } - - public ArrayList> getSince(PlayerData player, long since, InfoCommandParser parser) { - DatabaseConnection connection; - - try { - connection = localConn.getReadOnlyConnection(); - } catch (SQLException e) { - e.printStackTrace(); - - return null; - } - - final DatabaseResults result; - String sql; - StringBuilder unions = new StringBuilder(); - int typeCount = 0; - - // TODO refactor - if (parser.isBans()) { - unions.append(banSql); - unions.append(" AND created >= ").append(since); - unions.append(" UNION ALL "); - typeCount++; - } - - if (parser.isMutes()) { - unions.append(muteSql); - unions.append(" AND created >= ").append(since); - unions.append(" UNION ALL "); - typeCount++; - } - if (parser.isKicks()) { - unions.append(kickSql); - unions.append(" AND created >= ").append(since); - unions.append(" UNION ALL "); - typeCount++; - } - if (parser.isNotes()) { - unions.append(noteSql); - unions.append(" AND created >= ").append(since); - unions.append(" UNION ALL "); - typeCount++; - } - if (parser.isWarnings()) { - unions.append(warningSql); - unions.append(" AND created >= ").append(since); - unions.append(" UNION ALL "); - typeCount++; - } - - unions.setLength(unions.length() - 11); - - sql = playerSql.replace("{QUERIES}", unions.toString()); - - try { - CompiledStatement statement = connection - .compileStatement(sql, StatementBuilder.StatementType.SELECT, null, DatabaseConnection - .DEFAULT_RESULT_FLAGS); - - for (int i = 0; i < typeCount; i++) { - statement.setObject(i, player.getId(), SqlType.BYTE_ARRAY); - } - - result = statement.runQuery(null); - } catch (SQLException e) { - e.printStackTrace(); - - return null; - } - - ArrayList> results = new ArrayList<>(); - - try { - while (result.next()) { - results.add(new HashMap(4) { - - { - put("id", result.getInt(0)); - put("type", result.getString(1)); - put("actor", result.getString(2)); - put("created", result.getLong(3)); - - if (result.getString(1).equals("Note")) { - put("reason", ChatColor.translateAlternateColorCodes('&', result.getString(4))); - } else { - put("reason", result.getString(4)); - } - - put("meta", result.getString(5)); - } - }); - } - } catch (SQLException e) { - e.printStackTrace(); - } finally { - result.closeQuietly(); - } - - connection.closeQuietly(); - - return results; - } - - public ArrayList> getAll(PlayerData player, InfoCommandParser parser) { - DatabaseConnection connection; - - try { - connection = localConn.getReadOnlyConnection(); - } catch (SQLException e) { - e.printStackTrace(); - - return null; - } - - final DatabaseResults result; - String sql = playerSql; - StringBuilder unions = new StringBuilder(); - int typeCount = 0; - - // TODO refactor - if (parser.isBans()) { - unions.append(banSql); - unions.append(" UNION ALL "); - typeCount++; - } - - if (parser.isMutes()) { - unions.append(muteSql); - unions.append(" UNION ALL "); - typeCount++; - } - if (parser.isKicks()) { - unions.append(kickSql); - unions.append(" UNION ALL "); - typeCount++; - } - if (parser.isNotes()) { - unions.append(noteSql); - unions.append(" UNION ALL "); - typeCount++; - } - if (parser.isWarnings()) { - unions.append(warningSql); - unions.append(" UNION ALL "); - typeCount++; - } - - unions.setLength(unions.length() - 11); - - sql = playerSql.replace("{QUERIES}", unions.toString()); - - try { - CompiledStatement statement = connection - .compileStatement(sql, StatementBuilder.StatementType.SELECT, null, DatabaseConnection - .DEFAULT_RESULT_FLAGS); - - for (int i = 0; i < typeCount; i++) { - statement.setObject(i, player.getId(), SqlType.BYTE_ARRAY); - } - - result = statement.runQuery(null); - } catch (SQLException e) { - e.printStackTrace(); - - return null; - } - - ArrayList> results = new ArrayList<>(); - - try { - while (result.next()) { - results.add(new HashMap(4) { - - { - put("id", result.getInt(0)); - put("type", result.getString(1)); - put("actor", result.getString(2)); - put("created", result.getLong(3)); - put("reason", result.getString(4)); - put("meta", result.getString(5)); - } - }); - } - } catch (SQLException e) { - e.printStackTrace(); - } finally { - result.closeQuietly(); - } - - connection.closeQuietly(); - - return results; - } -} diff --git a/src/main/java/me/confuser/banmanager/storage/IpBanRecordStorage.java b/src/main/java/me/confuser/banmanager/storage/IpBanRecordStorage.java deleted file mode 100644 index 72245a8b5..000000000 --- a/src/main/java/me/confuser/banmanager/storage/IpBanRecordStorage.java +++ /dev/null @@ -1,73 +0,0 @@ -package me.confuser.banmanager.storage; - -import com.j256.ormlite.dao.BaseDaoImpl; -import com.j256.ormlite.dao.CloseableIterator; -import com.j256.ormlite.stmt.QueryBuilder; -import com.j256.ormlite.stmt.Where; -import com.j256.ormlite.support.ConnectionSource; -import com.j256.ormlite.table.DatabaseTableConfig; -import com.j256.ormlite.table.TableUtils; -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.configs.CleanUp; -import me.confuser.banmanager.data.IpBanData; -import me.confuser.banmanager.data.IpBanRecord; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.util.DateUtils; - -import java.sql.SQLException; - -public class IpBanRecordStorage extends BaseDaoImpl { - - public IpBanRecordStorage(ConnectionSource connection) throws SQLException { - super(connection, (DatabaseTableConfig) BanManager.getPlugin().getConfiguration().getLocalDb() - .getTable("ipBanRecords")); - - if (!this.isTableExists()) { - TableUtils.createTable(connection, tableConfig); - } else { - // Attempt to add new columns - try { - String update = "ALTER TABLE " + tableConfig.getTableName() + " ADD COLUMN `createdReason` VARCHAR(255)"; - executeRawNoArgs(update); - } catch (SQLException e) { - } - } - } - - public void addRecord(IpBanData ban, PlayerData actor, String reason) throws SQLException { - create(new IpBanRecord(ban, actor, reason)); - } - - public CloseableIterator findUnbans(long fromTime) throws SQLException { - if (fromTime == 0) { - return iterator(); - } - - long checkTime = fromTime + DateUtils.getTimeDiff(); - - QueryBuilder query = queryBuilder(); - Where where = query.where(); - - where.ge("created", checkTime); - - query.setWhere(where); - - return query.iterator(); - - } - - public long getCount(long ip) throws SQLException { - return queryBuilder().where().eq("ip", ip).countOf(); - } - - public CloseableIterator getRecords(long ip) throws SQLException { - return queryBuilder().where().eq("ip", ip).iterator(); - } - - public void purge(CleanUp cleanup) throws SQLException { - if (cleanup.getDays() == 0) return; - - updateRaw("DELETE FROM " + getTableInfo().getTableName() + " WHERE created < UNIX_TIMESTAMP(DATE_SUB(NOW(), " + - "INTERVAL " + cleanup.getDays() + " DAY))"); - } -} diff --git a/src/main/java/me/confuser/banmanager/storage/IpBanStorage.java b/src/main/java/me/confuser/banmanager/storage/IpBanStorage.java deleted file mode 100644 index 76ab35a5f..000000000 --- a/src/main/java/me/confuser/banmanager/storage/IpBanStorage.java +++ /dev/null @@ -1,214 +0,0 @@ -package me.confuser.banmanager.storage; - -import com.j256.ormlite.dao.BaseDaoImpl; -import com.j256.ormlite.dao.CloseableIterator; -import com.j256.ormlite.stmt.QueryBuilder; -import com.j256.ormlite.stmt.StatementBuilder; -import com.j256.ormlite.stmt.Where; -import com.j256.ormlite.support.CompiledStatement; -import com.j256.ormlite.support.ConnectionSource; -import com.j256.ormlite.support.DatabaseConnection; -import com.j256.ormlite.support.DatabaseResults; -import com.j256.ormlite.table.DatabaseTableConfig; -import com.j256.ormlite.table.TableUtils; -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.IpBanData; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.events.IpBanEvent; -import me.confuser.banmanager.events.IpBannedEvent; -import me.confuser.banmanager.events.IpUnbanEvent; -import me.confuser.banmanager.util.DateUtils; -import me.confuser.banmanager.util.IPUtils; -import me.confuser.banmanager.util.UUIDUtils; -import org.bukkit.Bukkit; - -import java.net.InetAddress; -import java.sql.SQLException; -import java.util.List; -import java.util.concurrent.ConcurrentHashMap; - -public class IpBanStorage extends BaseDaoImpl { - - private BanManager plugin = BanManager.getPlugin(); - private ConcurrentHashMap bans = new ConcurrentHashMap<>(); - - public IpBanStorage(ConnectionSource connection) throws SQLException { - super(connection, (DatabaseTableConfig) BanManager.getPlugin().getConfiguration().getLocalDb() - .getTable("ipBans")); - - if (!this.isTableExists()) { - TableUtils.createTable(connection, tableConfig); - } - - loadAll(); - - plugin.getLogger().info("Loaded " + bans.size() + " ip bans into memory"); - } - - private void loadAll() { - DatabaseConnection connection; - - try { - connection = this.getConnectionSource().getReadOnlyConnection(); - } catch (SQLException e) { - e.printStackTrace(); - plugin.getLogger().warning("Failed to retrieve ip bans into memory"); - return; - } - StringBuilder sql = new StringBuilder(); - - sql.append("SELECT t.id, a.id, a.name, a.ip, a.lastSeen, t.ip, t.reason,"); - sql.append(" t.expires, t.created, t.updated"); - sql.append(" FROM "); - sql.append(this.getTableInfo().getTableName()); - sql.append(" t LEFT JOIN "); - sql.append(plugin.getPlayerStorage().getTableInfo().getTableName()); - sql.append(" a ON actor_id = a.id"); - - CompiledStatement statement; - - try { - statement = connection.compileStatement(sql.toString(), StatementBuilder.StatementType.SELECT, null, - DatabaseConnection.DEFAULT_RESULT_FLAGS); - } catch (SQLException e) { - e.printStackTrace(); - connection.closeQuietly(); - - plugin.getLogger().warning("Failed to retrieve ip bans into memory"); - return; - } - - DatabaseResults results = null; - - try { - results = statement.runQuery(null); - - while (results.next()) { - PlayerData actor; - try { - actor = new PlayerData(UUIDUtils.fromBytes(results.getBytes(1)), results.getString(2), - results.getLong(3), - results.getLong(4)); - - } catch (NullPointerException e) { - plugin.getLogger().warning("Missing actor for ip ban " + results.getInt(0) + ", ignored"); - continue; - } - - IpBanData ban = new IpBanData(results.getInt(0), results.getLong(5), actor, results.getString(6), - results.getLong(7), - results.getLong(8), - results.getLong(9)); - - bans.put(ban.getIp(), ban); - } - } catch (SQLException e) { - e.printStackTrace(); - } finally { - if (results != null) results.closeQuietly(); - - connection.closeQuietly(); - } - } - - public ConcurrentHashMap getBans() { - return bans; - } - - public boolean isBanned(long ip) { - return bans.get(ip) != null; - } - - public boolean isBanned(InetAddress address) { - return isBanned(IPUtils.toLong(address)); - } - - public IpBanData retrieveBan(long ip) throws SQLException { - List bans = queryForEq("ip", ip); - - if (bans.isEmpty()) return null; - - return bans.get(0); - } - - public IpBanData getBan(long ip) { - return bans.get(ip); - } - - public IpBanData getBan(InetAddress address) { - return getBan(IPUtils.toLong(address)); - } - - public void addBan(IpBanData ban) { - bans.put(ban.getIp(), ban); - - if (plugin.getConfiguration().isBroadcastOnSync()) { - Bukkit.getServer().getPluginManager().callEvent(new IpBannedEvent(ban, false)); - } - } - - public void removeBan(IpBanData ban) { - removeBan(ban.getIp()); - } - - public void removeBan(long ip) { - bans.remove(ip); - } - - public boolean ban(IpBanData ban, boolean isSilent) throws SQLException { - IpBanEvent event = new IpBanEvent(ban, isSilent); - Bukkit.getServer().getPluginManager().callEvent(event); - - if (event.isCancelled()) { - return false; - } - - create(ban); - bans.put(ban.getIp(), ban); - - Bukkit.getServer().getPluginManager().callEvent(new IpBannedEvent(ban, event.isSilent())); - - return true; - } - - public boolean unban(IpBanData ban, PlayerData actor) throws SQLException { - return unban(ban, actor, ""); - } - - public boolean unban(IpBanData ban, PlayerData actor, String reason) throws SQLException { - IpUnbanEvent event = new IpUnbanEvent(ban, actor, reason); - Bukkit.getServer().getPluginManager().callEvent(event); - - if (event.isCancelled()) { - return false; - } - - delete(ban); - bans.remove(ban.getIp()); - - plugin.getIpBanRecordStorage().addRecord(ban, actor, reason); - - return true; - } - - public CloseableIterator findBans(long fromTime) throws SQLException { - if (fromTime == 0) { - return iterator(); - } - - long checkTime = fromTime + DateUtils.getTimeDiff(); - - QueryBuilder query = queryBuilder(); - Where where = query.where(); - where - .ge("created", checkTime) - .or() - .ge("updated", checkTime); - - query.setWhere(where); - - return query.iterator(); - - } - -} diff --git a/src/main/java/me/confuser/banmanager/storage/IpMuteRecordStorage.java b/src/main/java/me/confuser/banmanager/storage/IpMuteRecordStorage.java deleted file mode 100644 index 04ec611e9..000000000 --- a/src/main/java/me/confuser/banmanager/storage/IpMuteRecordStorage.java +++ /dev/null @@ -1,66 +0,0 @@ -package me.confuser.banmanager.storage; - -import com.j256.ormlite.dao.BaseDaoImpl; -import com.j256.ormlite.dao.CloseableIterator; -import com.j256.ormlite.stmt.QueryBuilder; -import com.j256.ormlite.stmt.Where; -import com.j256.ormlite.support.ConnectionSource; -import com.j256.ormlite.table.DatabaseTableConfig; -import com.j256.ormlite.table.TableUtils; -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.configs.CleanUp; -import me.confuser.banmanager.data.IpMuteData; -import me.confuser.banmanager.data.IpMuteRecord; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.util.DateUtils; - -import java.sql.SQLException; - -public class IpMuteRecordStorage extends BaseDaoImpl { - - public IpMuteRecordStorage(ConnectionSource connection) throws SQLException { - super(connection, (DatabaseTableConfig) BanManager.getPlugin().getConfiguration().getLocalDb() - .getTable("ipMuteRecords")); - - if (!this.isTableExists()) { - TableUtils.createTable(connection, tableConfig); - } - } - - public void addRecord(IpMuteData mute, PlayerData actor, String reason) throws SQLException { - create(new IpMuteRecord(mute, actor, reason)); - } - - public CloseableIterator findUnmutes(long fromTime) throws SQLException { - if (fromTime == 0) { - return iterator(); - } - - long checkTime = fromTime + DateUtils.getTimeDiff(); - - QueryBuilder query = queryBuilder(); - Where where = query.where(); - - where.ge("created", checkTime); - - query.setWhere(where); - - return query.iterator(); - - } - - public long getCount(long ip) throws SQLException { - return queryBuilder().where().eq("ip", ip).countOf(); - } - - public CloseableIterator getRecords(long ip) throws SQLException { - return queryBuilder().where().eq("ip", ip).iterator(); - } - - public void purge(CleanUp cleanup) throws SQLException { - if (cleanup.getDays() == 0) return; - - updateRaw("DELETE FROM " + getTableInfo().getTableName() + " WHERE created < UNIX_TIMESTAMP(DATE_SUB(NOW(), " + - "INTERVAL " + cleanup.getDays() + " DAY))"); - } -} diff --git a/src/main/java/me/confuser/banmanager/storage/IpMuteStorage.java b/src/main/java/me/confuser/banmanager/storage/IpMuteStorage.java deleted file mode 100644 index 32eb31c14..000000000 --- a/src/main/java/me/confuser/banmanager/storage/IpMuteStorage.java +++ /dev/null @@ -1,207 +0,0 @@ -package me.confuser.banmanager.storage; - -import com.j256.ormlite.dao.BaseDaoImpl; -import com.j256.ormlite.dao.CloseableIterator; -import com.j256.ormlite.stmt.QueryBuilder; -import com.j256.ormlite.stmt.StatementBuilder; -import com.j256.ormlite.stmt.Where; -import com.j256.ormlite.support.CompiledStatement; -import com.j256.ormlite.support.ConnectionSource; -import com.j256.ormlite.support.DatabaseConnection; -import com.j256.ormlite.support.DatabaseResults; -import com.j256.ormlite.table.DatabaseTableConfig; -import com.j256.ormlite.table.TableUtils; -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.IpMuteData; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.events.IpMuteEvent; -import me.confuser.banmanager.events.IpMutedEvent; -import me.confuser.banmanager.events.IpUnmutedEvent; -import me.confuser.banmanager.util.DateUtils; -import me.confuser.banmanager.util.IPUtils; -import me.confuser.banmanager.util.UUIDUtils; -import org.bukkit.Bukkit; - -import java.net.InetAddress; -import java.sql.SQLException; -import java.util.List; -import java.util.concurrent.ConcurrentHashMap; - -public class IpMuteStorage extends BaseDaoImpl { - - private BanManager plugin = BanManager.getPlugin(); - private ConcurrentHashMap mutes = new ConcurrentHashMap<>(); - - public IpMuteStorage(ConnectionSource connection) throws SQLException { - super(connection, (DatabaseTableConfig) BanManager.getPlugin().getConfiguration().getLocalDb() - .getTable("ipMutes")); - - if (!this.isTableExists()) { - TableUtils.createTable(connection, tableConfig); - } - - loadAll(); - - plugin.getLogger().info("Loaded " + mutes.size() + " ip mutes into memory"); - } - - private void loadAll() { - DatabaseConnection connection; - - try { - connection = this.getConnectionSource().getReadOnlyConnection(); - } catch (SQLException e) { - e.printStackTrace(); - plugin.getLogger().warning("Failed to retrieve ip mutes into memory"); - return; - } - StringBuilder sql = new StringBuilder(); - - sql.append("SELECT t.id, a.id, a.name, a.ip, a.lastSeen, t.ip, t.reason,"); - sql.append(" t.soft, t.expires, t.created, t.updated"); - sql.append(" FROM "); - sql.append(this.getTableInfo().getTableName()); - sql.append(" t LEFT JOIN "); - sql.append(plugin.getPlayerStorage().getTableInfo().getTableName()); - sql.append(" a ON actor_id = a.id"); - - CompiledStatement statement; - - try { - statement = connection.compileStatement(sql.toString(), StatementBuilder.StatementType.SELECT, null, - DatabaseConnection.DEFAULT_RESULT_FLAGS); - } catch (SQLException e) { - e.printStackTrace(); - connection.closeQuietly(); - - plugin.getLogger().warning("Failed to retrieve ip mutes into memory"); - return; - } - - DatabaseResults results = null; - - try { - results = statement.runQuery(null); - - while (results.next()) { - PlayerData actor = new PlayerData(UUIDUtils.fromBytes(results.getBytes(1)), results.getString(2), - results.getLong(3), - results.getLong(4)); - IpMuteData mute = new IpMuteData(results.getInt(0), results.getLong(5), actor, results.getString(6), - results.getBoolean(7), - results.getLong(8), - results.getLong(9), - results.getLong(10)); - - mutes.put(mute.getIp(), mute); - } - } catch (SQLException e) { - e.printStackTrace(); - } finally { - if (results != null) results.closeQuietly(); - - connection.closeQuietly(); - } - } - - public ConcurrentHashMap getMutes() { - return mutes; - } - - public boolean isMuted(long ip) { - return mutes.get(ip) != null; - } - - public boolean isMuted(InetAddress address) { - return isMuted(IPUtils.toLong(address)); - } - - public IpMuteData retrieveMute(long ip) throws SQLException { - List mutes = queryForEq("ip", ip); - - if (mutes.isEmpty()) return null; - - return mutes.get(0); - } - - public IpMuteData getMute(long ip) { - return mutes.get(ip); - } - - public IpMuteData getMute(InetAddress address) { - return getMute(IPUtils.toLong(address)); - } - - public void addMute(IpMuteData mute) { - mutes.put(mute.getIp(), mute); - - if (plugin.getConfiguration().isBroadcastOnSync()) { - Bukkit.getServer().getPluginManager().callEvent(new IpMutedEvent(mute, false)); - } - } - - public void removeMute(IpMuteData mute) { - removeMute(mute.getIp()); - } - - public void removeMute(long ip) { - mutes.remove(ip); - } - - public boolean mute(IpMuteData mute, boolean isSilent) throws SQLException { - IpMuteEvent event = new IpMuteEvent(mute, isSilent); - Bukkit.getServer().getPluginManager().callEvent(event); - - if (event.isCancelled()) { - return false; - } - - create(mute); - mutes.put(mute.getIp(), mute); - - Bukkit.getServer().getPluginManager().callEvent(new IpMutedEvent(mute, event.isSilent())); - - return true; - } - - public boolean unmute(IpMuteData mute, PlayerData actor) throws SQLException { - return unmute(mute, actor, ""); - } - - public boolean unmute(IpMuteData mute, PlayerData actor, String reason) throws SQLException { - IpUnmutedEvent event = new IpUnmutedEvent(mute, actor, reason); - Bukkit.getServer().getPluginManager().callEvent(event); - - if (event.isCancelled()) { - return false; - } - - delete(mute); - mutes.remove(mute.getIp()); - - plugin.getIpMuteRecordStorage().addRecord(mute, actor, reason); - - return true; - } - - public CloseableIterator findMutes(long fromTime) throws SQLException { - if (fromTime == 0) { - return iterator(); - } - - long checkTime = fromTime + DateUtils.getTimeDiff(); - - QueryBuilder query = queryBuilder(); - Where where = query.where(); - where - .ge("created", checkTime) - .or() - .ge("updated", checkTime); - - query.setWhere(where); - - return query.iterator(); - - } - -} diff --git a/src/main/java/me/confuser/banmanager/storage/IpRangeBanRecordStorage.java b/src/main/java/me/confuser/banmanager/storage/IpRangeBanRecordStorage.java deleted file mode 100644 index a0d848f17..000000000 --- a/src/main/java/me/confuser/banmanager/storage/IpRangeBanRecordStorage.java +++ /dev/null @@ -1,65 +0,0 @@ -package me.confuser.banmanager.storage; - -import com.j256.ormlite.dao.BaseDaoImpl; -import com.j256.ormlite.dao.CloseableIterator; -import com.j256.ormlite.stmt.QueryBuilder; -import com.j256.ormlite.stmt.Where; -import com.j256.ormlite.support.ConnectionSource; -import com.j256.ormlite.table.DatabaseTableConfig; -import com.j256.ormlite.table.TableUtils; -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.IpRangeBanData; -import me.confuser.banmanager.data.IpRangeBanRecord; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.util.DateUtils; - -import java.sql.SQLException; - -public class IpRangeBanRecordStorage extends BaseDaoImpl { - - public IpRangeBanRecordStorage(ConnectionSource connection) throws SQLException { - super(connection, (DatabaseTableConfig) BanManager.getPlugin().getConfiguration().getLocalDb() - .getTable("ipRangeBanRecords")); - - if (!this.isTableExists()) { - TableUtils.createTable(connection, tableConfig); - } else { - // Attempt to add new columns - try { - String update = "ALTER TABLE " + tableConfig.getTableName() + " ADD COLUMN `createdReason` VARCHAR(255)"; - executeRawNoArgs(update); - } catch (SQLException e) { - } - } - } - - public void addRecord(IpRangeBanData ban, PlayerData actor, String reason) throws SQLException { - create(new IpRangeBanRecord(ban, actor, reason)); - } - - public CloseableIterator findUnbans(long fromTime) throws SQLException { - if (fromTime == 0) { - return iterator(); - } - - long checkTime = fromTime + DateUtils.getTimeDiff(); - - QueryBuilder query = queryBuilder(); - Where where = query.where(); - - where.ge("created", checkTime); - - query.setWhere(where); - - return query.iterator(); - - } - - public long getCount(long ip) throws SQLException { - return queryBuilder().where().eq("ip", ip).countOf(); - } - - public CloseableIterator getRecords(long ip) throws SQLException { - return queryBuilder().where().eq("ip", ip).iterator(); - } -} diff --git a/src/main/java/me/confuser/banmanager/storage/IpRangeBanStorage.java b/src/main/java/me/confuser/banmanager/storage/IpRangeBanStorage.java deleted file mode 100644 index 4e3a8a7a8..000000000 --- a/src/main/java/me/confuser/banmanager/storage/IpRangeBanStorage.java +++ /dev/null @@ -1,260 +0,0 @@ -package me.confuser.banmanager.storage; - -import com.google.common.collect.Range; -import com.j256.ormlite.dao.BaseDaoImpl; -import com.j256.ormlite.dao.CloseableIterator; -import com.j256.ormlite.stmt.QueryBuilder; -import com.j256.ormlite.stmt.StatementBuilder; -import com.j256.ormlite.stmt.Where; -import com.j256.ormlite.support.CompiledStatement; -import com.j256.ormlite.support.ConnectionSource; -import com.j256.ormlite.support.DatabaseConnection; -import com.j256.ormlite.support.DatabaseResults; -import com.j256.ormlite.table.DatabaseTableConfig; -import com.j256.ormlite.table.TableUtils; -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.IpRangeBanData; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.events.IpRangeBanEvent; -import me.confuser.banmanager.events.IpRangeBannedEvent; -import me.confuser.banmanager.events.IpRangeUnbanEvent; -import me.confuser.banmanager.util.DateUtils; -import me.confuser.banmanager.util.IPUtils; -import me.confuser.banmanager.util.UUIDUtils; -import org.bukkit.Bukkit; - -import java.net.InetAddress; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.concurrent.ConcurrentHashMap; - -public class IpRangeBanStorage extends BaseDaoImpl { - - private BanManager plugin = BanManager.getPlugin(); - private ArrayList ranges = new ArrayList<>(); - private ConcurrentHashMap bans = new ConcurrentHashMap<>(); - - public IpRangeBanStorage(ConnectionSource connection) throws SQLException { - super(connection, (DatabaseTableConfig) BanManager.getPlugin().getConfiguration().getLocalDb() - .getTable("ipRangeBans")); - - if (!this.isTableExists()) { - TableUtils.createTable(connection, tableConfig); - return; - } - - loadAll(); - - plugin.getLogger().info("Loaded " + bans.size() + " ip range bans into memory"); - } - - private void loadAll() { - DatabaseConnection connection; - - try { - connection = this.getConnectionSource().getReadOnlyConnection(); - } catch (SQLException e) { - e.printStackTrace(); - plugin.getLogger().warning("Failed to retrieve ip range bans into memory"); - return; - } - StringBuilder sql = new StringBuilder(); - - sql.append("SELECT t.id, a.id, a.name, a.ip, a.lastSeen, t.fromIp, t.toIp, t.reason,"); - sql.append(" t.expires, t.created, t.updated"); - sql.append(" FROM "); - sql.append(this.getTableInfo().getTableName()); - sql.append(" t LEFT JOIN "); - sql.append(plugin.getPlayerStorage().getTableInfo().getTableName()); - sql.append(" a ON actor_id = a.id"); - - CompiledStatement statement; - - try { - statement = connection.compileStatement(sql.toString(), StatementBuilder.StatementType.SELECT, null, - DatabaseConnection.DEFAULT_RESULT_FLAGS); - } catch (SQLException e) { - e.printStackTrace(); - connection.closeQuietly(); - - plugin.getLogger().warning("Failed to retrieve ip range bans into memory"); - return; - } - - DatabaseResults results = null; - - try { - results = statement.runQuery(null); - - while (results.next()) { - PlayerData actor; - try { - actor = new PlayerData(UUIDUtils.fromBytes(results.getBytes(1)), results.getString(2), - results.getLong(3), - results.getLong(4)); - - } catch (NullPointerException e) { - plugin.getLogger().warning("Missing actor for ip ban " + results.getInt(0) + ", ignored"); - continue; - } - - IpRangeBanData ban = new IpRangeBanData(results.getInt(0), results.getLong(5), results.getLong(6), - actor, - results.getString(7), - results.getLong(8), - results.getLong(9), - results.getLong(10)); - - Range range = Range.closed(ban.getFromIp(), ban.getToIp()); - - bans.put(range, ban); - ranges.add(range); - } - } catch (SQLException e) { - e.printStackTrace(); - } finally { - if (results != null) results.closeQuietly(); - - connection.closeQuietly(); - } - } - - public ConcurrentHashMap getBans() { - return bans; - } - - public boolean isBanned(long ip) { - return getRange(ip) != null; - } - - private Range getRange(long ip) { - // o(n) lookup :( - // TODO Find a way to use a TreeRangeSet that's backwards compatible with older Craftbukkit versions - for (Range range : ranges) { - if (range.contains(ip)) return range; - } - - return null; - } - - public boolean isBanned(Range range) { - return bans.get(range) != null; - } - - public boolean isBanned(IpRangeBanData ban) { - return isBanned(ban.getRange()); - } - - public boolean isBanned(InetAddress address) { - return isBanned(IPUtils.toLong(address)); - } - - public IpRangeBanData retrieveBan(long fromIp, long toIp) throws SQLException { - QueryBuilder query = this.queryBuilder(); - Where where = queryBuilder().where(); - - where.eq("fromIp", fromIp).eq("toIp", toIp); - - query.setWhere(where); - - return query.queryForFirst(); - } - - public IpRangeBanData getBan(long ip) { - Range range = getRange(ip); - - if (range == null) return null; - - return bans.get(range); - } - - public IpRangeBanData getBan(Range range) { - return bans.get(range); - } - - public IpRangeBanData getBan(InetAddress address) { - return getBan(IPUtils.toLong(address)); - } - - public void addBan(IpRangeBanData ban) { - Range range = Range.closed(ban.getFromIp(), ban.getToIp()); - - ranges.add(range); - bans.put(range, ban); - - if (plugin.getConfiguration().isBroadcastOnSync()) { - Bukkit.getServer().getPluginManager().callEvent(new IpRangeBannedEvent(ban, false)); - } - } - - public void removeBan(IpRangeBanData ban) { - removeBan(ban.getRange()); - } - - public void removeBan(Range range) { - ranges.remove(range); - bans.remove(range); - } - - public boolean ban(IpRangeBanData ban, boolean silent) throws SQLException { - IpRangeBanEvent event = new IpRangeBanEvent(ban, silent); - Bukkit.getServer().getPluginManager().callEvent(event); - - if (event.isCancelled()) { - return false; - } - - create(ban); - Range range = Range.closed(ban.getFromIp(), ban.getToIp()); - - bans.put(range, ban); - ranges.add(range); - - Bukkit.getServer().getPluginManager().callEvent(new IpRangeBannedEvent(ban, event.isSilent())); - - return true; - } - - public boolean unban(IpRangeBanData ban, PlayerData actor) throws SQLException { - return unban(ban, actor, ""); - } - - public boolean unban(IpRangeBanData ban, PlayerData actor, String reason) throws SQLException { - IpRangeUnbanEvent event = new IpRangeUnbanEvent(ban, actor, reason); - Bukkit.getServer().getPluginManager().callEvent(event); - - if (event.isCancelled()) { - return false; - } - - delete(ban); - Range range = Range.closed(ban.getFromIp(), ban.getToIp()); - - bans.remove(range); - ranges.remove(range); - - plugin.getIpRangeBanRecordStorage().addRecord(ban, actor, reason); - - return true; - } - - public CloseableIterator findBans(long fromTime) throws SQLException { - if (fromTime == 0) { - return iterator(); - } - - long checkTime = fromTime + DateUtils.getTimeDiff(); - - QueryBuilder query = queryBuilder(); - Where where = query.where(); - where - .ge("created", checkTime) - .or() - .ge("updated", checkTime); - - query.setWhere(where); - - return query.iterator(); - - } -} diff --git a/src/main/java/me/confuser/banmanager/storage/NameBanRecordStorage.java b/src/main/java/me/confuser/banmanager/storage/NameBanRecordStorage.java deleted file mode 100644 index c6484808f..000000000 --- a/src/main/java/me/confuser/banmanager/storage/NameBanRecordStorage.java +++ /dev/null @@ -1,52 +0,0 @@ -package me.confuser.banmanager.storage; - -import com.j256.ormlite.dao.BaseDaoImpl; -import com.j256.ormlite.dao.CloseableIterator; -import com.j256.ormlite.stmt.QueryBuilder; -import com.j256.ormlite.stmt.Where; -import com.j256.ormlite.support.ConnectionSource; -import com.j256.ormlite.table.DatabaseTableConfig; -import com.j256.ormlite.table.TableUtils; -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.NameBanData; -import me.confuser.banmanager.data.NameBanRecord; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.util.DateUtils; - -import java.sql.SQLException; - -public class NameBanRecordStorage extends BaseDaoImpl { - - public NameBanRecordStorage(ConnectionSource connection) throws SQLException { - super(connection, (DatabaseTableConfig) BanManager.getPlugin().getConfiguration() - .getLocalDb().getTable("nameBanRecords")); - - if (!this.isTableExists()) { - TableUtils.createTable(connection, tableConfig); - return; - } - } - - public void addRecord(NameBanData ban, PlayerData actor, String reason) throws SQLException { - create(new NameBanRecord(ban, actor, reason)); - } - - public CloseableIterator findUnbans(long fromTime) throws SQLException { - if (fromTime == 0) { - return iterator(); - } - - long checkTime = fromTime + DateUtils.getTimeDiff(); - - QueryBuilder query = queryBuilder(); - Where where = query.where(); - - where.ge("created", checkTime); - - query.setWhere(where); - - - return query.iterator(); - - } -} diff --git a/src/main/java/me/confuser/banmanager/storage/PlayerBanRecordStorage.java b/src/main/java/me/confuser/banmanager/storage/PlayerBanRecordStorage.java deleted file mode 100644 index 04a50854c..000000000 --- a/src/main/java/me/confuser/banmanager/storage/PlayerBanRecordStorage.java +++ /dev/null @@ -1,85 +0,0 @@ -package me.confuser.banmanager.storage; - -import com.j256.ormlite.dao.BaseDaoImpl; -import com.j256.ormlite.dao.CloseableIterator; -import com.j256.ormlite.stmt.DeleteBuilder; -import com.j256.ormlite.stmt.QueryBuilder; -import com.j256.ormlite.stmt.Where; -import com.j256.ormlite.support.ConnectionSource; -import com.j256.ormlite.table.DatabaseTableConfig; -import com.j256.ormlite.table.TableUtils; -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.configs.CleanUp; -import me.confuser.banmanager.data.PlayerBanData; -import me.confuser.banmanager.data.PlayerBanRecord; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.util.DateUtils; - -import java.sql.SQLException; - -public class PlayerBanRecordStorage extends BaseDaoImpl { - - public PlayerBanRecordStorage(ConnectionSource connection) throws SQLException { - super(connection, (DatabaseTableConfig) BanManager.getPlugin().getConfiguration() - .getLocalDb().getTable("playerBanRecords")); - - if (!this.isTableExists()) { - TableUtils.createTable(connection, tableConfig); - return; - } else { - // Attempt to add new columns - try { - String update = "ALTER TABLE " + tableConfig.getTableName() + " ADD COLUMN `createdReason` VARCHAR(255)"; - executeRawNoArgs(update); - } catch (SQLException e) { - } - } - } - - public void addRecord(PlayerBanData ban, PlayerData actor, String reason) throws SQLException { - create(new PlayerBanRecord(ban, actor, reason)); - } - - public CloseableIterator findUnbans(long fromTime) throws SQLException { - if (fromTime == 0) { - return iterator(); - } - - long checkTime = fromTime + DateUtils.getTimeDiff(); - - QueryBuilder query = queryBuilder(); - Where where = query.where(); - - where.ge("created", checkTime); - - query.setWhere(where); - - - - return query.iterator(); - - } - - public long getCount(PlayerData player) throws SQLException { - return queryBuilder().where().eq("player_id", player).countOf(); - } - - public CloseableIterator getRecords(PlayerData player) throws SQLException { - return queryBuilder().where().eq("player_id", player).iterator(); - } - - public void purge(CleanUp cleanup) throws SQLException { - if (cleanup.getDays() == 0) return; - - updateRaw("DELETE FROM " + getTableInfo().getTableName() + " WHERE created < UNIX_TIMESTAMP(DATE_SUB(NOW(), " + - "INTERVAL " + cleanup.getDays() + " DAY))"); - } - - public int deleteAll(PlayerData player) throws SQLException { - DeleteBuilder builder = deleteBuilder(); - - builder.where().eq("player_id", player); - - return builder.delete(); - } -} diff --git a/src/main/java/me/confuser/banmanager/storage/PlayerHistoryStorage.java b/src/main/java/me/confuser/banmanager/storage/PlayerHistoryStorage.java deleted file mode 100644 index 8a1a32878..000000000 --- a/src/main/java/me/confuser/banmanager/storage/PlayerHistoryStorage.java +++ /dev/null @@ -1,56 +0,0 @@ -package me.confuser.banmanager.storage; - -import com.j256.ormlite.dao.BaseDaoImpl; -import com.j256.ormlite.dao.CloseableIterator; -import com.j256.ormlite.support.ConnectionSource; -import com.j256.ormlite.table.DatabaseTableConfig; -import com.j256.ormlite.table.TableUtils; -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.data.PlayerHistoryData; - -import java.sql.SQLException; -import java.util.UUID; -import java.util.concurrent.ConcurrentHashMap; - -public class PlayerHistoryStorage extends BaseDaoImpl { - - private ConcurrentHashMap players = new ConcurrentHashMap<>(); - - public PlayerHistoryStorage(ConnectionSource connection) throws SQLException { - super(connection, (DatabaseTableConfig) BanManager.getPlugin().getConfiguration() - .getLocalDb().getTable("playerHistory")); - - if (!this.isTableExists()) { - TableUtils.createTable(connection, tableConfig); - } - } - - public void create(PlayerData player) { - players.put(player.getUUID(), new PlayerHistoryData(player)); - } - - public PlayerHistoryData remove(UUID uuid) { - return players.remove(uuid); - } - - public CloseableIterator getSince(PlayerData player, long since, int page) throws SQLException { - return queryBuilder().limit(10L).offset(10L * page) - .orderBy("join", false) - .where().ge("join", since).and().eq("player_id", player) - .iterator(); - } - - public void save() { - for (PlayerHistoryData data : players.values()) { - data.setLeave(System.currentTimeMillis() / 1000L); - - try { - create(data); - } catch (SQLException e) { - e.printStackTrace(); - break; // Don't slow down shut down if problems with the connection - } - } - } -} diff --git a/src/main/java/me/confuser/banmanager/storage/PlayerKickStorage.java b/src/main/java/me/confuser/banmanager/storage/PlayerKickStorage.java deleted file mode 100644 index d351d4a0f..000000000 --- a/src/main/java/me/confuser/banmanager/storage/PlayerKickStorage.java +++ /dev/null @@ -1,48 +0,0 @@ -package me.confuser.banmanager.storage; - -import com.j256.ormlite.dao.BaseDaoImpl; -import com.j256.ormlite.stmt.DeleteBuilder; -import com.j256.ormlite.support.ConnectionSource; -import com.j256.ormlite.table.DatabaseTableConfig; -import com.j256.ormlite.table.TableUtils; -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.configs.CleanUp; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.data.PlayerKickData; - -import java.sql.SQLException; - -public class PlayerKickStorage extends BaseDaoImpl { - - public PlayerKickStorage(ConnectionSource connection) throws SQLException { - super(connection, (DatabaseTableConfig) BanManager.getPlugin().getConfiguration() - .getLocalDb().getTable("playerKicks")); - - if (!this.isTableExists()) { - TableUtils.createTable(connection, tableConfig); - } - } - - public boolean addKick(PlayerKickData data) throws SQLException { - return create(data) == 1; - } - - public void purge(CleanUp cleanup) throws SQLException { - if (cleanup.getDays() == 0) return; - - updateRaw("DELETE FROM " + getTableInfo().getTableName() + " WHERE created < UNIX_TIMESTAMP(DATE_SUB(NOW(), " + - "INTERVAL " + cleanup.getDays() + " DAY))"); - } - - public long getCount(PlayerData player) throws SQLException { - return queryBuilder().where().eq("player_id", player).countOf(); - } - - public int deleteAll(PlayerData player) throws SQLException { - DeleteBuilder builder = deleteBuilder(); - - builder.where().eq("player_id", player); - - return builder.delete(); - } -} diff --git a/src/main/java/me/confuser/banmanager/storage/PlayerMuteRecordStorage.java b/src/main/java/me/confuser/banmanager/storage/PlayerMuteRecordStorage.java deleted file mode 100644 index 3a9ee0fba..000000000 --- a/src/main/java/me/confuser/banmanager/storage/PlayerMuteRecordStorage.java +++ /dev/null @@ -1,84 +0,0 @@ -package me.confuser.banmanager.storage; - -import com.j256.ormlite.dao.BaseDaoImpl; -import com.j256.ormlite.dao.CloseableIterator; -import com.j256.ormlite.stmt.DeleteBuilder; -import com.j256.ormlite.stmt.QueryBuilder; -import com.j256.ormlite.stmt.Where; -import com.j256.ormlite.support.ConnectionSource; -import com.j256.ormlite.table.DatabaseTableConfig; -import com.j256.ormlite.table.TableUtils; -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.configs.CleanUp; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.data.PlayerMuteData; -import me.confuser.banmanager.data.PlayerMuteRecord; -import me.confuser.banmanager.util.DateUtils; - -import java.sql.SQLException; - -public class PlayerMuteRecordStorage extends BaseDaoImpl { - - public PlayerMuteRecordStorage(ConnectionSource connection) throws SQLException { - super(connection, (DatabaseTableConfig) BanManager.getPlugin().getConfiguration() - .getLocalDb().getTable("playerMuteRecords")); - - if (!this.isTableExists()) { - TableUtils.createTable(connection, tableConfig); - } else { - // Attempt to add new columns - try { - String update = "ALTER TABLE " + tableConfig.getTableName() + " ADD COLUMN `createdReason` VARCHAR(255), " - + " ADD COLUMN `soft` TINYINT(1)," + - " ADD KEY `" + tableConfig.getTableName() + "_soft_idx` (`soft`)"; - executeRawNoArgs(update); - } catch (SQLException e) { - } - } - } - - public void addRecord(PlayerMuteData mute, PlayerData actor, String reason) throws SQLException { - create(new PlayerMuteRecord(mute, actor, reason)); - } - - public CloseableIterator findUnmutes(long fromTime) throws SQLException { - if (fromTime == 0) { - return iterator(); - } - - long checkTime = fromTime + DateUtils.getTimeDiff(); - - QueryBuilder query = queryBuilder(); - Where where = query.where(); - - where.ge("created", checkTime); - - query.setWhere(where); - - return query.iterator(); - - } - - public long getCount(PlayerData player) throws SQLException { - return queryBuilder().where().eq("player_id", player).countOf(); - } - - public CloseableIterator getRecords(PlayerData player) throws SQLException { - return queryBuilder().where().eq("player_id", player).iterator(); - } - - public void purge(CleanUp cleanup) throws SQLException { - if (cleanup.getDays() == 0) return; - - updateRaw("DELETE FROM " + getTableInfo().getTableName() + " WHERE created < UNIX_TIMESTAMP(DATE_SUB(NOW(), " + - "INTERVAL " + cleanup.getDays() + " DAY))"); - } - - public int deleteAll(PlayerData player) throws SQLException { - DeleteBuilder builder = deleteBuilder(); - - builder.where().eq("player_id", player); - - return builder.delete(); - } -} diff --git a/src/main/java/me/confuser/banmanager/storage/PlayerNoteStorage.java b/src/main/java/me/confuser/banmanager/storage/PlayerNoteStorage.java deleted file mode 100644 index 3ad89b26e..000000000 --- a/src/main/java/me/confuser/banmanager/storage/PlayerNoteStorage.java +++ /dev/null @@ -1,52 +0,0 @@ -package me.confuser.banmanager.storage; - -import com.j256.ormlite.dao.BaseDaoImpl; -import com.j256.ormlite.dao.CloseableIterator; -import com.j256.ormlite.stmt.DeleteBuilder; -import com.j256.ormlite.stmt.Where; -import com.j256.ormlite.support.ConnectionSource; -import com.j256.ormlite.table.DatabaseTableConfig; -import com.j256.ormlite.table.TableUtils; -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.data.PlayerNoteData; -import me.confuser.banmanager.events.PlayerNoteCreatedEvent; -import me.confuser.banmanager.util.UUIDUtils; -import org.bukkit.Bukkit; - -import java.sql.SQLException; -import java.util.UUID; - -public class PlayerNoteStorage extends BaseDaoImpl { - - private BanManager plugin = BanManager.getPlugin(); - - public PlayerNoteStorage(ConnectionSource connection) throws SQLException { - super(connection, (DatabaseTableConfig) BanManager.getPlugin().getConfiguration() - .getLocalDb().getTable("playerNotes")); - - if (!this.isTableExists()) { - TableUtils.createTable(connection, tableConfig); - } - } - - public boolean addNote(PlayerNoteData data) throws SQLException { - PlayerNoteCreatedEvent event = new PlayerNoteCreatedEvent(data); - Bukkit.getServer().getPluginManager().callEvent(event); - - return !event.isCancelled() && create(data) == 1; - - } - - public CloseableIterator getNotes(UUID uniqueId) throws SQLException { - return queryBuilder().where().eq("player_id", UUIDUtils.toBytes(uniqueId)).iterator(); - } - - public int deleteAll(PlayerData player) throws SQLException { - DeleteBuilder builder = deleteBuilder(); - - builder.where().eq("player_id", player); - - return builder.delete(); - } -} diff --git a/src/main/java/me/confuser/banmanager/storage/PlayerReportCommandStorage.java b/src/main/java/me/confuser/banmanager/storage/PlayerReportCommandStorage.java deleted file mode 100644 index 030a21fc5..000000000 --- a/src/main/java/me/confuser/banmanager/storage/PlayerReportCommandStorage.java +++ /dev/null @@ -1,28 +0,0 @@ -package me.confuser.banmanager.storage; - -import com.j256.ormlite.dao.BaseDaoImpl; -import com.j256.ormlite.support.ConnectionSource; -import com.j256.ormlite.table.DatabaseTableConfig; -import com.j256.ormlite.table.TableUtils; -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.PlayerReportCommandData; - -import java.sql.SQLException; - -public class PlayerReportCommandStorage extends BaseDaoImpl { - - public PlayerReportCommandStorage(ConnectionSource connection) throws SQLException { - super(connection, (DatabaseTableConfig) BanManager.getPlugin().getConfiguration() - .getLocalDb() - .getTable("playerReportCommands")); - - if (!this.isTableExists()) { - TableUtils.createTable(connection, tableConfig); - } - } - - public PlayerReportCommandData getByReportId(int id) throws SQLException { - return queryBuilder().where().eq("report_id", id).queryForFirst(); - } - -} diff --git a/src/main/java/me/confuser/banmanager/storage/PlayerReportCommentStorage.java b/src/main/java/me/confuser/banmanager/storage/PlayerReportCommentStorage.java deleted file mode 100644 index d0c9a7f15..000000000 --- a/src/main/java/me/confuser/banmanager/storage/PlayerReportCommentStorage.java +++ /dev/null @@ -1,28 +0,0 @@ -package me.confuser.banmanager.storage; - -import com.j256.ormlite.dao.BaseDaoImpl; -import com.j256.ormlite.support.ConnectionSource; -import com.j256.ormlite.table.DatabaseTableConfig; -import com.j256.ormlite.table.TableUtils; -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.PlayerReportCommentData; - -import java.sql.SQLException; - -public class PlayerReportCommentStorage extends BaseDaoImpl { - - public PlayerReportCommentStorage(ConnectionSource connection) throws SQLException { - super(connection, (DatabaseTableConfig) BanManager.getPlugin().getConfiguration() - .getLocalDb() - .getTable("playerReportComments")); - - if (!this.isTableExists()) { - TableUtils.createTable(connection, tableConfig); - } - } - - public PlayerReportCommentData getByReportId(int id) throws SQLException { - return queryBuilder().where().eq("report_id", id).queryForFirst(); - } - -} diff --git a/src/main/java/me/confuser/banmanager/storage/PlayerReportLocationStorage.java b/src/main/java/me/confuser/banmanager/storage/PlayerReportLocationStorage.java deleted file mode 100644 index d5daf2a52..000000000 --- a/src/main/java/me/confuser/banmanager/storage/PlayerReportLocationStorage.java +++ /dev/null @@ -1,28 +0,0 @@ -package me.confuser.banmanager.storage; - -import com.j256.ormlite.dao.BaseDaoImpl; -import com.j256.ormlite.support.ConnectionSource; -import com.j256.ormlite.table.DatabaseTableConfig; -import com.j256.ormlite.table.TableUtils; -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.PlayerReportLocationData; - -import java.sql.SQLException; - -public class PlayerReportLocationStorage extends BaseDaoImpl { - - public PlayerReportLocationStorage(ConnectionSource connection) throws SQLException { - super(connection, (DatabaseTableConfig) BanManager.getPlugin().getConfiguration() - .getLocalDb() - .getTable("playerReportLocations")); - - if (!this.isTableExists()) { - TableUtils.createTable(connection, tableConfig); - } - } - - public PlayerReportLocationData getByReportId(int id) throws SQLException { - return queryBuilder().where().eq("report_id", id).queryForFirst(); - } - -} diff --git a/src/main/java/me/confuser/banmanager/storage/PlayerReportStorage.java b/src/main/java/me/confuser/banmanager/storage/PlayerReportStorage.java deleted file mode 100644 index 6d31f7399..000000000 --- a/src/main/java/me/confuser/banmanager/storage/PlayerReportStorage.java +++ /dev/null @@ -1,145 +0,0 @@ -package me.confuser.banmanager.storage; - -import com.j256.ormlite.dao.BaseDaoImpl; -import com.j256.ormlite.stmt.PreparedQuery; -import com.j256.ormlite.stmt.QueryBuilder; -import com.j256.ormlite.stmt.Where; -import com.j256.ormlite.support.ConnectionSource; -import com.j256.ormlite.table.DatabaseTableConfig; -import com.j256.ormlite.table.TableUtils; -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.commands.report.ReportList; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.data.PlayerReportData; -import me.confuser.banmanager.events.PlayerReportDeletedEvent; -import me.confuser.banmanager.events.PlayerReportEvent; -import me.confuser.banmanager.events.PlayerReportedEvent; -import me.confuser.banmanager.util.UUIDUtils; -import org.bukkit.Bukkit; - -import java.sql.SQLException; -import java.util.Collection; -import java.util.List; -import java.util.UUID; - -public class PlayerReportStorage extends BaseDaoImpl { - - private BanManager plugin = BanManager.getPlugin(); - - public PlayerReportStorage(ConnectionSource connection) throws SQLException { - super(connection, (DatabaseTableConfig) BanManager.getPlugin().getConfiguration() - .getLocalDb().getTable("playerReports")); - - if (!this.isTableExists()) { - TableUtils.createTable(connection, tableConfig); - } else { - try { - String update = "ALTER TABLE " + tableConfig - .getTableName() + " ADD COLUMN `state_id` INT(11) NOT NULL DEFAULT 1," + - " ADD COLUMN `assignee_id` BINARY(16)," + - " ADD KEY `" + tableConfig.getTableName() + "_state_id_idx` (`state_id`)," + - " ADD KEY `" + tableConfig.getTableName() + "_assignee_id_idx` (`assignee_id`)"; - executeRawNoArgs(update); - } catch (SQLException e) { - } - try { - String update = "ALTER TABLE " + tableConfig.getTableName() + " MODIFY assignee_id BINARY(16) NULL"; - executeRawNoArgs(update); - } catch (SQLException e) { - } - } - } - - public boolean report(PlayerReportData data, boolean isSilent) throws SQLException { - PlayerReportEvent event = new PlayerReportEvent(data, isSilent); - - Bukkit.getServer().getPluginManager().callEvent(event); - - if (event.isCancelled()) { - return false; - } - - if (create(data) != 1) return false; - - Bukkit.getServer().getPluginManager().callEvent(new PlayerReportedEvent(data, isSilent)); - - return true; - } - - public ReportList getReports(long page, Integer state, UUID uniqueId) throws SQLException { - QueryBuilder query = queryBuilder(); - - if (state != null || uniqueId != null) { - Where where = query.where(); - - if (state != null) where.eq("state_id", state); - if (state != null && uniqueId != null) where.and(); - if (uniqueId != null) where.eq("actor_id", UUIDUtils.toBytes(uniqueId)); - } - - query.setCountOf(true); - PreparedQuery preparedQuery = query.prepare(); - - long pageSize = 5L; - long count = countOf(preparedQuery); - long maxPage = count == 0 ? 1 : (int) Math.ceil((double) count / pageSize); - - if (maxPage == 0) maxPage = 1; - - long offset = (page - 1) * pageSize; - - query.setCountOf(false).offset(offset).limit(pageSize); - - return new ReportList(query.query(), count, maxPage); - } - - public ReportList getReports(long page, int state) throws SQLException { - return getReports(page, state, null); - } - - public int deleteAll(PlayerData player) throws SQLException { - List reports = queryForEq("player_id", player); - - for (PlayerReportData report : reports) { - deleteById(report.getId()); - } - - return reports.size(); - } - - public boolean isRecentlyReported(PlayerData player) throws SQLException { - if (plugin.getConfiguration().getReportCooldown() == 0) { - return false; - } - - return queryBuilder().where() - .eq("player_id", player).and() - .ge("created", (System.currentTimeMillis() / 1000L) - plugin.getConfiguration() - .getReportCooldown()) - .countOf() > 0; - } - - public int deleteById(Integer id) throws SQLException { - PlayerReportData report = queryForId(id); - - if (report == null) return 0; - - Bukkit.getServer().getPluginManager().callEvent(new PlayerReportDeletedEvent(report)); - - super.deleteById(id); - - return 1; - } - - public int deleteIds(Collection ids) throws SQLException { - if (ids == null || ids.isEmpty()) return 0; - - int count = 0; - - for (Integer id : ids) { - if (deleteById(id) != 0) count++; - } - - return count; - } -} diff --git a/src/main/java/me/confuser/banmanager/storage/PlayerStorage.java b/src/main/java/me/confuser/banmanager/storage/PlayerStorage.java deleted file mode 100644 index bc6f42902..000000000 --- a/src/main/java/me/confuser/banmanager/storage/PlayerStorage.java +++ /dev/null @@ -1,284 +0,0 @@ -package me.confuser.banmanager.storage; - -import com.googlecode.concurrenttrees.radix.ConcurrentRadixTree; -import com.googlecode.concurrenttrees.radix.RadixTree; -import com.googlecode.concurrenttrees.radix.node.concrete.SmartArrayBasedNodeFactory; -import com.googlecode.concurrenttrees.radix.node.concrete.voidvalue.VoidValue; -import com.j256.ormlite.dao.BaseDaoImpl; -import com.j256.ormlite.dao.CloseableIterator; -import com.j256.ormlite.stmt.QueryBuilder; -import com.j256.ormlite.stmt.SelectArg; -import com.j256.ormlite.stmt.Where; -import com.j256.ormlite.support.ConnectionSource; -import com.j256.ormlite.table.DatabaseTableConfig; -import com.j256.ormlite.table.TableUtils; -import lombok.Getter; -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.util.UUIDProfile; -import me.confuser.banmanager.util.UUIDUtils; -import org.bukkit.entity.Player; - -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.UUID; - -public class PlayerStorage extends BaseDaoImpl { - - private BanManager plugin = BanManager.getPlugin(); - @Getter - private RadixTree autoCompleteTree; - - @Getter - private PlayerData console; - - public PlayerStorage(ConnectionSource connection) throws SQLException { - super(connection, (DatabaseTableConfig) BanManager.getPlugin().getConfiguration().getLocalDb() - .getTable("players")); - - if (!isTableExists()) { - TableUtils.createTable(connection, tableConfig); - } - - setupConsole(); - if (plugin.getConfiguration().isOfflineAutoComplete()) { - plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() { - - @Override - public void run() { - setupAutoComplete(); - } - }); - } - } - - public void setupConsole() throws SQLException { - // Get the console - String name = plugin.getConsoleConfig().getName(); - UUID uuid = plugin.getConsoleConfig().getUuid(); - - console = queryForId(UUIDUtils.toBytes(uuid)); - - if (console == null) { - // Create it - console = new PlayerData(uuid, name); - create(console); - } else if (!console.getName().equals(name)) { - console.setName(name); - plugin.getLogger().info("Console name change detected, updating database"); - update(console); - } - } - - public void setupAutoComplete() { - autoCompleteTree = new ConcurrentRadixTree<>(new SmartArrayBasedNodeFactory()); - CloseableIterator itr = null; - - try { - itr = this.queryBuilder().selectColumns("name").iterator(); - - while (itr.hasNext()) { - autoCompleteTree.put(itr.next().getName(), VoidValue.SINGLETON); - } - } catch (SQLException e) { - e.printStackTrace(); - } finally { - if (itr != null) itr.closeQuietly(); - } - - } - - @Override - public CreateOrUpdateStatus createOrUpdate(PlayerData data) throws SQLException { - CreateOrUpdateStatus status = super.createOrUpdate(data); - - if (status.isCreated() && plugin.getConfiguration().isOfflineAutoComplete()) { - autoCompleteTree.put(data.getName(), VoidValue.SINGLETON); - } - - // Check for duplicates - List results = queryForEq("name", new SelectArg(data.getName())); - if (results.size() == 1) return status; - - if (!plugin.getConfiguration().isOnlineMode()) { - plugin.getLogger() - .warning("Duplicates found for " + data.getName() + ", as you are in offline mode, please fix manually"); - return status; - } - - // Duplicates found! - for (PlayerData player : results) { - if (player.getUUID().equals(data.getUUID())) continue; - - String newName; - - try { - newName = UUIDUtils.getCurrentName(player.getUUID()); - } catch (Exception e) { - plugin.getLogger() - .warning("Duplicates found for " + data.getName() + ", was unable to contact Mojang for updated names"); - continue; - } - - if (newName == null || newName.isEmpty() || player.getName().equals(newName)) continue; - - player.setName(newName); - update(player); - } - - return status; - } - - public PlayerData createIfNotExists(UUID uuid, String name) throws SQLException { - PlayerData player = queryForId(UUIDUtils.toBytes(uuid)); - - if (player != null) return player; - - player = new PlayerData(uuid, name); - create(player); - - if (plugin.getConfiguration().isOfflineAutoComplete()) autoCompleteTree.put(name, VoidValue.SINGLETON); - - return player; - } - - public PlayerData retrieve(String name, boolean mojangLookup) { - - try { - List results = queryForEq("name", new SelectArg(name)); - if (results.size() == 1) { - return results.get(0); - } - } catch (SQLException e) { - e.printStackTrace(); - } - - if (!mojangLookup) { - return null; - } - - // UUID Lookup :( - try { - UUIDProfile player = UUIDUtils.getUUIDOf(name); - if (player == null) { - return null; - } - - // Lets store for caching - PlayerData data = new PlayerData(player.getUuid(), player.getName()); - - super.createOrUpdate(data); - - return data; - } catch (Exception e) { - e.printStackTrace(); - } - - return null; - } - - public List retrieve(String name) { - try { - return queryForEq("name", new SelectArg(name)); - } catch (SQLException e) { - e.printStackTrace(); - } - - return null; - } - - public List getDuplicates(long ip) { - ArrayList players = new ArrayList<>(); - - if (plugin.getConfiguration().getBypassPlayerIps().contains(ip)) { - return players; - } - - QueryBuilder query = queryBuilder(); - try { - query.leftJoin(plugin.getPlayerBanStorage().queryBuilder()); - - Where where = query.where(); - - where.eq("ip", ip); - - query.setWhere(where); - } catch (SQLException e) { - e.printStackTrace(); - return players; - } - - - CloseableIterator itr = null; - try { - itr = query.limit(300L).iterator(); - - while (itr.hasNext()) { - PlayerData player = itr.next(); - - if (!plugin.getExemptionsConfig().isExempt(player, "alts")) players.add(player); - } - - } catch (SQLException e) { - e.printStackTrace(); - } finally { - if (itr != null) itr.closeQuietly(); - } - - return players; - } - - public List getDuplicatesInTime(long ip, long timediff) { - ArrayList players = new ArrayList<>(); - long currentTime = System.currentTimeMillis() / 1000L; - - if (plugin.getConfiguration().getBypassPlayerIps().contains(ip)) { - return players; - } - - QueryBuilder query = queryBuilder(); - try { - query.leftJoin(plugin.getPlayerBanStorage().queryBuilder()); - - Where where = query.where(); - - where.eq("ip", ip).and().ge("lastSeen", (currentTime - timediff)); - - query.setWhere(where); - } catch (SQLException e) { - e.printStackTrace(); - return players; - } - - - CloseableIterator itr = null; - try { - itr = query.limit(300L).iterator(); - - while (itr.hasNext()) { - PlayerData player = itr.next(); - - if (!plugin.getExemptionsConfig().isExempt(player, "alts")) players.add(player); - } - - } catch (SQLException e) { - e.printStackTrace(); - } finally { - if (itr != null) itr.closeQuietly(); - } - - return players; - } - - public List getOnlineIds(Collection onlinePlayers) { - ArrayList ids = new ArrayList<>(onlinePlayers.size()); - - for (Player player : onlinePlayers) { - ids.add(UUIDUtils.toBytes(player)); - } - - return ids; - } -} diff --git a/src/main/java/me/confuser/banmanager/storage/PlayerWarnStorage.java b/src/main/java/me/confuser/banmanager/storage/PlayerWarnStorage.java deleted file mode 100644 index 6750c6463..000000000 --- a/src/main/java/me/confuser/banmanager/storage/PlayerWarnStorage.java +++ /dev/null @@ -1,169 +0,0 @@ -package me.confuser.banmanager.storage; - -import com.google.common.cache.Cache; -import com.google.common.cache.CacheBuilder; -import com.j256.ormlite.dao.BaseDaoImpl; -import com.j256.ormlite.dao.CloseableIterator; -import com.j256.ormlite.stmt.DeleteBuilder; -import com.j256.ormlite.stmt.QueryBuilder; -import com.j256.ormlite.stmt.Where; -import com.j256.ormlite.support.ConnectionSource; -import com.j256.ormlite.table.DatabaseTableConfig; -import com.j256.ormlite.table.TableUtils; -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.configs.CleanUp; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.data.PlayerWarnData; -import me.confuser.banmanager.events.PlayerWarnEvent; -import me.confuser.banmanager.events.PlayerWarnedEvent; -import me.confuser.banmanager.util.DateUtils; -import me.confuser.banmanager.util.UUIDUtils; -import org.bukkit.Bukkit; - -import java.sql.SQLException; -import java.util.UUID; -import java.util.concurrent.TimeUnit; - -public class PlayerWarnStorage extends BaseDaoImpl { - - private BanManager plugin = BanManager.getPlugin(); - private Cache muteWarnings = CacheBuilder.newBuilder() - .expireAfterWrite(1, TimeUnit.DAYS) - .concurrencyLevel(2) - .maximumSize(200) - .build(); - - public PlayerWarnStorage(ConnectionSource connection) throws SQLException { - super(connection, (DatabaseTableConfig) BanManager.getPlugin().getConfiguration() - .getLocalDb().getTable("playerWarnings")); - - if (!this.isTableExists()) { - TableUtils.createTable(connection, tableConfig); - } else { - // Attempt to add new columns - try { - String update = "ALTER TABLE " + tableConfig - .getTableName() + " ADD COLUMN `expires` INT(10) NOT NULL DEFAULT 0," + - " ADD KEY `" + tableConfig.getTableName() + "_expires_idx` (`expires`)"; - executeRawNoArgs(update); - } catch (SQLException e) { - } - try { - String update = "ALTER TABLE " + tableConfig - .getTableName() + " ADD COLUMN `points` INT(10) NOT NULL DEFAULT 1," + - " ADD KEY `" + tableConfig.getTableName() + "_points_idx` (`points`)"; - executeRawNoArgs(update); - } catch (SQLException e) { - } - try { - String update = "ALTER TABLE " + tableConfig - .getTableName() + " MODIFY COLUMN `points` DECIMAL(60,2) NOT NULL DEFAULT 1"; - executeRawNoArgs(update); - } catch (SQLException e) { - } - } - } - - public boolean isMuted(UUID uuid) { - return getMute(uuid) != null; - } - - public PlayerWarnData getMute(UUID uuid) { - return muteWarnings.getIfPresent(uuid); - } - - public PlayerWarnData removeMute(UUID uuid) { - PlayerWarnData warning = muteWarnings.getIfPresent(uuid); - - muteWarnings.invalidate(uuid); - - return warning; - } - - public boolean addWarning(PlayerWarnData data, boolean silent) throws SQLException { - PlayerWarnEvent event = new PlayerWarnEvent(data, silent); - Bukkit.getServer().getPluginManager().callEvent(event); - - if (event.isCancelled()) { - return false; - } - - if (plugin.getConfiguration().isWarningMutesEnabled()) muteWarnings.put(data.getPlayer().getUUID(), data); - - boolean created = create(data) == 1; - - if (created) Bukkit.getServer().getPluginManager().callEvent(new PlayerWarnedEvent(data, event.isSilent())); - - return created; - } - - public CloseableIterator getUnreadWarnings(UUID uniqueId) throws SQLException { - return queryBuilder().where().eq("player_id", UUIDUtils.toBytes(uniqueId)).and().eq("read", false).iterator(); - } - - public CloseableIterator getWarnings(PlayerData player) throws SQLException { - return queryBuilder().where().eq("player_id", player).iterator(); - } - - public long getCount(PlayerData player) throws SQLException { - return queryBuilder().where().eq("player_id", player).countOf(); - } - - public double getPointsCount(PlayerData player) throws SQLException { - return queryRawValue("SELECT SUM(points) FROM " + getTableInfo().getTableName() + " WHERE player_id = UNHEX('" + - player.getUUID().toString().replace("-", "") + "')"); - } - - public boolean isRecentlyWarned(PlayerData player) throws SQLException { - if (plugin.getConfiguration().getWarningCooldown() == 0) { - return false; - } - - return queryBuilder().where() - .eq("player_id", player).and() - .ge("created", (System.currentTimeMillis() / 1000L) - plugin.getConfiguration() - .getWarningCooldown()) - .countOf() > 0; - } - - public int deleteRecent(PlayerData player) throws SQLException { - // TODO use a raw DELETE query to reduce to one query - PlayerWarnData warning = queryBuilder().limit(1L).orderBy("created", false).where().eq("player_id", player) - .queryForFirst(); - - return delete(warning); - } - - public void purge(CleanUp cleanup, boolean read) throws SQLException { - if (cleanup.getDays() == 0) return; - - updateRaw("DELETE FROM " + getTableInfo().getTableName() + " WHERE created < UNIX_TIMESTAMP(DATE_SUB(NOW(), " + - "INTERVAL " + cleanup.getDays() + " DAY)) AND `read` = " + (read ? "1" : "0")); - } - - - public CloseableIterator findWarnings(long fromTime) throws SQLException { - if (fromTime == 0) { - return iterator(); - } - - long checkTime = fromTime + DateUtils.getTimeDiff(); - - QueryBuilder query = queryBuilder(); - Where where = query.where(); - where.ge("created", checkTime); - - query.setWhere(where); - - return query.iterator(); - - } - - public int deleteAll(PlayerData player) throws SQLException { - DeleteBuilder builder = deleteBuilder(); - - builder.where().eq("player_id", player); - - return builder.delete(); - } -} diff --git a/src/main/java/me/confuser/banmanager/storage/ReportStateStorage.java b/src/main/java/me/confuser/banmanager/storage/ReportStateStorage.java deleted file mode 100644 index b4009a8fb..000000000 --- a/src/main/java/me/confuser/banmanager/storage/ReportStateStorage.java +++ /dev/null @@ -1,29 +0,0 @@ -package me.confuser.banmanager.storage; - -import com.j256.ormlite.dao.BaseDaoImpl; -import com.j256.ormlite.support.ConnectionSource; -import com.j256.ormlite.table.DatabaseTableConfig; -import com.j256.ormlite.table.TableUtils; -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.ReportState; - -import java.sql.SQLException; - -public class ReportStateStorage extends BaseDaoImpl { - - public ReportStateStorage(ConnectionSource connection) throws SQLException { - super(connection, (DatabaseTableConfig) BanManager.getPlugin().getConfiguration() - .getLocalDb() - .getTable("playerReportStates")); - - if (!this.isTableExists()) { - TableUtils.createTable(connection, tableConfig); - - create(new ReportState("Open")); - create(new ReportState("Assigned")); - create(new ReportState("Resolved")); - create(new ReportState("Closed")); - } - } - -} diff --git a/src/main/java/me/confuser/banmanager/storage/RollbackStorage.java b/src/main/java/me/confuser/banmanager/storage/RollbackStorage.java deleted file mode 100644 index 5df36f0ee..000000000 --- a/src/main/java/me/confuser/banmanager/storage/RollbackStorage.java +++ /dev/null @@ -1,46 +0,0 @@ -package me.confuser.banmanager.storage; - -import com.j256.ormlite.dao.BaseDaoImpl; -import com.j256.ormlite.dao.CloseableIterator; -import com.j256.ormlite.stmt.QueryBuilder; -import com.j256.ormlite.stmt.Where; -import com.j256.ormlite.support.ConnectionSource; -import com.j256.ormlite.table.DatabaseTableConfig; -import com.j256.ormlite.table.TableUtils; -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.RollbackData; -import me.confuser.banmanager.util.DateUtils; - -import java.sql.SQLException; - -public class RollbackStorage extends BaseDaoImpl { - - private BanManager plugin = BanManager.getPlugin(); - - public RollbackStorage(ConnectionSource connection) throws SQLException { - super(connection, (DatabaseTableConfig) BanManager.getPlugin().getConfiguration().getLocalDb() - .getTable("rollbacks")); - - if (!this.isTableExists()) { - TableUtils.createTable(connection, tableConfig); - } - } - - public CloseableIterator findRollbacks(long fromTime) throws SQLException { - if (fromTime == 0) { - return iterator(); - } - - long checkTime = fromTime + DateUtils.getTimeDiff(); - - QueryBuilder query = queryBuilder(); - Where where = query.where(); - where.ge("created", checkTime); - - query.setWhere(where); - - return query.iterator(); - - } - -} diff --git a/src/main/java/me/confuser/banmanager/storage/global/GlobalIpBanRecordStorage.java b/src/main/java/me/confuser/banmanager/storage/global/GlobalIpBanRecordStorage.java deleted file mode 100644 index 12d2832d5..000000000 --- a/src/main/java/me/confuser/banmanager/storage/global/GlobalIpBanRecordStorage.java +++ /dev/null @@ -1,39 +0,0 @@ -package me.confuser.banmanager.storage.global; - -import com.j256.ormlite.dao.BaseDaoImpl; -import com.j256.ormlite.dao.CloseableIterator; -import com.j256.ormlite.stmt.QueryBuilder; -import com.j256.ormlite.support.ConnectionSource; -import com.j256.ormlite.table.DatabaseTableConfig; -import com.j256.ormlite.table.TableUtils; -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.global.GlobalIpBanRecordData; -import me.confuser.banmanager.util.DateUtils; - -import java.sql.SQLException; - -public class GlobalIpBanRecordStorage extends BaseDaoImpl { - - public GlobalIpBanRecordStorage(ConnectionSource connection) throws SQLException { - super(connection, (DatabaseTableConfig) BanManager.getPlugin().getConfiguration() - .getGlobalDb().getTable("ipUnbans")); - - if (!this.isTableExists()) { - TableUtils.createTable(connection, tableConfig); - } - } - - public CloseableIterator findUnbans(long fromTime) throws SQLException { - if (fromTime == 0) { - return iterator(); - } - - long checkTime = fromTime + DateUtils.getTimeDiff(); - - QueryBuilder query = queryBuilder(); - query.setWhere(query.where().ge("created", checkTime)); - - return query.iterator(); - - } -} diff --git a/src/main/java/me/confuser/banmanager/storage/global/GlobalIpBanStorage.java b/src/main/java/me/confuser/banmanager/storage/global/GlobalIpBanStorage.java deleted file mode 100644 index f0e56966e..000000000 --- a/src/main/java/me/confuser/banmanager/storage/global/GlobalIpBanStorage.java +++ /dev/null @@ -1,39 +0,0 @@ -package me.confuser.banmanager.storage.global; - -import com.j256.ormlite.dao.BaseDaoImpl; -import com.j256.ormlite.dao.CloseableIterator; -import com.j256.ormlite.stmt.QueryBuilder; -import com.j256.ormlite.support.ConnectionSource; -import com.j256.ormlite.table.DatabaseTableConfig; -import com.j256.ormlite.table.TableUtils; -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.global.GlobalIpBanData; -import me.confuser.banmanager.util.DateUtils; - -import java.sql.SQLException; - -public class GlobalIpBanStorage extends BaseDaoImpl { - - public GlobalIpBanStorage(ConnectionSource connection) throws SQLException { - super(connection, (DatabaseTableConfig) BanManager.getPlugin().getConfiguration().getGlobalDb() - .getTable("ipBans")); - - if (!this.isTableExists()) { - TableUtils.createTable(connection, tableConfig); - } - } - - public CloseableIterator findBans(long fromTime) throws SQLException { - if (fromTime == 0) { - return iterator(); - } - - long checkTime = fromTime + DateUtils.getTimeDiff(); - - QueryBuilder query = queryBuilder(); - query.setWhere(query.where().ge("created", checkTime)); - - return query.iterator(); - - } -} diff --git a/src/main/java/me/confuser/banmanager/storage/global/GlobalPlayerBanRecordStorage.java b/src/main/java/me/confuser/banmanager/storage/global/GlobalPlayerBanRecordStorage.java deleted file mode 100644 index 3dbe7cf93..000000000 --- a/src/main/java/me/confuser/banmanager/storage/global/GlobalPlayerBanRecordStorage.java +++ /dev/null @@ -1,40 +0,0 @@ -package me.confuser.banmanager.storage.global; - -import com.j256.ormlite.dao.BaseDaoImpl; -import com.j256.ormlite.dao.CloseableIterator; -import com.j256.ormlite.stmt.QueryBuilder; -import com.j256.ormlite.support.ConnectionSource; -import com.j256.ormlite.table.DatabaseTableConfig; -import com.j256.ormlite.table.TableUtils; -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.global.GlobalPlayerBanRecordData; -import me.confuser.banmanager.util.DateUtils; - -import java.sql.SQLException; - -public class GlobalPlayerBanRecordStorage extends BaseDaoImpl { - - public GlobalPlayerBanRecordStorage(ConnectionSource connection) throws SQLException { - super(connection, (DatabaseTableConfig) BanManager.getPlugin().getConfiguration() - .getGlobalDb() - .getTable("playerUnbans")); - - if (!this.isTableExists()) { - TableUtils.createTable(connection, tableConfig); - } - } - - public CloseableIterator findUnbans(long fromTime) throws SQLException { - if (fromTime == 0) { - return iterator(); - } - - long checkTime = fromTime + DateUtils.getTimeDiff(); - - QueryBuilder query = queryBuilder(); - query.setWhere(query.where().ge("created", checkTime)); - - return query.iterator(); - - } -} diff --git a/src/main/java/me/confuser/banmanager/storage/global/GlobalPlayerBanStorage.java b/src/main/java/me/confuser/banmanager/storage/global/GlobalPlayerBanStorage.java deleted file mode 100644 index f2e7b5bb2..000000000 --- a/src/main/java/me/confuser/banmanager/storage/global/GlobalPlayerBanStorage.java +++ /dev/null @@ -1,39 +0,0 @@ -package me.confuser.banmanager.storage.global; - -import com.j256.ormlite.dao.BaseDaoImpl; -import com.j256.ormlite.dao.CloseableIterator; -import com.j256.ormlite.stmt.QueryBuilder; -import com.j256.ormlite.support.ConnectionSource; -import com.j256.ormlite.table.DatabaseTableConfig; -import com.j256.ormlite.table.TableUtils; -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.global.GlobalPlayerBanData; -import me.confuser.banmanager.util.DateUtils; - -import java.sql.SQLException; - -public class GlobalPlayerBanStorage extends BaseDaoImpl { - - public GlobalPlayerBanStorage(ConnectionSource connection) throws SQLException { - super(connection, (DatabaseTableConfig) BanManager.getPlugin().getConfiguration() - .getGlobalDb().getTable("playerBans")); - - if (!this.isTableExists()) { - TableUtils.createTable(connection, tableConfig); - } - } - - public CloseableIterator findBans(long fromTime) throws SQLException { - if (fromTime == 0) { - return iterator(); - } - - long checkTime = fromTime + DateUtils.getTimeDiff(); - - QueryBuilder query = queryBuilder(); - query.setWhere(queryBuilder().where().ge("created", checkTime)); - - return query.iterator(); - - } -} diff --git a/src/main/java/me/confuser/banmanager/storage/global/GlobalPlayerMuteRecordStorage.java b/src/main/java/me/confuser/banmanager/storage/global/GlobalPlayerMuteRecordStorage.java deleted file mode 100644 index 1bdbfde4e..000000000 --- a/src/main/java/me/confuser/banmanager/storage/global/GlobalPlayerMuteRecordStorage.java +++ /dev/null @@ -1,40 +0,0 @@ -package me.confuser.banmanager.storage.global; - -import com.j256.ormlite.dao.BaseDaoImpl; -import com.j256.ormlite.dao.CloseableIterator; -import com.j256.ormlite.stmt.QueryBuilder; -import com.j256.ormlite.support.ConnectionSource; -import com.j256.ormlite.table.DatabaseTableConfig; -import com.j256.ormlite.table.TableUtils; -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.global.GlobalPlayerMuteRecordData; -import me.confuser.banmanager.util.DateUtils; - -import java.sql.SQLException; - -public class GlobalPlayerMuteRecordStorage extends BaseDaoImpl { - - public GlobalPlayerMuteRecordStorage(ConnectionSource connection) throws SQLException { - super(connection, (DatabaseTableConfig) BanManager.getPlugin().getConfiguration() - .getGlobalDb() - .getTable("playerUnmutes")); - - if (!this.isTableExists()) { - TableUtils.createTable(connection, tableConfig); - } - } - - public CloseableIterator findUnmutes(long fromTime) throws SQLException { - if (fromTime == 0) { - return iterator(); - } - - long checkTime = fromTime + DateUtils.getTimeDiff(); - - QueryBuilder query = queryBuilder(); - query.setWhere(query.where().ge("created", checkTime)); - - return query.iterator(); - - } -} diff --git a/src/main/java/me/confuser/banmanager/storage/global/GlobalPlayerMuteStorage.java b/src/main/java/me/confuser/banmanager/storage/global/GlobalPlayerMuteStorage.java deleted file mode 100644 index d2d076f96..000000000 --- a/src/main/java/me/confuser/banmanager/storage/global/GlobalPlayerMuteStorage.java +++ /dev/null @@ -1,48 +0,0 @@ -package me.confuser.banmanager.storage.global; - -import com.j256.ormlite.dao.BaseDaoImpl; -import com.j256.ormlite.dao.CloseableIterator; -import com.j256.ormlite.stmt.QueryBuilder; -import com.j256.ormlite.support.ConnectionSource; -import com.j256.ormlite.table.DatabaseTableConfig; -import com.j256.ormlite.table.TableUtils; -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.global.GlobalPlayerMuteData; -import me.confuser.banmanager.util.DateUtils; - -import java.sql.SQLException; - -public class GlobalPlayerMuteStorage extends BaseDaoImpl { - - public GlobalPlayerMuteStorage(ConnectionSource connection) throws SQLException { - super(connection, (DatabaseTableConfig) BanManager.getPlugin().getConfiguration() - .getGlobalDb().getTable("playerMutes")); - - if (!this.isTableExists()) { - TableUtils.createTable(connection, tableConfig); - } else { - // Attempt to add new columns - try { - String update = "ALTER TABLE " + tableConfig - .getTableName() + " ADD COLUMN `soft` TINYINT(1)," + - " ADD KEY `" + tableConfig.getTableName() + "_soft_idx` (`soft`)"; - executeRawNoArgs(update); - } catch (SQLException e) { - } - } - } - - public CloseableIterator findMutes(long fromTime) throws SQLException { - if (fromTime == 0) { - return iterator(); - } - - long checkTime = fromTime + DateUtils.getTimeDiff(); - - QueryBuilder query = queryBuilder(); - query.setWhere(query.where().ge("created", checkTime)); - - return query.iterator(); - - } -} diff --git a/src/main/java/me/confuser/banmanager/storage/global/GlobalPlayerNoteStorage.java b/src/main/java/me/confuser/banmanager/storage/global/GlobalPlayerNoteStorage.java deleted file mode 100644 index f7642c3a5..000000000 --- a/src/main/java/me/confuser/banmanager/storage/global/GlobalPlayerNoteStorage.java +++ /dev/null @@ -1,39 +0,0 @@ -package me.confuser.banmanager.storage.global; - -import com.j256.ormlite.dao.BaseDaoImpl; -import com.j256.ormlite.dao.CloseableIterator; -import com.j256.ormlite.stmt.QueryBuilder; -import com.j256.ormlite.support.ConnectionSource; -import com.j256.ormlite.table.DatabaseTableConfig; -import com.j256.ormlite.table.TableUtils; -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.global.GlobalPlayerNoteData; -import me.confuser.banmanager.util.DateUtils; - -import java.sql.SQLException; - -public class GlobalPlayerNoteStorage extends BaseDaoImpl { - - public GlobalPlayerNoteStorage(ConnectionSource connection) throws SQLException { - super(connection, (DatabaseTableConfig) BanManager.getPlugin().getConfiguration() - .getGlobalDb().getTable("playerNotes")); - - if (!this.isTableExists()) { - TableUtils.createTable(connection, tableConfig); - } - } - - public CloseableIterator findNotes(long fromTime) throws SQLException { - if (fromTime == 0) { - return iterator(); - } - - long checkTime = fromTime + DateUtils.getTimeDiff(); - - QueryBuilder query = queryBuilder(); - query.setWhere(queryBuilder().where().ge("created", checkTime)); - - return query.iterator(); - - } -} diff --git a/src/main/java/me/confuser/banmanager/storage/mysql/ConvertMyISAMToInnoDb.java b/src/main/java/me/confuser/banmanager/storage/mysql/ConvertMyISAMToInnoDb.java deleted file mode 100644 index bceaffb3c..000000000 --- a/src/main/java/me/confuser/banmanager/storage/mysql/ConvertMyISAMToInnoDb.java +++ /dev/null @@ -1,66 +0,0 @@ -package me.confuser.banmanager.storage.mysql; - -import com.j256.ormlite.field.SqlType; -import com.j256.ormlite.stmt.StatementBuilder; -import com.j256.ormlite.support.CompiledStatement; -import com.j256.ormlite.support.ConnectionSource; -import com.j256.ormlite.support.DatabaseConnection; -import com.j256.ormlite.support.DatabaseResults; -import com.j256.ormlite.table.DatabaseTableConfig; -import me.confuser.banmanager.BanManager; - -import java.sql.SQLException; -import java.util.HashMap; -import java.util.Map; - -public class ConvertMyISAMToInnoDb { - private BanManager plugin = BanManager.getPlugin(); - - public ConvertMyISAMToInnoDb(ConnectionSource db, HashMap> tables) { - DatabaseConnection connection = null; - - try { - connection = db.getReadWriteConnection(); - } catch (SQLException e) { - e.printStackTrace(); - return; - } - - for (Map.Entry> entry : tables.entrySet()) { - final DatabaseResults result; - final String table = entry.getValue().getTableName(); - - try { - CompiledStatement statement = connection.compileStatement("SHOW TABLE STATUS WHERE Name = ?", StatementBuilder - .StatementType.SELECT, null, DatabaseConnection.DEFAULT_RESULT_FLAGS); - - statement.setObject(0, table, SqlType.STRING); - - result = statement.runQuery(null); - } catch (SQLException e) { - e.printStackTrace(); - continue; - } - - try { - while (result.next()) { - final String engine = result.getString(1); - - if (engine.equals("MyISAM")) { - plugin.getLogger().info("Converting " + entry.getKey() + " table from MyISAM to InnoDB"); - - connection.executeStatement("ALTER TABLE " + table + " ENGINE=InnoDB;", DatabaseConnection.DEFAULT_RESULT_FLAGS); - } - } - } catch (SQLException e) { - e.printStackTrace(); - } finally { - result.closeQuietly(); - } - - } - - connection.closeQuietly(); - } - -} diff --git a/src/main/java/me/confuser/banmanager/storage/mysql/MySQLDatabase.java b/src/main/java/me/confuser/banmanager/storage/mysql/MySQLDatabase.java deleted file mode 100644 index e9ee8f098..000000000 --- a/src/main/java/me/confuser/banmanager/storage/mysql/MySQLDatabase.java +++ /dev/null @@ -1,10 +0,0 @@ -package me.confuser.banmanager.storage.mysql; - -import com.j256.ormlite.db.MysqlDatabaseType; - -public class MySQLDatabase extends MysqlDatabaseType { - - public MySQLDatabase() { - setCreateTableSuffix("ENGINE=InnoDB DEFAULT CHARSET=utf8"); - } -} diff --git a/src/main/java/me/confuser/banmanager/util/CommandParser.java b/src/main/java/me/confuser/banmanager/util/CommandParser.java deleted file mode 100644 index 1828780ff..000000000 --- a/src/main/java/me/confuser/banmanager/util/CommandParser.java +++ /dev/null @@ -1,51 +0,0 @@ -package me.confuser.banmanager.util; - -import com.sampullara.cli.Args; -import com.sampullara.cli.Argument; -import lombok.Getter; -import me.confuser.banmanager.util.parsers.Reason; -import org.apache.commons.lang.ArrayUtils; -import org.apache.commons.lang.StringUtils; - -import java.util.List; - -public class CommandParser { - - @Getter - protected String[] args; - - @Argument(alias = "s") - @Getter - private boolean silent = false; - - @Argument(alias = "st") - @Getter - private boolean soft = false; - - @Getter - private Reason reason; - - - public CommandParser(String[] args) { - List parsedArgs = Args.parse(this, args, false); - this.args = parsedArgs.toArray(new String[parsedArgs.size()]); - } - - public CommandParser(String[] args, int start) { - reason = CommandUtils.getReason(start, args); - String[] newArgs = reason.getMessage().split(" "); - - if (args.length > start) { - // @TODO inefficient - for (int i = start - 1; i >= 0; i--) { - newArgs = (String[]) ArrayUtils.add(newArgs, 0, args[i]); - } - } - - List parsedArgs = Args.parse(this, newArgs, false); - this.args = parsedArgs.toArray(new String[parsedArgs.size()]); - - reason.setMessage(StringUtils.join(this.args, " ", start, this.args.length)); - } - -} diff --git a/src/main/java/me/confuser/banmanager/util/CommandUtils.java b/src/main/java/me/confuser/banmanager/util/CommandUtils.java deleted file mode 100644 index 090706768..000000000 --- a/src/main/java/me/confuser/banmanager/util/CommandUtils.java +++ /dev/null @@ -1,244 +0,0 @@ -package me.confuser.banmanager.util; - -import com.google.common.net.InetAddresses; -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.commands.report.ReportList; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.banmanager.data.PlayerNoteData; -import me.confuser.banmanager.data.PlayerReportData; -import me.confuser.banmanager.util.parsers.Reason; -import me.confuser.bukkitutil.Message; -import me.rayzr522.jsonmessage.JSONMessage; -import org.apache.commons.lang.StringUtils; -import org.apache.commons.lang.time.FastDateFormat; -import org.bukkit.Bukkit; -import org.bukkit.command.BlockCommandSender; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.permissions.Permissible; - -import java.sql.SQLException; -import java.util.*; - -public class CommandUtils { - - private static BanManager plugin = BanManager.getPlugin(); - - public static void dispatchCommand(CommandSender sender, String command) { - Bukkit.dispatchCommand(sender, command); - } - - public static void dispatchCommands(CommandSender sender, List commands) { - for (String command : commands) { - dispatchCommand(sender, command); - } - } - - public static void handleMultipleNames(CommandSender sender, String commandName, String[] args) { - String[] names = splitNameDelimiter(args[0]); - String argsStr = StringUtils.join(args, " ", 1, args.length); - ArrayList commands = new ArrayList<>(names.length); - - for (String name : names) { - if (name.length() == 0) continue; - commands.add(commandName + " " + name + " " + argsStr); - } - - dispatchCommands(sender, commands); - } - - public static boolean isValidNameDelimiter(String names) { - return names.contains("|") || names.contains(","); - } - - public static String[] splitNameDelimiter(String str) { - String delimiter; - - if (str.contains("|")) { - delimiter = "\\|"; - } else { - delimiter = ","; - } - - return str.split(delimiter); - } - - public static void broadcast(String message, String permission) { - Set permissibles = Bukkit.getPluginManager().getPermissionSubscriptions("bukkit.broadcast.user"); - for (Permissible permissible : permissibles) { - if (!(permissible instanceof BlockCommandSender) && (permissible instanceof CommandSender) && permissible - .hasPermission(permission)) { - CommandSender user = (CommandSender) permissible; - user.sendMessage(message); - } - } - } - - public static void broadcast(JSONMessage message, String permission) { - Set permissibles = Bukkit.getPluginManager().getPermissionSubscriptions("bukkit.broadcast.user"); - for (Permissible permissible : permissibles) { - if (permissible instanceof Player && permissible.hasPermission(permission)) { - message.send((Player) permissible); - } - } - } - - public static void broadcast(String message, String permission, CommandSender sender) { - broadcast(message, permission); - - if (!sender.hasPermission(permission)) sender.sendMessage(message); - } - - public static Reason getReason(int start, String[] args) { - String reason = StringUtils.join(args, " ", start, args.length); - List notes = new ArrayList<>(); - - String[] matches = null; - if (plugin.getConfiguration().isCreateNoteReasons()) { - matches = StringUtils.substringsBetween(reason, "(", ")"); - } - - if (matches != null) notes = Arrays.asList(matches); - - for (int i = start; i < args.length; i++) { - if (!args[i].startsWith("#")) continue; - - String key = args[i].replace("#", ""); - String replace = BanManager.getPlugin().getReasonsConfig().getReason(key); - - if (replace != null) reason = reason.replace("#" + key, replace); - } - - for (String note : notes) { - reason = reason.replace("(" + note + ")", ""); - } - - reason = reason.trim(); - - return new Reason(reason, notes); - } - - public static void handlePrivateNotes(PlayerData player, PlayerData actor, Reason reason) { - if (plugin.getConfiguration().isCreateNoteReasons()) - if (reason.getNotes().size() == 0) return; - - for (String note : reason.getNotes()) { - try { - plugin.getPlayerNoteStorage().create(new PlayerNoteData(player, actor, note)); - } catch (SQLException e) { - e.printStackTrace(); - } - } - - } - - public static boolean isUUID(String player) { - return player.length() > 16; - } - - public static PlayerData getPlayer(CommandSender sender, String playerName, boolean mojangLookup) { - boolean isUUID = isUUID(playerName); - PlayerData player = null; - - if (isUUID) { - try { - player = plugin.getPlayerStorage().queryForId(UUIDUtils.toBytes(UUID.fromString(playerName))); - } catch (SQLException e) { - sender.sendMessage(Message.get("sender.error.exception").toString()); - e.printStackTrace(); - } - } else { - player = plugin.getPlayerStorage().retrieve(playerName, mojangLookup); - } - - return player; - } - - public static Player getPlayer(UUID uuid) { - if (plugin.getConfiguration().isOnlineMode()) return plugin.getServer().getPlayer(uuid); - - for (Player onlinePlayer : plugin.getServer().getOnlinePlayers()) { - if (UUIDUtils.getUUID(onlinePlayer).equals(uuid)) return onlinePlayer; - } - - return null; - } - - public static PlayerData getPlayer(CommandSender sender, String playerName) { - return getPlayer(sender, playerName, true); - } - - public static PlayerData getActor(CommandSender sender) { - PlayerData actor = null; - - if (sender instanceof Player) { - try { - actor = plugin.getPlayerStorage().queryForId(UUIDUtils.toBytes((Player) sender)); - } catch (SQLException e) { - sender.sendMessage(Message.get("sender.error.exception").toString()); - e.printStackTrace(); - } - } else { - actor = plugin.getPlayerStorage().getConsole(); - } - - return actor; - } - - public static Long getIp(String ipStr) { - final boolean isName = !InetAddresses.isInetAddress(ipStr); - Long ip = null; - - if (isName) { - PlayerData player = plugin.getPlayerStorage().retrieve(ipStr, false); - if (player == null) return ip; - - ip = player.getIp(); - } else { - ip = IPUtils.toLong(ipStr); - } - - return ip; - } - - public static void sendReportList(ReportList reports, CommandSender sender, int page) { - String dateTimeFormat = Message.getString("report.list.row.dateTimeFormat"); - FastDateFormat dateFormatter = FastDateFormat.getInstance(dateTimeFormat); - - Message.get("report.list.row.header") - .set("page", page) - .set("maxPage", reports.getMaxPage()) - .set("count", reports.getCount()) - .sendTo(sender); - - for (PlayerReportData report : reports.getList()) { - String message = Message.get("report.list.row.all") - .set("id", report.getId()) - .set("state", report.getState().getName()) - .set("player", report.getPlayer().getName()) - .set("actor", report.getActor().getName()) - .set("reason", report.getReason()) - .set("created", dateFormatter - .format(report.getCreated() * 1000L)) - .set("updated", dateFormatter - .format(report.getUpdated() * 1000L)).toString(); - - if (sender instanceof Player) { - JSONMessage.create(message).runCommand("/reports info " + report.getId()).send((Player) sender); - } else { - sender.sendMessage(message); - } - } - } - - public static void handlePunishmentCreateException(SQLException e, CommandSender sender, Message duplicateMessage) { - // For some reason ORMLite hides the error code (returns 0 instead of 1062) - if (e.getCause().getMessage().startsWith("Duplicate entry")) { - duplicateMessage.sendTo(sender); - return; - } - - Message.get("sender.error.exception").sendTo(sender); - e.printStackTrace(); - } -} diff --git a/src/main/java/me/confuser/banmanager/util/IPUtils.java b/src/main/java/me/confuser/banmanager/util/IPUtils.java deleted file mode 100644 index 4841c5616..000000000 --- a/src/main/java/me/confuser/banmanager/util/IPUtils.java +++ /dev/null @@ -1,81 +0,0 @@ -package me.confuser.banmanager.util; - -import org.apache.commons.lang.StringUtils; -import org.apache.commons.net.util.SubnetUtils; - -import java.net.InetAddress; -import java.net.UnknownHostException; - -public class IPUtils { - - public static String getIP(InetAddress ip) { - return ip.getHostAddress().replace("/", ""); - } - - public static long toLong(String ip) { - String[] addressArray = ip.split("\\."); - long result = 0; - - for (int i = 0; i < addressArray.length; i++) { - int power = 3 - i; - - result += ((Integer.parseInt(addressArray[i]) % 256 * Math.pow(256, power))); - } - - return result; - } - - public static long toLong(InetAddress ip) { - return toLong(getIP(ip)); - } - - public static String toString(long ip) { - return ((ip >> 24) & 0xFF) + "." + ((ip >> 16) & 0xFF) + "." + ((ip >> 8) & 0xFF) + "." + (ip & 0xFF); - } - - public static InetAddress toInetAddress(long ip) throws UnknownHostException { - return InetAddress.getByName(toString(ip)); - } - - public static long[] getRangeFromCidrNotation(String ipStr) { - SubnetUtils.SubnetInfo info; - try { - info = new SubnetUtils(ipStr).getInfo(); - } catch (IllegalArgumentException e) { - return null; - } - - return new long[] { IPUtils.toLong(info.getLowAddress()), IPUtils.toLong(info.getHighAddress()) }; - } - - public static long[] getRangeFromWildcard(String ipStr) { - String[] ocelots = ipStr.split("\\."); - - if (ocelots.length != 4) return null; - - String[] fromIp = new String[4]; - String[] toIp = new String[4]; - - for (int i = 0; i < ocelots.length; i++) { - if (ocelots[i].equals("*")) { - fromIp[i] = "0"; - } else { - fromIp[i] = ocelots[i]; - } - } - - for (int i = 0; i < ocelots.length; i++) { - if (ocelots[i].equals("*")) { - toIp[i] = "255"; - } else { - toIp[i] = ocelots[i]; - } - } - - long fromIpAddress = IPUtils.toLong(StringUtils.join(fromIp, ".")); - long toIpAddress = IPUtils.toLong(StringUtils.join(toIp, ".")); - - return new long[] { fromIpAddress, toIpAddress }; - } - -} diff --git a/src/main/java/me/confuser/banmanager/util/JSONCommandUtils.java b/src/main/java/me/confuser/banmanager/util/JSONCommandUtils.java deleted file mode 100644 index b44fc8888..000000000 --- a/src/main/java/me/confuser/banmanager/util/JSONCommandUtils.java +++ /dev/null @@ -1,60 +0,0 @@ -package me.confuser.banmanager.util; - -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.data.PlayerBanData; -import me.confuser.banmanager.data.PlayerData; -import me.confuser.bukkitutil.Message; -import me.rayzr522.jsonmessage.JSONMessage; -import org.bukkit.ChatColor; - -import java.sql.SQLException; -import java.util.List; - -public class JSONCommandUtils { - private static BanManager plugin = BanManager.getPlugin(); - - public static JSONMessage alts(List players) { - JSONMessage message = JSONMessage.create(); - int index = 0; - - for (PlayerData player : players) { - ChatColor colour = ChatColor.GREEN; - - if (plugin.getPlayerBanStorage().isBanned(player.getUUID())) { - PlayerBanData ban = plugin.getPlayerBanStorage().getBan(player.getUUID()); - - if (ban.getExpires() == 0) { - colour = ChatColor.RED; - } else { - colour = ChatColor.GOLD; - } - } else { - try { - if (plugin.getPlayerBanRecordStorage().getCount(player) != 0) { - colour = ChatColor.YELLOW; - } - } catch (SQLException e) { - e.printStackTrace(); - } - } - - message.then(player.getName()).color(colour).runCommand("/bminfo " + player.getName()); - - if (index != players.size() - 1) { - message.then(", "); - } - - index++; - } - - return message; - } - - public static JSONMessage notesAmount(String playerName, Message text) { - JSONMessage message = JSONMessage.create(); - - message.then(text.set("player", playerName).toString()).runCommand("/notes " + playerName); - - return message; - } -} diff --git a/src/main/java/me/confuser/banmanager/util/UUIDUtils.java b/src/main/java/me/confuser/banmanager/util/UUIDUtils.java deleted file mode 100644 index e61e5e19a..000000000 --- a/src/main/java/me/confuser/banmanager/util/UUIDUtils.java +++ /dev/null @@ -1,198 +0,0 @@ -package me.confuser.banmanager.util; - -import com.google.common.collect.ImmutableList; -import me.confuser.banmanager.BanManager; -import org.apache.commons.lang.StringUtils; -import org.bukkit.entity.Player; -import org.bukkit.event.player.AsyncPlayerPreLoginEvent; -import org.json.simple.JSONArray; -import org.json.simple.JSONObject; -import org.json.simple.parser.JSONParser; - -import java.io.InputStreamReader; -import java.io.OutputStream; -import java.io.UnsupportedEncodingException; -import java.net.HttpURLConnection; -import java.net.URL; -import java.nio.ByteBuffer; -import java.util.*; -import java.util.Map.Entry; -import java.util.concurrent.Callable; - -/** - * Based on UUIDFetcher by evilmidget38 - */ -public class UUIDUtils implements Callable> { - - private static final double PROFILES_PER_REQUEST = 100; - private static final String PROFILE_URL = "https://api.mojang.com/profiles/minecraft"; - private final static JSONParser jsonParser = new JSONParser(); - private final List names; - private final boolean rateLimiting; - - public UUIDUtils(List names, boolean rateLimiting) { - this.names = ImmutableList.copyOf(names); - this.rateLimiting = rateLimiting; - } - - public UUIDUtils(Set names, boolean rateLimiting) { - this.names = ImmutableList.copyOf(names); - this.rateLimiting = rateLimiting; - } - - public UUIDUtils(List names) { - this(names, true); - } - - private static void writeBody(HttpURLConnection connection, String body) throws Exception { - OutputStream stream = connection.getOutputStream(); - stream.write(body.getBytes()); - stream.flush(); - stream.close(); - } - - private static HttpURLConnection createConnection(String urlStr, String method) throws Exception { - URL url = new URL(urlStr); - HttpURLConnection connection = (HttpURLConnection) url.openConnection(); - connection.setRequestMethod(method); - connection.setRequestProperty("Content-Type", "application/json"); - connection.setUseCaches(false); - connection.setDoInput(true); - - if (method.equals("POST")) connection.setDoOutput(true); - return connection; - } - - private static UUID getUUID(String id) { - return UUID.fromString(id.substring(0, 8) + "-" + id.substring(8, 12) + "-" + id.substring(12, 16) + "-" + id - .substring(16, 20) + "-" + id.substring(20, 32)); - } - - public static byte[] toBytes(UUID uuid) { - ByteBuffer byteBuffer = ByteBuffer.wrap(new byte[16]); - byteBuffer.putLong(uuid.getMostSignificantBits()); - byteBuffer.putLong(uuid.getLeastSignificantBits()); - return byteBuffer.array(); - } - - public static byte[] toBytes(Player player) { - return toBytes(getUUID(player)); - } - - public static UUID fromBytes(byte[] array) { - if (array.length != 16) { - throw new IllegalArgumentException("Illegal byte array length: " + array.length); - } - ByteBuffer byteBuffer = ByteBuffer.wrap(array); - long mostSignificant = byteBuffer.getLong(); - long leastSignificant = byteBuffer.getLong(); - return new UUID(mostSignificant, leastSignificant); - } - - public static UUIDProfile getUUIDOf(String name) throws Exception { - Map players = new UUIDUtils(Collections.singletonList(name)).call(); - - if (players.isEmpty()) { - return null; - } - - Entry player = players.entrySet().iterator().next(); - - return new UUIDProfile(player.getKey(), player.getValue()); - } - - public static String getCurrentName(UUID uuid) throws Exception { - BanManager.plugin.getLogger().info("Requesting name for " + uuid.toString()); - String url = "https://api.mojang.com/user/profiles/" + uuid.toString().replace("-", "") + "/names"; - - HttpURLConnection connection = createConnection(url, "GET"); - - int status = connection.getResponseCode(); - - if (status != 200) throw new Exception("Error retrieving name from " + url); - - JSONArray array = (JSONArray) jsonParser.parse(new InputStreamReader(connection.getInputStream())); - - if (array.size() == 0) return null; - - JSONObject jsonProfile = (JSONObject) array.get(array.size() - 1); - - return (String) jsonProfile.get("name"); - } - - public static UUIDProfile getUUIDProfile(String name, long time) throws Exception { - if (!BanManager.getPlugin().getConfiguration().isOnlineMode()) - return new UUIDProfile(name, createUUID(name)); - - BanManager.plugin.getLogger().info("Requesting UUID for " + name + " at " + time); - String url = "https://api.mojang.com/users/profiles/minecraft/" + name + "?at=" + time; - - HttpURLConnection connection = createConnection(url, "GET"); - - int status = connection.getResponseCode(); - - if (status != 200) throw new Exception("Error retrieving name from " + url); - - JSONObject obj = (JSONObject) jsonParser.parse(new InputStreamReader(connection.getInputStream())); - - if (obj.size() == 0) return null; - - return new UUIDProfile((String) obj.get("name"), getUUID((String) obj.get("id"))); - } - - public static UUID getUUID(Player player) { - if (BanManager.getPlugin().getConfiguration().isOnlineMode()) return player.getUniqueId(); - - return createUUID(player.getName()); - } - - public static UUID getUUID(AsyncPlayerPreLoginEvent event) { - if (BanManager.getPlugin().getConfiguration().isOnlineMode()) return event.getUniqueId(); - - return createUUID(event.getName()); - } - - private static UUID createUUID(String s) { - try { - return UUID.nameUUIDFromBytes(("OfflinePlayer:" + s.toLowerCase()).getBytes("UTF-8")); - } catch (UnsupportedEncodingException e) { - return null; - } - } - - public Map call() throws Exception { - - Map uuidMap = new HashMap<>(); - if (!BanManager.getPlugin().getConfiguration().isOnlineMode()) { - BanManager.plugin.getLogger().info("Generating offline UUIDs for " + StringUtils.join(names, ',')); - - for (String s : names) { - uuidMap.put(s, createUUID(s)); - } - - return uuidMap; - } - - BanManager.plugin.getLogger().info("Requesting UUIDs for " + StringUtils.join(names, ',')); - - int requests = (int) Math.ceil(names.size() / PROFILES_PER_REQUEST); - for (int i = 0; i < requests; i++) { - HttpURLConnection connection = createConnection(PROFILE_URL, "POST"); - String body = JSONArray.toJSONString(names.subList(i * 100, Math.min((i + 1) * 100, names.size()))); - writeBody(connection, body); - JSONArray array = (JSONArray) jsonParser.parse(new InputStreamReader(connection.getInputStream())); - for (Object profile : array) { - JSONObject jsonProfile = (JSONObject) profile; - String id = (String) jsonProfile.get("id"); - String name = (String) jsonProfile.get("name"); - UUID uuid = UUIDUtils.getUUID(id); - uuidMap.put(name, uuid); - } - if (rateLimiting && i != requests - 1) { - // Try to avoid rate limit - Thread.sleep(10000L); - } - } - return uuidMap; - } -} diff --git a/src/main/java/me/confuser/banmanager/util/UpdateUtils.java b/src/main/java/me/confuser/banmanager/util/UpdateUtils.java deleted file mode 100644 index 6f166aa49..000000000 --- a/src/main/java/me/confuser/banmanager/util/UpdateUtils.java +++ /dev/null @@ -1,15 +0,0 @@ -package me.confuser.banmanager.util; - -import me.confuser.banmanager.BanManager; -import net.gravitydevelopment.updater.Updater; - -import java.io.File; - -public class UpdateUtils { - - public static boolean isUpdateAvailable(File jarFile) { - Updater updater = new Updater(BanManager.getPlugin(), 41473, jarFile, Updater.UpdateType.NO_DOWNLOAD, false); - - return updater.getResult() == Updater.UpdateResult.UPDATE_AVAILABLE; - } -} diff --git a/src/main/java/me/confuser/banmanager/util/parsers/InfoCommandParser.java b/src/main/java/me/confuser/banmanager/util/parsers/InfoCommandParser.java deleted file mode 100644 index 5d08cbe3b..000000000 --- a/src/main/java/me/confuser/banmanager/util/parsers/InfoCommandParser.java +++ /dev/null @@ -1,47 +0,0 @@ -package me.confuser.banmanager.util.parsers; - -import com.sampullara.cli.Args; -import com.sampullara.cli.Argument; -import lombok.Getter; - -import java.util.List; - -public class InfoCommandParser { - - @Getter - private final String[] args; - - @Argument(alias = "k") - @Getter - private boolean kicks = false; - - @Argument(alias = "w") - @Getter - private boolean warnings = false; - - @Argument(alias = "b") - @Getter - private boolean bans = false; - - @Argument(alias = "m") - @Getter - private boolean mutes = false; - - @Argument(alias = "n") - @Getter - private boolean notes = false; - - @Argument(alias = "t") - @Getter - private String time; - - @Argument(alias = "i") - @Getter - private Integer ips; - - public InfoCommandParser(String[] args) throws IllegalArgumentException { - List parsedArgs = Args.parse(this, args, false); - this.args = parsedArgs.toArray(new String[parsedArgs.size()]); - } - -} diff --git a/src/main/java/me/confuser/banmanager/util/parsers/UnbanCommandParser.java b/src/main/java/me/confuser/banmanager/util/parsers/UnbanCommandParser.java deleted file mode 100644 index 414ba137f..000000000 --- a/src/main/java/me/confuser/banmanager/util/parsers/UnbanCommandParser.java +++ /dev/null @@ -1,49 +0,0 @@ -package me.confuser.banmanager.util.parsers; - -import com.sampullara.cli.Args; -import com.sampullara.cli.Argument; -import lombok.Getter; -import me.confuser.banmanager.util.CommandUtils; -import org.apache.commons.lang.ArrayUtils; -import org.apache.commons.lang.StringUtils; - -import java.util.List; - -public class UnbanCommandParser { - - @Getter - protected String[] args; - - @Argument(alias = "d") - @Getter - private boolean delete = false; - - @Getter - private Reason reason; - - // @TODO Reduce duplication with CommandParser - public UnbanCommandParser(String[] args, int start) { - reason = CommandUtils.getReason(start, args); - - if (reason.getMessage().length() == 0) { - List parsedArgs = Args.parse(this, args, false); - this.args = parsedArgs.toArray(new String[parsedArgs.size()]); - - return; - } - - String[] newArgs = reason.getMessage().split(" "); - - if (args.length > start) { - // @TODO inefficient - for (int i = start - 1; i >= 0; i--) { - newArgs = (String[]) ArrayUtils.add(newArgs, 0, args[i]); - } - } - - List parsedArgs = Args.parse(this, newArgs, false); - this.args = parsedArgs.toArray(new String[parsedArgs.size()]); - - reason.setMessage(StringUtils.join(this.args, " ", start, this.args.length)); - } -} diff --git a/src/main/java/me/confuser/banmanager/util/parsers/WarnCommandParser.java b/src/main/java/me/confuser/banmanager/util/parsers/WarnCommandParser.java deleted file mode 100644 index 2c2f434ab..000000000 --- a/src/main/java/me/confuser/banmanager/util/parsers/WarnCommandParser.java +++ /dev/null @@ -1,45 +0,0 @@ -package me.confuser.banmanager.util.parsers; - -import com.sampullara.cli.Args; -import com.sampullara.cli.Argument; -import lombok.Getter; -import me.confuser.banmanager.util.CommandUtils; -import org.apache.commons.lang.ArrayUtils; -import org.apache.commons.lang.StringUtils; - -import java.util.List; - -public class WarnCommandParser { - - @Getter - protected String[] args; - - @Argument(alias = "s") - @Getter - private boolean silent = false; - - @Argument(alias = "p") - @Getter - private Double points = 1D; - - @Getter - private Reason reason; - - // @TODO Reduce duplication with CommandParser - public WarnCommandParser(String[] args, int start) { - reason = CommandUtils.getReason(start, args); - String[] newArgs = reason.getMessage().split(" "); - - if (args.length > start) { - // @TODO inefficient - for (int i = start - 1; i >= 0; i--) { - newArgs = (String[]) ArrayUtils.add(newArgs, 0, args[i]); - } - } - - List parsedArgs = Args.parse(this, newArgs, false); - this.args = parsedArgs.toArray(new String[parsedArgs.size()]); - - reason.setMessage(StringUtils.join(this.args, " ", start, this.args.length)); - } -} diff --git a/src/main/resources/geoip.yml b/src/main/resources/geoip.yml deleted file mode 100644 index 8bdb2bef9..000000000 --- a/src/main/resources/geoip.yml +++ /dev/null @@ -1,12 +0,0 @@ -enabled: false -download: - city: 'https://geolite.maxmind.com/download/geoip/database/GeoLite2-City.mmdb.gz' - country: 'https://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.mmdb.gz' - lastUpdated: 0 -# Allow only certain countries on the server -countries: -# blacklist or whitelist - type: 'blacklist' -# Use ISO codes, https://www.iso.org/obp/ui/#search e.g. United Kingdom is GB - list: - # - GB diff --git a/src/test/java/me/confuser/banmanager/test/util/parsers/InfoCommandParserTest.java b/src/test/java/me/confuser/banmanager/test/util/parsers/InfoCommandParserTest.java deleted file mode 100644 index a1d0e7f71..000000000 --- a/src/test/java/me/confuser/banmanager/test/util/parsers/InfoCommandParserTest.java +++ /dev/null @@ -1,112 +0,0 @@ -package me.confuser.banmanager.test.util.parsers; - -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.configs.DefaultConfig; -import me.confuser.banmanager.util.parsers.InfoCommandParser; -import org.bukkit.configuration.InvalidConfigurationException; -import org.bukkit.configuration.file.YamlConfiguration; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mockito; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; - -import java.io.File; -import java.io.IOException; - -import static org.junit.Assert.assertEquals; - -@RunWith(PowerMockRunner.class) -@PrepareForTest(fullyQualifiedNames = "me.confuser.banmanager.*") -public class InfoCommandParserTest { - - @Before - public void setup() throws IOException, InvalidConfigurationException { - BanManager plugin = Mockito.mock(BanManager.class); - - PowerMockito.mockStatic(BanManager.class); - Mockito.when(BanManager.getPlugin()).thenReturn(plugin); - - File configFile = new File(getClass().getResource("/config.yml").getPath()); - - YamlConfiguration configuration = new YamlConfiguration(); - configuration.load(configFile.getAbsolutePath()); - - DefaultConfig defaultConfig = new DefaultConfig(configFile); - - Mockito.doReturn(configuration).when(plugin).getConfig(); - Mockito.doReturn(defaultConfig).when(plugin).getConfiguration(); - } - - @Test - public void parsesKicksFlag() { - String[] args = new String[] { "confuser", "-k" }; - InfoCommandParser parser = new InfoCommandParser(args); - - assert (parser.isKicks()); - assertEquals("confuser", parser.getArgs()[0]); - assertEquals(1, parser.getArgs().length); - } - - @Test - public void parsesWarningsFlag() { - String[] args = new String[] { "confuser", "-w" }; - InfoCommandParser parser = new InfoCommandParser(args); - - assert (parser.isWarnings()); - assertEquals("confuser", parser.getArgs()[0]); - assertEquals(1, parser.getArgs().length); - } - - @Test - public void parsesBansFlag() { - String[] args = new String[] { "confuser", "-b" }; - InfoCommandParser parser = new InfoCommandParser(args); - - assert (parser.isBans()); - assertEquals("confuser", parser.getArgs()[0]); - assertEquals(1, parser.getArgs().length); - } - - @Test - public void parsesMutesFlag() { - String[] args = new String[] { "confuser", "-m" }; - InfoCommandParser parser = new InfoCommandParser(args); - - assert (parser.isMutes()); - assertEquals("confuser", parser.getArgs()[0]); - assertEquals(1, parser.getArgs().length); - } - - @Test - public void parsesNotesFlag() { - String[] args = new String[] { "confuser", "-n" }; - InfoCommandParser parser = new InfoCommandParser(args); - - assert (parser.isNotes()); - assertEquals("confuser", parser.getArgs()[0]); - assertEquals(1, parser.getArgs().length); - } - - @Test - public void parsesTimeFlag() { - String[] args = new String[] { "confuser", "-t", "5d" }; - InfoCommandParser parser = new InfoCommandParser(args); - - assertEquals("confuser", parser.getArgs()[0]); - assertEquals("5d", parser.getTime()); - assertEquals(1, parser.getArgs().length); - } - - @Test - public void parsesIpsFlag() { - String[] args = new String[] { "confuser", "-i", "5" }; - InfoCommandParser parser = new InfoCommandParser(args); - - assertEquals("confuser", parser.getArgs()[0]); - assertEquals(5, parser.getIps(), 0); - assertEquals(1, parser.getArgs().length); - } -} diff --git a/src/test/java/me/confuser/banmanager/test/util/parsers/UnbanCommandParserTest.java b/src/test/java/me/confuser/banmanager/test/util/parsers/UnbanCommandParserTest.java deleted file mode 100644 index 85d6d50a4..000000000 --- a/src/test/java/me/confuser/banmanager/test/util/parsers/UnbanCommandParserTest.java +++ /dev/null @@ -1,71 +0,0 @@ -package me.confuser.banmanager.test.util.parsers; - -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.configs.DefaultConfig; -import me.confuser.banmanager.util.parsers.UnbanCommandParser; -import org.bukkit.configuration.InvalidConfigurationException; -import org.bukkit.configuration.file.YamlConfiguration; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mockito; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; - -import java.io.File; -import java.io.IOException; - -import static org.junit.Assert.assertEquals; - -@RunWith(PowerMockRunner.class) -@PrepareForTest(fullyQualifiedNames = "me.confuser.banmanager.*") -public class UnbanCommandParserTest { - - @Before - public void setup() throws IOException, InvalidConfigurationException { - BanManager plugin = Mockito.mock(BanManager.class); - - PowerMockito.mockStatic(BanManager.class); - Mockito.when(BanManager.getPlugin()).thenReturn(plugin); - - File configFile = new File(getClass().getResource("/config.yml").getPath()); - - YamlConfiguration configuration = new YamlConfiguration(); - configuration.load(configFile.getAbsolutePath()); - - DefaultConfig defaultConfig = new DefaultConfig(configFile); - - Mockito.doReturn(configuration).when(plugin).getConfig(); - Mockito.doReturn(defaultConfig).when(plugin).getConfiguration(); - } - - @Test - public void parsesDeleteFlag() { - String[] args = new String[] { "confuser", "-d" }; - UnbanCommandParser parser = new UnbanCommandParser(args, 1); - - assert (parser.isDelete()); - assertEquals("confuser", parser.getArgs()[0]); - assertEquals(1, parser.getArgs().length); - } - - @Test - public void parsesDeleteFlagWithReason() { - String[] args = new String[] { "confuser", "-d", "Testing", "Hello" }; - UnbanCommandParser parser = new UnbanCommandParser(args, 1); - - assert (parser.isDelete()); - assertEquals("confuser", parser.getArgs()[0]); - assertEquals("Testing Hello", parser.getReason().getMessage()); - } - - @Test - public void handlesNoReason() { - String[] args = new String[] { "confuser" }; - UnbanCommandParser parser = new UnbanCommandParser(args, 1); - - assertEquals(false, parser.isDelete()); - assertEquals("confuser", parser.getArgs()[0]); - } -} diff --git a/src/test/java/me/confuser/banmanager/test/util/parsers/WarnCommandParserTest.java b/src/test/java/me/confuser/banmanager/test/util/parsers/WarnCommandParserTest.java deleted file mode 100644 index b39fcd53f..000000000 --- a/src/test/java/me/confuser/banmanager/test/util/parsers/WarnCommandParserTest.java +++ /dev/null @@ -1,72 +0,0 @@ -package me.confuser.banmanager.test.util.parsers; - -import me.confuser.banmanager.BanManager; -import me.confuser.banmanager.configs.DefaultConfig; -import me.confuser.banmanager.util.parsers.WarnCommandParser; -import org.bukkit.configuration.InvalidConfigurationException; -import org.bukkit.configuration.file.YamlConfiguration; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mockito; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; - -import java.io.File; -import java.io.IOException; - -import static org.junit.Assert.assertEquals; - -@RunWith(PowerMockRunner.class) -@PrepareForTest(fullyQualifiedNames = "me.confuser.banmanager.*") -public class WarnCommandParserTest { - - @Before - public void setup() throws IOException, InvalidConfigurationException { - BanManager plugin = Mockito.mock(BanManager.class); - - PowerMockito.mockStatic(BanManager.class); - Mockito.when(BanManager.getPlugin()).thenReturn(plugin); - - File configFile = new File(getClass().getResource("/config.yml").getPath()); - - YamlConfiguration configuration = new YamlConfiguration(); - configuration.load(configFile.getAbsolutePath()); - - DefaultConfig defaultConfig = new DefaultConfig(configFile); - - Mockito.doReturn(configuration).when(plugin).getConfig(); - Mockito.doReturn(defaultConfig).when(plugin).getConfiguration(); - } - - @Test - public void parsesSilentFlag() { - String[] args = new String[] { "confuser", "-s" }; - WarnCommandParser parser = new WarnCommandParser(args, 1); - - assert (parser.isSilent()); - assertEquals("confuser", parser.getArgs()[0]); - assertEquals(1, parser.getArgs().length); - } - - @Test - public void parsesPointsFlag() { - String[] args = new String[] { "confuser", "-p 5" }; - WarnCommandParser parser = new WarnCommandParser(args, 1); - - assertEquals("confuser", parser.getArgs()[0]); - assertEquals(5.0, parser.getPoints(), 0.0); - assertEquals(1, parser.getArgs().length); - } - - @Test - public void parsesPointsFlagWithReason() { - String[] args = new String[] { "confuser", "-p 5", "Testing", "Hello" }; - WarnCommandParser parser = new WarnCommandParser(args, 1); - - assertEquals("confuser", parser.getArgs()[0]); - assertEquals(5.0, parser.getPoints(), 0.0); - assertEquals("Testing Hello", parser.getReason().getMessage()); - } -} diff --git a/velocity/build.gradle.kts b/velocity/build.gradle.kts new file mode 100644 index 000000000..718e30ab4 --- /dev/null +++ b/velocity/build.gradle.kts @@ -0,0 +1,118 @@ +import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar + +plugins { + `java-library` + `maven-publish` + signing +} + +applyPlatformAndCoreConfiguration() +applyShadowConfiguration() + +publishing { + publications { + create("mavenJava") { + from(components["java"]) + + pom { + name.set("BanManagerVelocity") + description.set("BanManager for Velocity") + url.set("https://github.com/BanManagement/BanManager/") + licenses { + license { + name.set("Creative Commons Attribution-NonCommercial-ShareAlike 2.0 UK: England & Wales") + url.set("https://github.com/BanManagement/BanManager/blob/master/LICENCE") + } + } + developers { + developer { + id.set("confuser") + name.set("James Mortemore") + email.set("jamesmortemore@gmail.com") + } + } + scm { + connection.set("scm:git:git://github.com/BanManagement/BanManager.git") + developerConnection.set("scm:git:ssh://git@github.com/BanManagement/BanManager.git") + url.set("https://github.com/BanManagement/BanManager/") + } + } + } + } +} + +signing { + if (project.findProperty("signingKey")?.toString()?.toBoolean() == true) { + useInMemoryPgpKeys(findProperty("signingKey")?.toString(), findProperty("signingPassword")?.toString()) + + sign(publishing.publications["mavenJava"]) + } +} + +repositories { + maven { + name = "velocity" + url = uri("https://nexus.velocitypowered.com/repository/maven-public/") + } + mavenCentral() +} + +configurations { + compileClasspath.get().extendsFrom(create("shadeOnly")) +} + +dependencies { + api(project(":BanManagerCommon")) + compileOnly("com.velocitypowered:velocity-api:3.1.0") + annotationProcessor("com.velocitypowered:velocity-api:3.1.0") + "shadeOnly"("org.bstats:bstats-velocity:3.0.0") +} + +tasks.named("processResources") { + val internalVersion = project.ext["internalVersion"] + + inputs.property("internalVersion", internalVersion) + + filesMatching("velocity-plugin.json") { + expand("internalVersion" to internalVersion, "mainPath" to "me.confuser.banmanager.velocity.BMVelocityPlugin") + } +} + +tasks.named("jar") { + val projectVersion = project.version + inputs.property("projectVersion", projectVersion) + manifest { + attributes("Implementation-Version" to projectVersion) + } +} + +tasks.named("shadowJar") { + configurations = listOf(project.configurations["shadeOnly"], project.configurations["runtimeClasspath"]) + + archiveBaseName.set("BanManagerVelocity") + archiveClassifier.set("") + archiveVersion.set("") + + dependencies { + include(dependency(":BanManagerCommon")) + include(dependency(":BanManagerLibs")) + include(dependency("org.bstats:.*:.*")) + + relocate("org.bstats", "me.confuser.banmanager.common.bstats") + } + exclude("GradleStart**") + exclude(".cache") + exclude("LICENSE*") + exclude("META-INF/services/**") + exclude("META-INF/maven/**") + exclude("org/intellij/**") + exclude("org/jetbrains/**") + + minimize { + exclude(dependency("org.bstats:.*:.*")) + } +} + +tasks.named("assemble").configure { + dependsOn("shadowJar") +} diff --git a/velocity/src/main/java/me.confuser.banmanager.velocity/BMVelocityPlugin.java b/velocity/src/main/java/me.confuser.banmanager.velocity/BMVelocityPlugin.java new file mode 100644 index 000000000..b27705ee5 --- /dev/null +++ b/velocity/src/main/java/me.confuser.banmanager.velocity/BMVelocityPlugin.java @@ -0,0 +1,257 @@ +package me.confuser.banmanager.velocity; + +import com.google.inject.Inject; + +import com.velocitypowered.api.event.proxy.ProxyInitializeEvent; +import com.velocitypowered.api.event.proxy.ProxyShutdownEvent; +import com.velocitypowered.api.plugin.Dependency; +import com.velocitypowered.api.plugin.annotation.DataDirectory; + +import com.velocitypowered.api.event.Subscribe; +import com.velocitypowered.api.plugin.Plugin; +import com.velocitypowered.api.proxy.ProxyServer; + +import lombok.SneakyThrows; +import lombok.Getter; + +import me.confuser.banmanager.velocity.configs.VelocityConfig; +import me.confuser.banmanager.velocity.listeners.*; +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.commands.CommonCommand; +import me.confuser.banmanager.common.configs.PluginInfo; +import me.confuser.banmanager.common.configuration.ConfigurationSection; +import me.confuser.banmanager.common.configuration.file.YamlConfiguration; +import me.confuser.banmanager.common.runnables.*; + +import org.slf4j.Logger; +import org.bstats.velocity.Metrics; + +import java.io.*; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.concurrent.TimeUnit; + +public class BMVelocityPlugin { + @Getter + private BanManagerPlugin plugin; + @Getter + private VelocityConfig velocityConfig; + private final String[] configs = new String[]{ + "config.yml", + "velocity.yml", + "console.yml", + "discord.yml", + "exemptions.yml", + "geoip.yml", + "messages.yml", + "reasons.yml", + "schedules.yml" + }; + private final Metrics.Factory metricsFactory; + public ProxyServer server; + private final Logger logger; + private final File dataDirectory; + public static BMVelocityPlugin instance; + private boolean isMuteAllowed = false; + + @Inject + public BMVelocityPlugin(ProxyServer server, Logger logger, @DataDirectory final Path directory, Metrics.Factory metricsFactory) { + this.server = server; + this.logger = logger; + instance = this; + this.dataDirectory = directory.toFile(); + this.metricsFactory = metricsFactory; + } + + @Subscribe + public void onProxyInitialization(ProxyInitializeEvent event) { + Metrics metrics = metricsFactory.make(this, 14188); + VelocityServer server = new VelocityServer(); + PluginInfo pluginInfo; + try { + pluginInfo = setupConfigs(); + } catch (IOException e) { + getPlugin().disable(); + e.printStackTrace(); + return; + } + + plugin = new BanManagerPlugin(pluginInfo, new PluginLogger(logger), dataDirectory, new VelocityScheduler(this, this.server), server, new VelocityMetrics(metrics)); + + server.enable(plugin, this.server); + + try { + plugin.enable(); + } catch (Exception e) { + getPlugin().disable(); + e.printStackTrace(); + return; + } + + velocityConfig = new VelocityConfig(dataDirectory, plugin.getLogger()); + velocityConfig.load(); + + checkMuteRequirements(); + setupListeners(); + + if (velocityConfig.isCommandsEnabled()) setupCommands(); + + setupRunnables(); + + plugin.getLogger().info("The following commands are blocked whilst muted:"); + plugin.getConfig().handleBlockedCommands(plugin, plugin.getConfig().getMutedBlacklistCommands()); + + plugin.getLogger().info("The following commands are blocked whilst soft muted:"); + plugin.getConfig().handleBlockedCommands(plugin, plugin.getConfig().getSoftMutedBlacklistCommands()); + } + + @Subscribe + public void onProxyShutdown(ProxyShutdownEvent event) { + if (plugin != null) plugin.disable(); + } + + private void checkMuteRequirements() { + int maxVersionStringLength = this.server.getVersion().getVersion().length(); + int buildVersion = 0; + if (maxVersionStringLength > 4) { + String versionAsString = this.server.getVersion().getVersion().substring(maxVersionStringLength - 4, maxVersionStringLength - 1); + buildVersion = Integer.parseInt(versionAsString); + if (buildVersion <= 140) isMuteAllowed = true; + } + if (server.getPluginManager().getPlugin("signedvelocity").isPresent() && buildVersion >= 235) isMuteAllowed = true; + if (velocityConfig.isForceEnableMute()) isMuteAllowed = true; + } + + private void setupCommands() { + for (CommonCommand cmd : plugin.getCommands()) { + // Ignore reports as not compatible yet + if (checkCommandSkipping(cmd)) continue; + + new VelocityCommand(cmd, this); + } + + if (plugin.getGlobalConn() != null) { + for (CommonCommand cmd : plugin.getGlobalCommands()) { + new VelocityCommand(cmd, this); + } + } + + logger.info("Registered commands"); + } + + private boolean checkCommandSkipping(CommonCommand cmd) { + if (cmd.getCommandName().startsWith("report")) return true; + if (cmd.getCommandName().startsWith("mute") && !isMuteAllowed) return true; + if (cmd.getCommandName().startsWith("muteip") && !isMuteAllowed) return true; + if (cmd.getCommandName().startsWith("unmute") && !isMuteAllowed) return true; + if (cmd.getCommandName().startsWith("unmuteip") && !isMuteAllowed) return true; + + return false; + } + + private PluginInfo setupConfigs() throws IOException { + if (!dataDirectory.exists()) dataDirectory.mkdir(); + + for (String name : configs) { + File file = new File(dataDirectory, name); + + if (!file.exists()) { + try (InputStream in = getResourceAsStream(name)) { + Files.copy(in, file.toPath()); + } catch (IOException e) { + e.printStackTrace(); + } + } else { + Reader defConfigStream = new InputStreamReader(getResourceAsStream(file.getName()), StandardCharsets.UTF_8); + + YamlConfiguration conf = YamlConfiguration.loadConfiguration(file); + YamlConfiguration defConfig = YamlConfiguration.loadConfiguration(defConfigStream); + conf.setDefaults(defConfig); + conf.options().copyDefaults(true); + conf.save(file); + } + } + + // Load plugin.yml + PluginInfo pluginInfo = new PluginInfo(); + Reader defConfigStream = new InputStreamReader(getResourceAsStream("plugin.yml"), StandardCharsets.UTF_8); + YamlConfiguration conf = YamlConfiguration.loadConfiguration(defConfigStream); + ConfigurationSection commands = conf.getConfigurationSection("commands"); + + for (String command : commands.getKeys(false)) { + ConfigurationSection cmd = commands.getConfigurationSection(command); + + pluginInfo.setCommand(new PluginInfo.CommandInfo(command, cmd.getString("permission"), cmd.getString("usage"), cmd.getStringList("aliases"))); + } + + return pluginInfo; + } + + public void setupListeners() { + registerEvent(new JoinListener(this)); + registerEvent(new LeaveListener(plugin)); + registerEvent(new HookListener(plugin)); + + if (!plugin.getConfig().getChatPriority().equals("NONE") && isMuteAllowed) { + registerEvent(new ChatListener(plugin)); + } + + if (plugin.getConfig().isDisplayNotificationsEnabled()) { + registerEvent(new BanListener(plugin)); + registerEvent(new NoteListener(plugin)); + } + + if (plugin.getDiscordConfig().isHooksEnabled()) { + registerEvent(new DiscordListener(plugin)); + } + } + + private void registerEvent(Listener listener) { + server.getEventManager().register(this, listener); + } + + public void setupRunnables() { + Runner syncRunner; + + if (plugin.getGlobalConn() == null) { + syncRunner = new Runner(new BanSync(plugin), new MuteSync(plugin), new IpSync(plugin), new IpRangeSync(plugin), new ExpiresSync(plugin), + new WarningSync(plugin), new RollbackSync(plugin), new NameSync(plugin)); + } else { + syncRunner = new Runner(new BanSync(plugin), new MuteSync(plugin), new IpSync(plugin), new IpRangeSync(plugin), new ExpiresSync(plugin), + new WarningSync(plugin), new RollbackSync(plugin), new NameSync(plugin), + new GlobalBanSync(plugin), new GlobalMuteSync(plugin), new GlobalIpSync(plugin), new GlobalNoteSync(plugin)); + } + + plugin.setSyncRunner(syncRunner); + + setupAsyncRunnable(1L, syncRunner); + + /* + * This task should be ran last with a 1L offset as it gets modified + * above. + */ + setupAsyncRunnable((plugin.getSchedulesConfig() + .getSchedule("saveLastChecked")) + 1L, new SaveLastChecked(plugin)); + + // Purge + plugin.getScheduler().runAsync(new Purge(plugin)); + } + + private void setupAsyncRunnable(long length, Runnable runnable) { + if (length <= 0) return; + + server.getScheduler().buildTask(this, runnable).repeat(length, TimeUnit.SECONDS).schedule(); + } + + @SneakyThrows + private InputStream getResourceAsStream(String resource) { + + Class cls = getClass(); + + // returns the ClassLoader object associated with this Class + ClassLoader cLoader = cls.getClassLoader(); + + return cLoader.getResourceAsStream(resource); + } +} diff --git a/velocity/src/main/java/me.confuser.banmanager.velocity/Listener.java b/velocity/src/main/java/me.confuser.banmanager.velocity/Listener.java new file mode 100644 index 000000000..a195c8f05 --- /dev/null +++ b/velocity/src/main/java/me.confuser.banmanager.velocity/Listener.java @@ -0,0 +1,4 @@ +package me.confuser.banmanager.velocity; + +public class Listener { +} diff --git a/velocity/src/main/java/me.confuser.banmanager.velocity/PluginLogger.java b/velocity/src/main/java/me.confuser.banmanager.velocity/PluginLogger.java new file mode 100644 index 000000000..8b3fa3d1d --- /dev/null +++ b/velocity/src/main/java/me.confuser.banmanager.velocity/PluginLogger.java @@ -0,0 +1,27 @@ +package me.confuser.banmanager.velocity; + +import me.confuser.banmanager.common.CommonLogger; + +import org.slf4j.Logger; + +public class PluginLogger implements CommonLogger { + + private final Logger logger; + + public PluginLogger(Logger logger) { + this.logger = logger; + } + + @Override + public void info(String msg) { + logger.info(msg); + } + + @Override + public void warning(String msg) { + logger.warn(msg); + } + + @Override + public void severe(String msg) {logger.error(msg);} +} diff --git a/velocity/src/main/java/me.confuser.banmanager.velocity/VelocityCommand.java b/velocity/src/main/java/me.confuser.banmanager.velocity/VelocityCommand.java new file mode 100644 index 000000000..db74c38de --- /dev/null +++ b/velocity/src/main/java/me.confuser.banmanager.velocity/VelocityCommand.java @@ -0,0 +1,78 @@ +package me.confuser.banmanager.velocity; + + +import com.velocitypowered.api.command.CommandMeta; +import com.velocitypowered.api.command.CommandSource; +import com.velocitypowered.api.command.SimpleCommand; +import com.velocitypowered.api.proxy.Player; +import lombok.NonNull; +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.commands.CommonCommand; +import me.confuser.banmanager.common.commands.CommonSender; +import me.confuser.banmanager.common.util.Message; + +import java.lang.reflect.InvocationTargetException; +import java.util.Collections; +import java.util.List; +import java.util.stream.Stream; + +public final class VelocityCommand implements SimpleCommand { + private CommonCommand command; + private BMVelocityPlugin plugin; + + public VelocityCommand(CommonCommand command, BMVelocityPlugin plugin) { + super(); + this.command = command; + this.plugin = plugin; + + register(); + } + + @Override + public void execute(final Invocation invocation) { + CommandSource commandSource = invocation.source(); + String[] args = invocation.arguments(); + CommonSender commonSender = getSender(commandSource); + boolean success = false; + + if (!commonSender.hasPermission(command.getPermission())) { + commonSender.sendMessage(Message.getString("sender.error.noPermission")); + return; + } + + try { + success = this.command.onCommand(commonSender, this.command.getParser(args)); + } catch (NoSuchMethodException | IllegalAccessException | InstantiationException | InvocationTargetException e) { + e.printStackTrace(); + } + + if (!success) { + commonSender.sendMessage(command.getUsage()); + } + } + + private CommonSender getSender(CommandSource source) { + if (source instanceof Player) { + return new VelocityPlayer((Player) source, BanManagerPlugin.getInstance().getConfig().isOnlineMode()); + } else { + return new VelocitySender(BanManagerPlugin.getInstance(), source); + } + } + + public void register() { + String[] aliases = command.getAliases().toArray(new String[0]); + CommandMeta meta = plugin.server.getCommandManager().metaBuilder(command.getCommandName()) + .aliases(Stream.of(aliases).toArray(String[]::new)) + .build(); + + plugin.server.getCommandManager().register(meta, this); + } + + @Override + public List suggest(@NonNull final Invocation invocation) { + CommandSource commandSource = invocation.source(); + String[] args = invocation.arguments(); + if(!this.command.isEnableTabCompletion()) return Collections.emptyList(); + return this.command.handlePlayerNameTabComplete(getSender(commandSource), args); + } +} diff --git a/velocity/src/main/java/me.confuser.banmanager.velocity/VelocityMetrics.java b/velocity/src/main/java/me.confuser.banmanager.velocity/VelocityMetrics.java new file mode 100644 index 000000000..7ab36ac5c --- /dev/null +++ b/velocity/src/main/java/me.confuser.banmanager.velocity/VelocityMetrics.java @@ -0,0 +1,58 @@ +package me.confuser.banmanager.velocity; + +import me.confuser.banmanager.common.CommonMetrics; +import org.bstats.velocity.Metrics; +import org.bstats.charts.DrilldownPie; +import org.bstats.charts.SimplePie; + +import java.util.HashMap; +import java.util.Map; + +public class VelocityMetrics implements CommonMetrics { + private Metrics metrics; + + public VelocityMetrics(Metrics metrics) {this.metrics = metrics;} + + @Override + public void submitOnlineMode(boolean online) { + metrics.addCustomChart((new SimplePie("banmanagerMode", () -> online ? "online" : "offline"))); + } + + @Override + public void submitStorageType(String storageType) { + metrics.addCustomChart((new SimplePie("storageType", () -> storageType))); + } + + @Override + public void submitStorageVersion(String version) { + metrics.addCustomChart((new DrilldownPie("storageVersion", () -> { + Map> map = new HashMap<>(); + + Map entry = new HashMap<>(); + entry.put(version, 1); + + if (version.contains("Maria")) { + map.put("MariaDB", entry); + } else { + map.put("MySQL", entry); + } + + return map; + }))); + } + + @Override + public void submitGlobalMode(boolean enabled) { + metrics.addCustomChart((new SimplePie("globalMode", () -> enabled ? "enabled" : "disabled"))); + } + + @Override + public void submitGeoMode(boolean enabled) { + metrics.addCustomChart((new SimplePie("geoMode", () -> enabled ? "enabled" : "disabled"))); + } + + @Override + public void submitDiscordMode(boolean enabled) { +// metrics.addCustomChart((new Metrics.SimplePie("discordMode", () -> enabled ? "enabled" : "disabled"))); + } +} diff --git a/velocity/src/main/java/me.confuser.banmanager.velocity/VelocityPlayer.java b/velocity/src/main/java/me.confuser.banmanager.velocity/VelocityPlayer.java new file mode 100644 index 000000000..c0de0b1ef --- /dev/null +++ b/velocity/src/main/java/me.confuser.banmanager.velocity/VelocityPlayer.java @@ -0,0 +1,113 @@ +package me.confuser.banmanager.velocity; + +import com.velocitypowered.api.proxy.Player; +import me.confuser.banmanager.common.CommonPlayer; +import me.confuser.banmanager.common.CommonWorld; +import me.confuser.banmanager.common.commands.CommonCommand; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.util.Message; +import me.confuser.banmanager.common.kyori.text.TextComponent; +import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; + + +import java.net.InetAddress; +import java.util.Optional; +import java.util.UUID; + +public class VelocityPlayer implements CommonPlayer { + private final UUID uuid; + private final boolean onlineMode; + private final Player player; + + public VelocityPlayer(Player player, boolean onlineMode) { + this.player = player; + this.uuid = this.player.getUniqueId(); + this.onlineMode = onlineMode; + } + + @Override + public void kick(String message) { + player.disconnect(VelocityServer.formatMessage(message)); + } + + @Override + public void sendMessage(String message) { + if(message.isEmpty()) return; + + if(Message.isJSONMessage(message)) { + sendJSONMessage(message); + } else { + player.sendMessage(VelocityServer.formatMessage(message)); + } + } + + @Override + public void sendMessage(Message message) { + sendMessage(message.toString()); + } + + @Override + public void sendJSONMessage(TextComponent jsonString) { + player.sendMessage(VelocityServer.convert(jsonString)); + } + + @Override + public void sendJSONMessage(String jsonString) { + player.sendMessage(GsonComponentSerializer.colorDownsamplingGson().deserialize(jsonString)); + } + + @Override + public boolean isConsole() { + return false; + } + + @Override + public PlayerData getData() { + return CommonCommand.getPlayer(this, getName(), false); + } + + @Override + public boolean isOnlineMode() { + return onlineMode; + } + + @Override + public boolean isOnline() { + return this.player != null; + } + + @Override + public boolean hasPermission(String permission) { + return this.player.hasPermission(permission); + } + + @Override + public String getDisplayName() { + return getName(); + } + + @Override + public String getName() { + return this.player.getUsername(); + } + + @Override + public InetAddress getAddress() { + return this.player.getRemoteAddress().getAddress(); + } + + @Override + public UUID getUniqueId() { + return this.player.getUniqueId(); + } + + @Override + public boolean teleport(CommonWorld world, double x, double y, double z, float pitch, float yaw) { + return false; + } + + @Override + public boolean canSee(CommonPlayer player) { + return true; + } +} diff --git a/velocity/src/main/java/me.confuser.banmanager.velocity/VelocityScheduler.java b/velocity/src/main/java/me.confuser.banmanager.velocity/VelocityScheduler.java new file mode 100644 index 000000000..1b0b77aed --- /dev/null +++ b/velocity/src/main/java/me.confuser.banmanager.velocity/VelocityScheduler.java @@ -0,0 +1,37 @@ +package me.confuser.banmanager.velocity; + +import com.velocitypowered.api.proxy.ProxyServer; +import me.confuser.banmanager.common.CommonScheduler; + +import java.time.Duration; + + +public class VelocityScheduler implements CommonScheduler { + private Object plugin; + private ProxyServer server; + + public VelocityScheduler(Object plugin, ProxyServer server) { + this.plugin = plugin; + this.server = server; + } + + @Override + public void runAsync(Runnable task) { + server.getScheduler().buildTask(plugin, task).schedule(); + } + + @Override + public void runAsyncLater(Runnable task, long delay) { + server.getScheduler().buildTask(plugin, task).delay(Duration.ofMillis(delay)).schedule(); + } + + @Override + public void runSync(Runnable task) { + runAsync(task); + } + + @Override + public void runSyncLater(Runnable task, long delay) { + runAsyncLater(task, delay); + } +} diff --git a/velocity/src/main/java/me.confuser.banmanager.velocity/VelocitySender.java b/velocity/src/main/java/me.confuser.banmanager.velocity/VelocitySender.java new file mode 100644 index 000000000..af783e818 --- /dev/null +++ b/velocity/src/main/java/me.confuser.banmanager.velocity/VelocitySender.java @@ -0,0 +1,50 @@ +package me.confuser.banmanager.velocity; + +import com.velocitypowered.api.command.CommandSource; +import com.velocitypowered.api.proxy.Player; +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.commands.CommonCommand; +import me.confuser.banmanager.common.commands.CommonSender; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.util.Message; + +public class VelocitySender implements CommonSender { + + private BanManagerPlugin plugin; + private CommandSource commandSource; + + public VelocitySender(BanManagerPlugin plugin, CommandSource commandSource) { + this.plugin = plugin; + this.commandSource = commandSource; + } + + @Override + public String getName() { + return isConsole() ? "CONSOLE" : ((Player) commandSource).getUsername(); + } + + @Override + public boolean hasPermission(String permission) {return commandSource.hasPermission(permission); } + + @Override + public void sendMessage(String message) { + commandSource.sendMessage(VelocityServer.formatMessage(message)); + } + + @Override + public void sendMessage(Message message) { + sendMessage(message.toString()); + } + + @Override + public boolean isConsole() { + return !(commandSource instanceof Player); + } + + @Override + public PlayerData getData() { + if (isConsole()) return plugin.getPlayerStorage().getConsole(); + + return CommonCommand.getPlayer(this, getName(), false); + } +} diff --git a/velocity/src/main/java/me.confuser.banmanager.velocity/VelocityServer.java b/velocity/src/main/java/me.confuser.banmanager.velocity/VelocityServer.java new file mode 100644 index 000000000..1b0a6abf7 --- /dev/null +++ b/velocity/src/main/java/me.confuser.banmanager.velocity/VelocityServer.java @@ -0,0 +1,251 @@ +package me.confuser.banmanager.velocity; + + +import com.velocitypowered.api.command.CommandMeta; +import com.velocitypowered.api.command.CommandSource; +import com.velocitypowered.api.proxy.Player; +import com.velocitypowered.api.proxy.ProxyServer; +import me.confuser.banmanager.common.*; +import me.confuser.banmanager.common.api.events.CommonEvent; +import me.confuser.banmanager.common.commands.CommonSender; +import me.confuser.banmanager.common.data.*; +import me.confuser.banmanager.common.kyori.text.TextComponent; +import me.confuser.banmanager.common.util.Message; +import me.confuser.banmanager.velocity.api.events.*; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; +import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.Optional; +import java.util.UUID; +import java.util.stream.Collectors; + +public class VelocityServer implements CommonServer { + private BanManagerPlugin plugin; + private ProxyServer server; + + public void enable(BanManagerPlugin plugin, ProxyServer server) {this.plugin = plugin; this.server = server; } + + @Override + public CommonPlayer getPlayer(UUID uniqueId) { + Optional player = server.getPlayer(uniqueId); + + if (player.isPresent()) return new VelocityPlayer(player.get(), plugin.getConfig().isOnlineMode()); + + return null; + } + + @Override + public CommonPlayer getPlayer(String name) { + Optional player = server.getPlayer(name); + + if (player.isPresent()) return new VelocityPlayer(player.get(), plugin.getConfig().isOnlineMode()); + + return null; + } + + @Override + public CommonPlayer[] getOnlinePlayers() { + return server.getAllPlayers().stream() + .map(player -> new VelocityPlayer(player, plugin.getConfig().isOnlineMode())) + .collect(Collectors.toList()).toArray(new CommonPlayer[0]); + } + + @Override + public void broadcast(String message, String permission) { + if(message.isEmpty()) return; + + for (Player player : server.getAllPlayers()) { + if (player != null && player.hasPermission(permission)) { + player.sendMessage(formatMessage(message)); + } + } + } + + @Override + public void broadcastJSON(TextComponent message, String permission) { + Component converted = convert(message); + for (Player player : server.getAllPlayers()) { + if (player.hasPermission(permission)) { + player.sendMessage(converted); + } + } + } + + @Override + public void broadcast(String message, String permission, CommonSender sender) { + broadcast(message, permission); + + if (!sender.hasPermission(permission)) sender.sendMessage(message); + } + + @Override + public CommonSender getConsoleSender() { + return new VelocitySender(plugin, server.getConsoleCommandSource()); + } + + @Override + public boolean dispatchCommand(CommonSender sender, String command) { + CommandSource velocitySender; + if (sender.isConsole()) { + velocitySender = server.getConsoleCommandSource(); + } else { + if (server.getPlayer(sender.getName()).isPresent()) { + velocitySender = server.getPlayer(sender.getName()).get(); + } else { + return false; + } + } + + server.getCommandManager().executeImmediatelyAsync(velocitySender, command); + return true; + } + + @Override + public CommonWorld getWorld(String name) { + return null; + } + + @Override + public CommonEvent callEvent(String name, Object... args) { + // @TODO replace with a cleaner implementation + CustomEvent event = null; + CommonEvent commonEvent = new CommonEvent(false, true); + + switch (name) { + case "PlayerBanEvent": + event = new PlayerBanEvent((PlayerBanData) args[0], (boolean) args[1]); + break; + case "PlayerBannedEvent": + event = new PlayerBannedEvent((PlayerBanData) args[0], (boolean) args[1]); + break; + case "PlayerUnbanEvent": + event = new PlayerUnbanEvent((PlayerBanData) args[0], (PlayerData) args[1], (String) args[2]); + break; + + case "IpBanEvent": + event = new IpBanEvent((IpBanData) args[0], (boolean) args[1]); + break; + case "IpBannedEvent": + event = new IpBannedEvent((IpBanData) args[0], (boolean) args[1]); + break; + case "IpUnbanEvent": + event = new IpUnbanEvent((IpBanData) args[0], (PlayerData) args[1], (String) args[2]); + break; + + case "IpMuteEvent": + event = new IpMuteEvent((IpMuteData) args[0], (boolean) args[1]); + break; + case "IpMutedEvent": + event = new IpMutedEvent((IpMuteData) args[0], (boolean) args[1]); + break; + case "IpUnmutedEvent": + event = new IpUnmutedEvent((IpMuteData) args[0], (PlayerData) args[1], (String) args[2]); + break; + + case "PlayerKickedEvent": + event = new PlayerKickedEvent((PlayerKickData) args[0], (boolean) args[1]); + break; + + case "PlayerNoteCreatedEvent": + event = new PlayerNoteCreatedEvent((PlayerNoteData) args[0]); + break; + + case "PlayerReportEvent": + event = new PlayerReportEvent((PlayerReportData) args[0], (boolean) args[1]); + break; + case "PlayerReportedEvent": + event = new PlayerReportedEvent((PlayerReportData) args[0], (boolean) args[1]); + break; + case "PlayerReportDeletedEvent": + event = new PlayerReportDeletedEvent((PlayerReportData) args[0]); + break; + + case "NameBanEvent": + event = new NameBanEvent((NameBanData) args[0], (boolean) args[1]); + break; + case "NameBannedEvent": + event = new NameBannedEvent((NameBanData) args[0], (boolean) args[1]); + break; + case "NameUnbanEvent": + event = new NameUnbanEvent((NameBanData) args[0], (PlayerData) args[1], (String) args[2]); + break; + + case "PlayerWarnEvent": + event = new PlayerWarnEvent((PlayerWarnData) args[0], (boolean) args[1]); + break; + case "PlayerWarnedEvent": + event = new PlayerWarnedEvent((PlayerWarnData) args[0], (boolean) args[1]); + break; + + case "IpRangeBanEvent": + event = new IpRangeBanEvent((IpRangeBanData) args[0], (boolean) args[1]); + break; + case "IpRangeBannedEvent": + event = new IpRangeBannedEvent((IpRangeBanData) args[0], (boolean) args[1]); + break; + case "IpRangeUnbanEvent": + event = new IpRangeUnbanEvent((IpRangeBanData) args[0], (PlayerData) args[1], (String) args[2]); + break; + + case "PlayerMuteEvent": + event = new PlayerMuteEvent((PlayerMuteData) args[0], (boolean) args[1]); + break; + case "PlayerMutedEvent": + event = new PlayerMutedEvent((PlayerMuteData) args[0], (boolean) args[1]); + break; + case "PlayerUnmuteEvent": + event = new PlayerUnmuteEvent((PlayerMuteData) args[0], (PlayerData) args[1], (String) args[2]); + break; + + case "PluginReloadedEvent": + event = new PluginReloadedEvent((PlayerData) args[0]); + break; + + case "PlayerDeniedEvent": + event = new PlayerDeniedEvent((PlayerData) args[0], (Message) args[1]); + } + + if (event == null) { + plugin.getLogger().warning("Unable to call missing event " + name); + + return commonEvent; + } + + server.getEventManager().fire(event).join(); + + if (event instanceof SilentCancellableEvent) { + commonEvent = new CommonEvent(!(((SilentCancellableEvent) event).getResult().isAllowed()), ((SilentCancellableEvent) event).isSilent()); + } else if (event instanceof SilentEvent) { + commonEvent = new CommonEvent(false, ((SilentEvent) event).isSilent()); + } else if (event instanceof CustomCancellableEvent) { + commonEvent = new CommonEvent(!((CustomCancellableEvent) event).getResult().isAllowed(), true); + } + + return commonEvent; + } + + public static @NotNull Component formatMessage(String message) { + return LegacyComponentSerializer.legacy('&').deserialize(message); + } + + public static Component convert(me.confuser.banmanager.common.kyori.text.Component message) { + String gson = me.confuser.banmanager.common.kyori.text.serializer.gson.GsonComponentSerializer.gson().serialize(message); + return GsonComponentSerializer.gson().deserialize(gson); + } + + @Override + public CommonExternalCommand getPluginCommand(String commandName) { + // This would be a implementation of doing so with Velocity, but the method getCommandMeta does not exist. + CommandMeta meta = server.getCommandManager().getCommandMeta(commandName); + if (meta != null) { + return new CommonExternalCommand(null, meta.getAliases().iterator().next(), new ArrayList<>(meta.getAliases())); + } + else return null; + } +} + + + diff --git a/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/CustomCancellableEvent.java b/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/CustomCancellableEvent.java new file mode 100644 index 000000000..6f6e20ba6 --- /dev/null +++ b/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/CustomCancellableEvent.java @@ -0,0 +1,25 @@ +package me.confuser.banmanager.velocity.api.events; + +import com.velocitypowered.api.event.ResultedEvent; + +import java.util.Objects; + + +public abstract class CustomCancellableEvent extends CustomEvent implements ResultedEvent { + + private GenericResult result = GenericResult.allowed(); + + public CustomCancellableEvent() { + super(); + } + + @Override + public void setResult(GenericResult result) { + this.result = Objects.requireNonNull(result); + } + + public GenericResult getResult() { + return result; + } + +} diff --git a/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/CustomEvent.java b/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/CustomEvent.java new file mode 100644 index 000000000..1a6be8f2c --- /dev/null +++ b/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/CustomEvent.java @@ -0,0 +1,4 @@ +package me.confuser.banmanager.velocity.api.events; + +public abstract class CustomEvent { +} diff --git a/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/IpBanEvent.java b/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/IpBanEvent.java new file mode 100644 index 000000000..a4e8c54fb --- /dev/null +++ b/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/IpBanEvent.java @@ -0,0 +1,15 @@ +package me.confuser.banmanager.velocity.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.IpBanData; + +public class IpBanEvent extends SilentCancellableEvent { + + @Getter + private IpBanData ban; + + public IpBanEvent(IpBanData ban, boolean silent) { + super(silent); + this.ban = ban; + } +} diff --git a/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/IpBannedEvent.java b/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/IpBannedEvent.java new file mode 100644 index 000000000..381abdd4e --- /dev/null +++ b/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/IpBannedEvent.java @@ -0,0 +1,15 @@ +package me.confuser.banmanager.velocity.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.IpBanData; + +public class IpBannedEvent extends SilentEvent { + + @Getter + private IpBanData ban; + + public IpBannedEvent(IpBanData ban, boolean silent) { + super(silent); + this.ban = ban; + } +} diff --git a/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/IpMuteEvent.java b/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/IpMuteEvent.java new file mode 100644 index 000000000..ff9ab5d1b --- /dev/null +++ b/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/IpMuteEvent.java @@ -0,0 +1,15 @@ +package me.confuser.banmanager.velocity.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.IpMuteData; + +public class IpMuteEvent extends SilentCancellableEvent { + + @Getter + private IpMuteData mute; + + public IpMuteEvent(IpMuteData mute, boolean silent) { + super(silent); + this.mute = mute; + } +} diff --git a/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/IpMutedEvent.java b/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/IpMutedEvent.java new file mode 100644 index 000000000..d9601a958 --- /dev/null +++ b/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/IpMutedEvent.java @@ -0,0 +1,15 @@ +package me.confuser.banmanager.velocity.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.IpMuteData; + +public class IpMutedEvent extends SilentEvent { + + @Getter + private IpMuteData mute; + + public IpMutedEvent(IpMuteData mute, boolean silent) { + super(silent); + this.mute = mute; + } +} diff --git a/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/IpRangeBanEvent.java b/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/IpRangeBanEvent.java new file mode 100644 index 000000000..74cb30abd --- /dev/null +++ b/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/IpRangeBanEvent.java @@ -0,0 +1,15 @@ +package me.confuser.banmanager.velocity.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.IpRangeBanData; + +public class IpRangeBanEvent extends SilentCancellableEvent { + + @Getter + private IpRangeBanData ban; + + public IpRangeBanEvent(IpRangeBanData ban, boolean silent) { + super(silent); + this.ban = ban; + } +} diff --git a/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/IpRangeBannedEvent.java b/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/IpRangeBannedEvent.java new file mode 100644 index 000000000..40c832ca5 --- /dev/null +++ b/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/IpRangeBannedEvent.java @@ -0,0 +1,16 @@ +package me.confuser.banmanager.velocity.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.IpRangeBanData; + + +public class IpRangeBannedEvent extends SilentEvent { + + @Getter + private IpRangeBanData ban; + + public IpRangeBannedEvent(IpRangeBanData ban, boolean silent) { + super(silent); + this.ban = ban; + } +} diff --git a/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/IpRangeUnbanEvent.java b/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/IpRangeUnbanEvent.java new file mode 100644 index 000000000..f85429972 --- /dev/null +++ b/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/IpRangeUnbanEvent.java @@ -0,0 +1,24 @@ +package me.confuser.banmanager.velocity.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.IpRangeBanData; +import me.confuser.banmanager.common.data.PlayerData; + + +public class IpRangeUnbanEvent extends CustomCancellableEvent { + + @Getter + private IpRangeBanData ban; + @Getter + private PlayerData actor; + @Getter + private String reason; + + public IpRangeUnbanEvent(IpRangeBanData ban, PlayerData actor, String reason) { + super(); + + this.ban = ban; + this.actor = actor; + this.reason = reason; + } +} diff --git a/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/IpUnbanEvent.java b/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/IpUnbanEvent.java new file mode 100644 index 000000000..b3ad4caa2 --- /dev/null +++ b/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/IpUnbanEvent.java @@ -0,0 +1,24 @@ +package me.confuser.banmanager.velocity.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.IpBanData; +import me.confuser.banmanager.common.data.PlayerData; + + +public class IpUnbanEvent extends CustomCancellableEvent { + + @Getter + private IpBanData ban; + @Getter + private PlayerData actor; + @Getter + private String reason; + + public IpUnbanEvent(IpBanData ban, PlayerData actor, String reason) { + super(); + + this.ban = ban; + this.actor = actor; + this.reason = reason; + } +} diff --git a/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/IpUnmutedEvent.java b/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/IpUnmutedEvent.java new file mode 100644 index 000000000..c066bad18 --- /dev/null +++ b/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/IpUnmutedEvent.java @@ -0,0 +1,24 @@ +package me.confuser.banmanager.velocity.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.IpMuteData; +import me.confuser.banmanager.common.data.PlayerData; + + +public class IpUnmutedEvent extends CustomCancellableEvent { + + @Getter + private IpMuteData mute; + @Getter + private PlayerData actor; + @Getter + private String reason; + + public IpUnmutedEvent(IpMuteData mute, PlayerData actor, String reason) { + super(); + + this.mute = mute; + this.actor = actor; + this.reason = reason; + } +} diff --git a/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/NameBanEvent.java b/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/NameBanEvent.java new file mode 100644 index 000000000..c493cce3c --- /dev/null +++ b/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/NameBanEvent.java @@ -0,0 +1,17 @@ +package me.confuser.banmanager.velocity.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.NameBanData; + + +public class NameBanEvent extends SilentCancellableEvent { + + @Getter + private NameBanData ban; + + public NameBanEvent(NameBanData ban, boolean isSilent) { + super(isSilent); + this.ban = ban; + } + +} diff --git a/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/NameBannedEvent.java b/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/NameBannedEvent.java new file mode 100644 index 000000000..87da984a0 --- /dev/null +++ b/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/NameBannedEvent.java @@ -0,0 +1,16 @@ +package me.confuser.banmanager.velocity.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.NameBanData; + +public class NameBannedEvent extends SilentEvent { + + @Getter + private NameBanData ban; + + public NameBannedEvent(NameBanData ban, boolean isSilent) { + super(isSilent); + this.ban = ban; + } + +} diff --git a/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/NameUnbanEvent.java b/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/NameUnbanEvent.java new file mode 100644 index 000000000..dd86d4ba9 --- /dev/null +++ b/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/NameUnbanEvent.java @@ -0,0 +1,25 @@ +package me.confuser.banmanager.velocity.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.NameBanData; +import me.confuser.banmanager.common.data.PlayerData; + + +public class NameUnbanEvent extends CustomCancellableEvent { + + @Getter + private NameBanData ban; + @Getter + private PlayerData actor; + @Getter + private String reason; + + public NameUnbanEvent(NameBanData ban, PlayerData actor, String reason) { + super(); + + this.ban = ban; + this.actor = actor; + this.reason = reason; + } + +} diff --git a/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/PlayerBanEvent.java b/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/PlayerBanEvent.java new file mode 100644 index 000000000..26dc60a6d --- /dev/null +++ b/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/PlayerBanEvent.java @@ -0,0 +1,17 @@ +package me.confuser.banmanager.velocity.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.PlayerBanData; + + +public class PlayerBanEvent extends SilentCancellableEvent { + + @Getter + private PlayerBanData ban; + + public PlayerBanEvent(PlayerBanData ban, boolean isSilent) { + super(isSilent); + this.ban = ban; + } + +} diff --git a/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/PlayerBannedEvent.java b/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/PlayerBannedEvent.java new file mode 100644 index 000000000..471c21ae5 --- /dev/null +++ b/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/PlayerBannedEvent.java @@ -0,0 +1,17 @@ +package me.confuser.banmanager.velocity.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.PlayerBanData; + + +public class PlayerBannedEvent extends SilentEvent { + + @Getter + private PlayerBanData ban; + + public PlayerBannedEvent(PlayerBanData ban, boolean isSilent) { + super(isSilent); + this.ban = ban; + } + +} diff --git a/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/PlayerDeniedEvent.java b/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/PlayerDeniedEvent.java new file mode 100644 index 000000000..ba2f23997 --- /dev/null +++ b/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/PlayerDeniedEvent.java @@ -0,0 +1,23 @@ +package me.confuser.banmanager.velocity.api.events; + +import lombok.Getter; +import lombok.Setter; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.util.Message; + +public class PlayerDeniedEvent extends CustomCancellableEvent { + + @Getter + @Setter + private Message message; + + @Getter + private PlayerData player; + + public PlayerDeniedEvent(PlayerData player, Message message) { + super(); + + this.player = player; + this.message = message; + } +} diff --git a/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/PlayerKickedEvent.java b/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/PlayerKickedEvent.java new file mode 100644 index 000000000..0f936218d --- /dev/null +++ b/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/PlayerKickedEvent.java @@ -0,0 +1,15 @@ +package me.confuser.banmanager.velocity.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.PlayerKickData; + +public class PlayerKickedEvent extends SilentEvent { + + @Getter + private PlayerKickData kick; + + public PlayerKickedEvent(PlayerKickData kick, boolean isSilent) { + super(isSilent); + this.kick = kick; + } +} diff --git a/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/PlayerMuteEvent.java b/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/PlayerMuteEvent.java new file mode 100644 index 000000000..4f2863845 --- /dev/null +++ b/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/PlayerMuteEvent.java @@ -0,0 +1,16 @@ +package me.confuser.banmanager.velocity.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.PlayerMuteData; + + +public class PlayerMuteEvent extends SilentCancellableEvent { + + @Getter + private PlayerMuteData mute; + + public PlayerMuteEvent(PlayerMuteData mute, boolean silent) { + super(silent); + this.mute = mute; + } +} diff --git a/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/PlayerMutedEvent.java b/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/PlayerMutedEvent.java new file mode 100644 index 000000000..02d395eb8 --- /dev/null +++ b/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/PlayerMutedEvent.java @@ -0,0 +1,16 @@ +package me.confuser.banmanager.velocity.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.PlayerMuteData; + + +public class PlayerMutedEvent extends SilentEvent { + + @Getter + private PlayerMuteData mute; + + public PlayerMutedEvent(PlayerMuteData mute, boolean silent) { + super(silent); + this.mute = mute; + } +} diff --git a/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/PlayerNoteCreatedEvent.java b/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/PlayerNoteCreatedEvent.java new file mode 100644 index 000000000..b91cc2d47 --- /dev/null +++ b/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/PlayerNoteCreatedEvent.java @@ -0,0 +1,16 @@ +package me.confuser.banmanager.velocity.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.PlayerNoteData; + + +public class PlayerNoteCreatedEvent extends CustomCancellableEvent { + + @Getter + private PlayerNoteData note; + + public PlayerNoteCreatedEvent(PlayerNoteData note) { + super(); + this.note = note; + } +} diff --git a/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/PlayerReportDeletedEvent.java b/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/PlayerReportDeletedEvent.java new file mode 100644 index 000000000..6c94ec0f0 --- /dev/null +++ b/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/PlayerReportDeletedEvent.java @@ -0,0 +1,15 @@ +package me.confuser.banmanager.velocity.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.PlayerReportData; + +public class PlayerReportDeletedEvent extends CustomEvent { + + @Getter + private PlayerReportData report; + + public PlayerReportDeletedEvent(PlayerReportData report) { + super(); + this.report = report; + } +} diff --git a/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/PlayerReportEvent.java b/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/PlayerReportEvent.java new file mode 100644 index 000000000..2ef94668d --- /dev/null +++ b/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/PlayerReportEvent.java @@ -0,0 +1,17 @@ +package me.confuser.banmanager.velocity.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.PlayerReportData; + + +public class PlayerReportEvent extends SilentCancellableEvent { + + @Getter + private PlayerReportData report; + + public PlayerReportEvent(PlayerReportData report, boolean isSilent) { + super(isSilent); + this.report = report; + } + +} diff --git a/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/PlayerReportedEvent.java b/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/PlayerReportedEvent.java new file mode 100644 index 000000000..4b1ad13e9 --- /dev/null +++ b/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/PlayerReportedEvent.java @@ -0,0 +1,17 @@ +package me.confuser.banmanager.velocity.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.PlayerReportData; + + +public class PlayerReportedEvent extends SilentEvent { + + @Getter + private PlayerReportData report; + + public PlayerReportedEvent(PlayerReportData report, boolean isSilent) { + super(isSilent); + this.report = report; + } + +} diff --git a/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/PlayerUnbanEvent.java b/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/PlayerUnbanEvent.java new file mode 100644 index 000000000..41f91959f --- /dev/null +++ b/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/PlayerUnbanEvent.java @@ -0,0 +1,25 @@ +package me.confuser.banmanager.velocity.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.PlayerBanData; +import me.confuser.banmanager.common.data.PlayerData; + + +public class PlayerUnbanEvent extends CustomCancellableEvent { + + @Getter + private PlayerBanData ban; + @Getter + private PlayerData actor; + @Getter + private String reason; + + public PlayerUnbanEvent(PlayerBanData ban, PlayerData actor, String reason) { + super(); + + this.ban = ban; + this.actor = actor; + this.reason = reason; + } + +} diff --git a/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/PlayerUnmuteEvent.java b/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/PlayerUnmuteEvent.java new file mode 100644 index 000000000..5a228d9a7 --- /dev/null +++ b/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/PlayerUnmuteEvent.java @@ -0,0 +1,24 @@ +package me.confuser.banmanager.velocity.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.data.PlayerMuteData; + + +public class PlayerUnmuteEvent extends CustomCancellableEvent { + + @Getter + private PlayerMuteData mute; + @Getter + private PlayerData actor; + @Getter + private String reason; + + public PlayerUnmuteEvent(PlayerMuteData mute, PlayerData actor, String reason) { + super(); + + this.mute = mute; + this.actor = actor; + this.reason = reason; + } +} diff --git a/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/PlayerWarnEvent.java b/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/PlayerWarnEvent.java new file mode 100644 index 000000000..9776f20bc --- /dev/null +++ b/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/PlayerWarnEvent.java @@ -0,0 +1,16 @@ +package me.confuser.banmanager.velocity.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.PlayerWarnData; + + +public class PlayerWarnEvent extends SilentEvent { + + @Getter + private PlayerWarnData warning; + + public PlayerWarnEvent(PlayerWarnData warning, boolean silent) { + super(silent); + this.warning = warning; + } +} diff --git a/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/PlayerWarnedEvent.java b/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/PlayerWarnedEvent.java new file mode 100644 index 000000000..809398ae3 --- /dev/null +++ b/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/PlayerWarnedEvent.java @@ -0,0 +1,16 @@ +package me.confuser.banmanager.velocity.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.PlayerWarnData; + + +public class PlayerWarnedEvent extends SilentEvent { + + @Getter + private PlayerWarnData warning; + + public PlayerWarnedEvent(PlayerWarnData warning, boolean silent) { + super(silent); + this.warning = warning; + } +} diff --git a/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/PluginReloadedEvent.java b/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/PluginReloadedEvent.java new file mode 100644 index 000000000..5fc1fd7c9 --- /dev/null +++ b/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/PluginReloadedEvent.java @@ -0,0 +1,15 @@ +package me.confuser.banmanager.velocity.api.events; + +import lombok.Getter; +import me.confuser.banmanager.common.data.PlayerData; + +public class PluginReloadedEvent extends CustomCancellableEvent { + + @Getter + private PlayerData actor; + + public PluginReloadedEvent(PlayerData actor) { + super(); + this.actor = actor; + } +} diff --git a/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/SilentCancellableEvent.java b/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/SilentCancellableEvent.java new file mode 100644 index 000000000..2ca3e215f --- /dev/null +++ b/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/SilentCancellableEvent.java @@ -0,0 +1,16 @@ +package me.confuser.banmanager.velocity.api.events; + +import lombok.Getter; +import lombok.Setter; + +public abstract class SilentCancellableEvent extends CustomCancellableEvent { + + @Getter + @Setter + private boolean silent; + + public SilentCancellableEvent(boolean silent) { + super(); + this.silent = silent; + } +} diff --git a/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/SilentEvent.java b/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/SilentEvent.java new file mode 100644 index 000000000..f66b7ee6e --- /dev/null +++ b/velocity/src/main/java/me.confuser.banmanager.velocity/api/events/SilentEvent.java @@ -0,0 +1,17 @@ +package me.confuser.banmanager.velocity.api.events; + +import lombok.Getter; +import lombok.Setter; + +public abstract class SilentEvent extends CustomEvent { + @Getter + @Setter + private boolean silent = false; + + public SilentEvent(boolean silent) { + super(); + + this.silent = silent; + } + +} diff --git a/velocity/src/main/java/me.confuser.banmanager.velocity/configs/VelocityConfig.java b/velocity/src/main/java/me.confuser.banmanager.velocity/configs/VelocityConfig.java new file mode 100644 index 000000000..9e1f00b9c --- /dev/null +++ b/velocity/src/main/java/me.confuser.banmanager.velocity/configs/VelocityConfig.java @@ -0,0 +1,29 @@ +package me.confuser.banmanager.velocity.configs; + +import lombok.Getter; +import me.confuser.banmanager.common.CommonLogger; +import me.confuser.banmanager.common.configs.Config; + +import java.io.File; +import java.nio.file.Path; + +public class VelocityConfig extends Config { + @Getter + private boolean commandsEnabled = false; + @Getter + private boolean forceEnableMute = false; + + public VelocityConfig(File dataFolder, CommonLogger logger) { + super(dataFolder, "velocity.yml", logger); + } + + @Override + public void afterLoad() { + commandsEnabled = conf.getBoolean("features.commands", false); + forceEnableMute = conf.getBoolean("features.forceEnableMute", false); + } + + @Override + public void onSave() { + } +} diff --git a/velocity/src/main/java/me.confuser.banmanager.velocity/listeners/BanListener.java b/velocity/src/main/java/me.confuser.banmanager.velocity/listeners/BanListener.java new file mode 100644 index 000000000..8e052aa9c --- /dev/null +++ b/velocity/src/main/java/me.confuser.banmanager.velocity/listeners/BanListener.java @@ -0,0 +1,42 @@ +package me.confuser.banmanager.velocity.listeners; + + +import com.velocitypowered.api.event.Subscribe; +import me.confuser.banmanager.velocity.Listener; +import me.confuser.banmanager.velocity.api.events.IpBannedEvent; +import me.confuser.banmanager.velocity.api.events.IpRangeBannedEvent; +import me.confuser.banmanager.velocity.api.events.NameBannedEvent; +import me.confuser.banmanager.velocity.api.events.PlayerBannedEvent; +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.listeners.CommonBanListener; + +import com.velocitypowered.api.event.PostOrder; + +public class BanListener extends Listener { + + private final CommonBanListener listener; + + public BanListener(BanManagerPlugin plugin) { + this.listener = new CommonBanListener(plugin); + } + + @Subscribe(order = PostOrder.FIRST) + public void notifyOnBan(PlayerBannedEvent event) { + listener.notifyOnBan(event.getBan(), event.isSilent()); + } + + @Subscribe(order = PostOrder.FIRST) + public void notifyOnIpBan(IpBannedEvent event) { + listener.notifyOnBan(event.getBan(), event.isSilent()); + } + + @Subscribe(order = PostOrder.FIRST) + public void notifyOnIpRangeBan(IpRangeBannedEvent event) { + listener.notifyOnBan(event.getBan(), event.isSilent()); + } + + @Subscribe(order = PostOrder.FIRST) + public void notifyOnNameBan(NameBannedEvent event) { + listener.notifyOnBan(event.getBan(), event.isSilent()); + } +} diff --git a/velocity/src/main/java/me.confuser.banmanager.velocity/listeners/ChatListener.java b/velocity/src/main/java/me.confuser.banmanager.velocity/listeners/ChatListener.java new file mode 100644 index 000000000..0ec995f91 --- /dev/null +++ b/velocity/src/main/java/me.confuser.banmanager.velocity/listeners/ChatListener.java @@ -0,0 +1,54 @@ +package me.confuser.banmanager.velocity.listeners; + + +import com.velocitypowered.api.event.EventTask; +import com.velocitypowered.api.event.PostOrder; +import com.velocitypowered.api.event.ResultedEvent; +import com.velocitypowered.api.event.Subscribe; +import com.velocitypowered.api.event.player.PlayerChatEvent; + +import com.velocitypowered.api.proxy.ProxyServer; +import lombok.RequiredArgsConstructor; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.CommonPlayer; +import me.confuser.banmanager.common.listeners.CommonChatHandler; +import me.confuser.banmanager.common.listeners.CommonChatListener; +import me.confuser.banmanager.common.listeners.CommonCommandListener; +import me.confuser.banmanager.velocity.Listener; +import me.confuser.banmanager.velocity.VelocityServer; +import net.kyori.adventure.text.Component; + +public class ChatListener extends Listener { + private final CommonChatListener listener; + private final BanManagerPlugin plugin; + + public ChatListener(BanManagerPlugin plugin) { + this.plugin = plugin; + + this.listener = new CommonChatListener(plugin); + new CommonCommandListener(plugin); + } + + @Subscribe(order = PostOrder.LATE) + public void onPlayerChat(PlayerChatEvent event) { + CommonPlayer player = plugin.getServer().getPlayer(event.getPlayer().getUniqueId()); + + if (listener.onPlayerChat(player, new ChatHandler(event), event.getMessage())) { + event.setResult(PlayerChatEvent.ChatResult.denied()); + } else if (listener.onIpChat(player, event.getPlayer().getRemoteAddress().getAddress(), new ChatHandler(event), event.getMessage())) { + event.setResult(PlayerChatEvent.ChatResult.denied()); + } + } + + + @RequiredArgsConstructor + private class ChatHandler implements CommonChatHandler { + private final PlayerChatEvent event; + @Override + public void handleSoftMute() { + event.setResult(PlayerChatEvent.ChatResult.denied()); + event.getPlayer().sendMessage((Component) VelocityServer.formatMessage(event.getMessage())); + } + } +} diff --git a/velocity/src/main/java/me.confuser.banmanager.velocity/listeners/DiscordListener.java b/velocity/src/main/java/me.confuser.banmanager.velocity/listeners/DiscordListener.java new file mode 100644 index 000000000..509e13234 --- /dev/null +++ b/velocity/src/main/java/me.confuser.banmanager.velocity/listeners/DiscordListener.java @@ -0,0 +1,101 @@ +package me.confuser.banmanager.velocity.listeners; + +import me.confuser.banmanager.velocity.api.events.*; +import me.confuser.banmanager.velocity.Listener; +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.listeners.CommonDiscordListener; +import com.velocitypowered.api.event.Subscribe; + +import com.velocitypowered.api.event.PostOrder; + +public class DiscordListener extends Listener { + private CommonDiscordListener listener; + + public DiscordListener(BanManagerPlugin plugin) { + this.listener = new CommonDiscordListener(plugin); + } + + @Subscribe(order = PostOrder.LAST) + public void notifyOnBan(PlayerBannedEvent event) { + Object[] data = listener.notifyOnBan(event.getBan()); + + if (event.isSilent() && (boolean) data[2]) return; + + send(data); + } + + @Subscribe(order = PostOrder.LAST) + public void notifyOnMute(PlayerMutedEvent event) { + Object[] data = listener.notifyOnMute(event.getMute()); + + if (event.isSilent() && (boolean) data[2]) return; + + send(data); + } + + @Subscribe(order = PostOrder.LAST) + public void notifyOnBan(IpBannedEvent event) { + Object[] data = listener.notifyOnBan(event.getBan()); + + if (event.isSilent() && (boolean) data[2]) return; + + send(data); + } + + @Subscribe(order = PostOrder.LAST) + public void notifyOnKick(PlayerKickedEvent event) { + Object[] data = listener.notifyOnKick(event.getKick()); + + if (event.isSilent() && (boolean) data[2]) return; + + send(data); + } + + @Subscribe(order = PostOrder.LAST) + public void notifyOnWarn(PlayerWarnedEvent event) { + Object[] data = listener.notifyOnWarn(event.getWarning()); + + if (event.isSilent() && (boolean) data[2]) return; + + send(data); + } + + @Subscribe(order = PostOrder.LAST) + public void notifyOnUnban(PlayerUnbanEvent event) { + Object[] data = listener.notifyOnUnban(event.getBan(), event.getActor(), event.getReason()); + + send(data); + } + + @Subscribe(order = PostOrder.LAST) + public void notifyOnUnban(IpUnbanEvent event) { + Object[] data = listener.notifyOnUnban(event.getBan(), event.getActor(), event.getReason()); + + send(data); + } + + @Subscribe(order = PostOrder.LAST) + public void notifyOnUnmute(PlayerUnmuteEvent event) { + Object[] data = listener.notifyOnUnmute(event.getMute(), event.getActor(), event.getReason()); + + send(data); + } + + @Subscribe(order = PostOrder.LAST) + public void notifyOnReport(PlayerReportedEvent event) { + Object[] data = listener.notifyOnReport(event.getReport(), event.getReport().getActor(), event.getReport().getReason()); + + if (event.isSilent() && (boolean) data[2]) return; + + send(data); + } + + private void send(Object[] data) { + String url = (String) data[0]; + String payload = (String) data[1]; + + if (url == null || payload == null || url.isEmpty() || payload.isEmpty()) return; + + listener.send(url, payload); + } +} diff --git a/velocity/src/main/java/me.confuser.banmanager.velocity/listeners/HookListener.java b/velocity/src/main/java/me.confuser.banmanager.velocity/listeners/HookListener.java new file mode 100644 index 000000000..4915dd3f5 --- /dev/null +++ b/velocity/src/main/java/me.confuser.banmanager.velocity/listeners/HookListener.java @@ -0,0 +1,103 @@ +package me.confuser.banmanager.velocity.listeners; + +import com.velocitypowered.api.event.PostOrder; +import com.velocitypowered.api.event.Subscribe; + +import me.confuser.banmanager.velocity.Listener; +import me.confuser.banmanager.velocity.api.events.*; + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.listeners.CommonHooksListener; + +public class HookListener extends Listener { + private final CommonHooksListener listener; + + public HookListener(BanManagerPlugin plugin) { + this.listener = new CommonHooksListener(plugin); + } + + @Subscribe(order = PostOrder.FIRST) + public void onBan(final PlayerBanEvent event) { + listener.onBan(event.getBan(), true); + } + + @Subscribe(order = PostOrder.FIRST) + public void onBan(final PlayerBannedEvent event) { + listener.onBan(event.getBan(), false); + } + + @Subscribe(order = PostOrder.FIRST) + public void onUnban(final PlayerUnbanEvent event) { + listener.onUnban(event.getBan(), event.getActor(), event.getReason()); + } + + @Subscribe(order = PostOrder.FIRST) + public void onMute(final PlayerMuteEvent event) { + listener.onMute(event.getMute(), true); + } + + @Subscribe(order = PostOrder.FIRST) + public void onMute(final PlayerMutedEvent event) { + listener.onMute(event.getMute(), false); + } + + @Subscribe(order = PostOrder.FIRST) + public void onUnmute(final PlayerUnmuteEvent event) { + listener.onUnmute(event.getMute(), event.getActor(), event.getReason()); + } + + @Subscribe(order = PostOrder.FIRST) + public void onBan(final IpBanEvent event) { + listener.onBan(event.getBan(), true); + } + + @Subscribe(order = PostOrder.FIRST) + public void onBan(final IpBannedEvent event) { + listener.onBan(event.getBan(), false); + } + + @Subscribe(order = PostOrder.FIRST) + public void onUnban(final IpUnbanEvent event) { + listener.onUnban(event.getBan(), event.getActor(), event.getReason()); + } + + @Subscribe(order = PostOrder.FIRST) + public void onBan(final IpRangeBanEvent event) { + listener.onBan(event.getBan(), true); + } + + @Subscribe(order = PostOrder.FIRST) + public void onBan(final IpRangeBannedEvent event) { + listener.onBan(event.getBan(), false); + } + + @Subscribe(order = PostOrder.FIRST) + public void onUnban(final IpRangeUnbanEvent event) { + listener.onUnban(event.getBan(), event.getActor(), event.getReason()); + } + + @Subscribe(order = PostOrder.FIRST) + public void onWarn(final PlayerWarnEvent event) { + listener.onWarn(event.getWarning(), true); + } + + @Subscribe(order = PostOrder.FIRST) + public void onWarn(final PlayerWarnedEvent event) { + listener.onWarn(event.getWarning(), false); + } + + @Subscribe(order = PostOrder.FIRST) + public void onNote(final PlayerNoteCreatedEvent event) { + listener.onNote(event.getNote()); + } + + @Subscribe(order = PostOrder.FIRST) + public void onReport(final PlayerReportEvent event) { + listener.onReport(event.getReport(), true); + } + + @Subscribe(order = PostOrder.FIRST) + public void onReport(final PlayerReportedEvent event) { + listener.onReport(event.getReport(), false); + } +} diff --git a/velocity/src/main/java/me.confuser.banmanager.velocity/listeners/JoinListener.java b/velocity/src/main/java/me.confuser.banmanager.velocity/listeners/JoinListener.java new file mode 100644 index 000000000..e128d6d18 --- /dev/null +++ b/velocity/src/main/java/me.confuser.banmanager.velocity/listeners/JoinListener.java @@ -0,0 +1,83 @@ +package me.confuser.banmanager.velocity.listeners; + +import com.velocitypowered.api.event.*; +import com.velocitypowered.api.event.connection.LoginEvent; +import com.velocitypowered.api.event.connection.PostLoginEvent; +import lombok.RequiredArgsConstructor; +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.data.PlayerData; +import me.confuser.banmanager.common.listeners.CommonJoinHandler; +import me.confuser.banmanager.common.listeners.CommonJoinListener; +import me.confuser.banmanager.common.util.IPUtils; +import me.confuser.banmanager.common.util.Message; +import me.confuser.banmanager.velocity.BMVelocityPlugin; +import me.confuser.banmanager.velocity.Listener; +import me.confuser.banmanager.velocity.VelocityPlayer; +import me.confuser.banmanager.velocity.VelocityServer; + +public class JoinListener extends Listener { + private final CommonJoinListener listener; + private BMVelocityPlugin plugin; + + public JoinListener(BMVelocityPlugin plugin) { + this.plugin = plugin; + this.listener = new CommonJoinListener(plugin.getPlugin()); + } + + @Subscribe(order = PostOrder.EARLY) + public EventTask banCheck(LoginEvent event) { + return EventTask.async(() -> this.checkBanJoin(event)); + } + + public void checkBanJoin(final LoginEvent event) { + listener.banCheck(event.getPlayer().getUniqueId(), event.getPlayer().getUsername(), + IPUtils.toIPAddress(event.getPlayer().getRemoteAddress().getAddress()), new BanJoinHandler(plugin.getPlugin(), event)); + + if (event.getResult().isAllowed()) { + listener.onPreJoin(event.getPlayer().getUniqueId(), event.getPlayer().getUsername(), + IPUtils.toIPAddress(event.getPlayer().getRemoteAddress().getAddress())); + } + } + + @Subscribe + public void onJoin(PostLoginEvent event) { + listener.onJoin(new VelocityPlayer(event.getPlayer(), plugin.getPlugin().getConfig().isOnlineMode())); + } + + @Subscribe(order = PostOrder.LAST) + public void onPlayerLogin(PostLoginEvent event) { + listener.onPlayerLogin(new VelocityPlayer(event.getPlayer(), plugin.getPlugin().getConfig().isOnlineMode()), new LoginHandler(event)); + } + + @RequiredArgsConstructor + public static class BanJoinHandler implements CommonJoinHandler { + private final BanManagerPlugin plugin; + private final LoginEvent event; + + @Override + public void handleDeny(Message message) { + event.setResult(ResultedEvent.ComponentResult.denied(VelocityServer.formatMessage(message.toString()))); + } + + @Override + public void handlePlayerDeny(PlayerData player, Message message) { + plugin.getServer().callEvent("PlayerDeniedEvent", player, message); + event.setResult(ResultedEvent.ComponentResult.denied(VelocityServer.formatMessage(message.toString()))); + } + } + + @RequiredArgsConstructor + public class LoginHandler implements CommonJoinHandler { + private final PostLoginEvent event; + + @Override + public void handleDeny(Message message) { + event.getPlayer().disconnect(VelocityServer.formatMessage(message.toString())); + } + + @Override + public void handlePlayerDeny(PlayerData player, Message message) { + handleDeny(message); + } + } +} diff --git a/velocity/src/main/java/me.confuser.banmanager.velocity/listeners/LeaveListener.java b/velocity/src/main/java/me.confuser.banmanager.velocity/listeners/LeaveListener.java new file mode 100644 index 000000000..0563625b4 --- /dev/null +++ b/velocity/src/main/java/me.confuser.banmanager.velocity/listeners/LeaveListener.java @@ -0,0 +1,30 @@ +package me.confuser.banmanager.velocity.listeners; + + +import com.velocitypowered.api.event.PostOrder; +import com.velocitypowered.api.event.ResultedEvent; +import com.velocitypowered.api.event.Subscribe; +import com.velocitypowered.api.event.connection.DisconnectEvent; +import com.velocitypowered.api.event.player.KickedFromServerEvent; +import com.velocitypowered.api.proxy.Player; + + +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.listeners.CommonLeaveListener; +import me.confuser.banmanager.velocity.Listener; + +public class LeaveListener extends Listener { + private final CommonLeaveListener listener; + + public LeaveListener(BanManagerPlugin plugin) { + this.listener = new CommonLeaveListener(plugin); + } + + @Subscribe + public void onLeave(DisconnectEvent event) { + if (ResultedEvent.GenericResult.allowed().isAllowed()) { + Player player = event.getPlayer(); + listener.onLeave(player.getUniqueId(), player.getUsername()); + } + } +} diff --git a/velocity/src/main/java/me.confuser.banmanager.velocity/listeners/NoteListener.java b/velocity/src/main/java/me.confuser.banmanager.velocity/listeners/NoteListener.java new file mode 100644 index 000000000..6f70a1545 --- /dev/null +++ b/velocity/src/main/java/me.confuser.banmanager.velocity/listeners/NoteListener.java @@ -0,0 +1,23 @@ +package me.confuser.banmanager.velocity.listeners; + + +import com.velocitypowered.api.event.PostOrder; +import com.velocitypowered.api.event.Subscribe; +import me.confuser.banmanager.velocity.Listener; +import me.confuser.banmanager.velocity.api.events.PlayerNoteCreatedEvent; +import me.confuser.banmanager.common.BanManagerPlugin; +import me.confuser.banmanager.common.listeners.CommonNoteListener; + +public class NoteListener extends Listener { + private final CommonNoteListener listener; + + public NoteListener(BanManagerPlugin plugin) { + this.listener = new CommonNoteListener(plugin); + } + + @Subscribe(order = PostOrder.FIRST) + public void notifyOnNote(PlayerNoteCreatedEvent event) { + listener.notifyOnNote(event.getNote()); + } + +} diff --git a/velocity/src/main/resources b/velocity/src/main/resources new file mode 120000 index 000000000..6d7fedbbf --- /dev/null +++ b/velocity/src/main/resources @@ -0,0 +1 @@ +../../../common/src/main/resources \ No newline at end of file