From 75db7eca3d6f61188f7c9779b53db9e790bf209d Mon Sep 17 00:00:00 2001 From: Andy Saw <7236312+andyksaw@users.noreply.github.com> Date: Mon, 21 Aug 2023 02:22:00 +0900 Subject: [PATCH 01/15] Rewrite config and storage modules (#223) * Add scheduled announcement config * Rewrite config and storage * Update config keys * Fix tests --- pcbridge-core/build.gradle.kts | 4 + .../pcbridge/core/modules/config/Config.kt | 24 +++ .../core/modules/config/ConfigStorage.kt | 5 + .../pcbridge/core/storage/StoragePath.kt | 6 + .../core/storage/adapters/JsonStorage.kt | 41 +++++ .../core/modules/config/ConfigTest.kt | 80 ++++++++ .../core/storage/adapters/JsonStorageTest.kt | 86 +++++++++ .../kotlin/com/projectcitybuild/ConfigData.kt | 174 ++++++++++++++++++ .../projectcitybuild/DependencyContainer.kt | 50 ++--- .../kotlin/com/projectcitybuild/PCBridge.kt | 1 - .../dynmap/DynmapMarkerIntegration.kt | 8 +- .../projectcitybuild/libs/config/Config.kt | 25 --- .../libs/config/ConfigKeys.kt | 49 ----- .../libs/config/ConfigStorageKey.kt | 10 - .../libs/config/KeyValueStorage.kt | 6 - .../config/adapters/MemoryKeyValueStorage.kt | 18 -- .../config/adapters/YamlKeyValueStorage.kt | 30 --- .../outputs/SentryErrorOutput.kt | 10 +- .../projectcitybuild/libs/storage/Storage.kt | 6 - .../libs/storage/StoragePath.kt | 3 - .../libs/storage/adapters/YamlStorage.kt | 22 --- .../modules/chat/ChatBadgeFormatter.kt | 8 +- .../modules/chat/ChatGroupFormatter.kt | 12 +- .../pluginutils/actions/ReloadPlugin.kt | 5 +- .../actions/SyncPlayerGroupsWithAggregate.kt | 25 ++- .../modules/warps/actions/GetWarpList.kt | 8 +- .../repositories/PlayerGroupRepository.kt | 26 ++- .../libs/config/ConfigTest.kt | 57 ------ .../SyncPlayerGroupsWithAggregateTest.kt | 34 ++-- .../modules/warps/actions/GetWarpListTest.kt | 28 ++- 30 files changed, 536 insertions(+), 325 deletions(-) create mode 100644 pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/modules/config/Config.kt create mode 100644 pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/modules/config/ConfigStorage.kt create mode 100644 pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/storage/StoragePath.kt create mode 100644 pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/storage/adapters/JsonStorage.kt create mode 100644 pcbridge-core/src/test/kotlin/com/projectcitybuild/pcbridge/core/modules/config/ConfigTest.kt create mode 100644 pcbridge-core/src/test/kotlin/com/projectcitybuild/pcbridge/core/storage/adapters/JsonStorageTest.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/ConfigData.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/config/Config.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/config/ConfigKeys.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/config/ConfigStorageKey.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/config/KeyValueStorage.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/config/adapters/MemoryKeyValueStorage.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/config/adapters/YamlKeyValueStorage.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/storage/Storage.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/storage/StoragePath.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/storage/adapters/YamlStorage.kt delete mode 100644 pcbridge-spigot/test/com/projectcitybuild/libs/config/ConfigTest.kt diff --git a/pcbridge-core/build.gradle.kts b/pcbridge-core/build.gradle.kts index b965e9bb6..0d8682c14 100644 --- a/pcbridge-core/build.gradle.kts +++ b/pcbridge-core/build.gradle.kts @@ -1,3 +1,7 @@ repositories { mavenCentral() } + +dependencies { + implementation("com.google.code.gson:gson:2.10.1") +} \ No newline at end of file diff --git a/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/modules/config/Config.kt b/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/modules/config/Config.kt new file mode 100644 index 000000000..2592b06a5 --- /dev/null +++ b/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/modules/config/Config.kt @@ -0,0 +1,24 @@ +package com.projectcitybuild.pcbridge.core.modules.config + +import com.projectcitybuild.pcbridge.core.storage.adapters.JsonStorage + +class Config( + private val default: T, + private val jsonStorage: JsonStorage, +) { + private var cache: T? = null + + fun get(): T { + val cache = cache + if (cache != null) { + return cache + } + return (jsonStorage.read() ?: default) + .also { this.cache = it } + } + + fun flush() { + cache = null + get() + } +} diff --git a/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/modules/config/ConfigStorage.kt b/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/modules/config/ConfigStorage.kt new file mode 100644 index 000000000..45f6d8d7d --- /dev/null +++ b/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/modules/config/ConfigStorage.kt @@ -0,0 +1,5 @@ +package com.projectcitybuild.pcbridge.core.modules.config + +interface ConfigStorage { + fun get(): T? +} diff --git a/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/storage/StoragePath.kt b/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/storage/StoragePath.kt new file mode 100644 index 000000000..8b9a529c8 --- /dev/null +++ b/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/storage/StoragePath.kt @@ -0,0 +1,6 @@ +package com.projectcitybuild.pcbridge.core.storage + +data class StoragePath( + val key: String, + val defaultValue: T, +) diff --git a/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/storage/adapters/JsonStorage.kt b/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/storage/adapters/JsonStorage.kt new file mode 100644 index 000000000..bc7417f6d --- /dev/null +++ b/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/storage/adapters/JsonStorage.kt @@ -0,0 +1,41 @@ +package com.projectcitybuild.pcbridge.core.storage.adapters + +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.google.gson.stream.JsonReader +import com.projectcitybuild.pcbridge.core.contracts.PlatformLogger +import java.io.File +import java.io.FileReader +import java.io.PrintWriter +import java.lang.Exception + +class JsonStorage( + private val file: File, + private val logger: PlatformLogger, + private val typeToken: TypeToken, +) { + private val gson = Gson() + + fun read(): T? { + return try { + FileReader(file).use { fileReader -> + JsonReader(fileReader).use { jsonReader -> + gson.fromJson(jsonReader, typeToken.type) + } + } + } catch (error: Exception) { + logger.severe("Failed to deserialize from json: ${error.message}") + null + } + } + + fun write(data: T) { + return try { + PrintWriter(file).use { writer -> + gson.toJson(data, typeToken.type, writer) + } + } catch (error: Exception) { + logger.severe("Failed to serialize to json: ${error.message}") + } + } +} diff --git a/pcbridge-core/src/test/kotlin/com/projectcitybuild/pcbridge/core/modules/config/ConfigTest.kt b/pcbridge-core/src/test/kotlin/com/projectcitybuild/pcbridge/core/modules/config/ConfigTest.kt new file mode 100644 index 000000000..659e2019f --- /dev/null +++ b/pcbridge-core/src/test/kotlin/com/projectcitybuild/pcbridge/core/modules/config/ConfigTest.kt @@ -0,0 +1,80 @@ +package com.projectcitybuild.pcbridge.core.modules.config + +import com.projectcitybuild.pcbridge.core.storage.adapters.JsonStorage +import kotlinx.serialization.Serializable +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import org.mockito.Mock +import org.mockito.MockitoAnnotations +import org.mockito.kotlin.verifyNoMoreInteractions +import org.mockito.kotlin.whenever + +class ConfigTest { + + @Serializable + data class TestConfig( + private val value: String, + ) + + companion object { + val defaultConfig = TestConfig(value = "default") + } + + @Mock + private lateinit var storage: JsonStorage + private lateinit var config: Config + + @BeforeEach + fun setUp() { + MockitoAnnotations.openMocks(this) + + config = Config( + default = defaultConfig, + jsonStorage = storage, + ) + } + + @Test + fun `get() returns value from storage on first call`() { + val expected = TestConfig(value = "uncached") + whenever(storage.read()).thenReturn(expected) + + assertEquals(expected, config.get()) + } + + @Test + fun `get() returns cached value on subsequent calls`() { + val expected = TestConfig(value = "uncached") + whenever(storage.read()).thenReturn(expected) + assertEquals(expected, config.get()) + + val updated = TestConfig(value = "updated") + whenever(storage.read()).thenReturn(updated) + assertEquals(expected, config.get()) + + whenever(storage.read()).thenThrow(Error()) + assertEquals(expected, config.get()) + } + + @Test + fun `get() returns default value if storage returns null`() { + whenever(storage.read()).thenReturn(null) + + assertEquals(defaultConfig, config.get()) + } + + @Test + fun `flush() clears the cache`() { + val expected = TestConfig(value = "uncached") + whenever(storage.read()).thenReturn(expected) + assertEquals(expected, config.get()) + + val updated = TestConfig(value = "updated") + whenever(storage.read()).thenReturn(updated) + assertEquals(expected, config.get()) + + config.flush() + assertEquals(updated, config.get()) + } +} diff --git a/pcbridge-core/src/test/kotlin/com/projectcitybuild/pcbridge/core/storage/adapters/JsonStorageTest.kt b/pcbridge-core/src/test/kotlin/com/projectcitybuild/pcbridge/core/storage/adapters/JsonStorageTest.kt new file mode 100644 index 000000000..df609a00d --- /dev/null +++ b/pcbridge-core/src/test/kotlin/com/projectcitybuild/pcbridge/core/storage/adapters/JsonStorageTest.kt @@ -0,0 +1,86 @@ +package com.projectcitybuild.pcbridge.core.storage.adapters + +import com.google.gson.reflect.TypeToken +import com.projectcitybuild.pcbridge.core.contracts.PlatformLogger +import kotlinx.serialization.Serializable +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import org.mockito.Mockito.mock +import java.io.File + +class JsonStorageTest { + + @Serializable + data class TestConfig( + private val testString: String, + private val testInt: Int, + private val testFloat: Float, + private val testBoolean: Boolean, + private val testList: List, + private val testObject: NestedObject, + ) + + @Serializable + data class NestedObject( + private val value: String, + ) + + companion object { + val testData = TestConfig( + testString = "string", + testInt = 123, + testFloat = 1F, + testBoolean = true, + testList = listOf("1", "2", "3"), + testObject = NestedObject(value = "test") + ) + + val jsonString = "{\"testString\":\"string\",\"testInt\":123,\"testFloat\":1.0,\"testBoolean\":true,\"testList\":[\"1\",\"2\",\"3\"],\"testObject\":{\"value\":\"test\"}}" + } + + private lateinit var logger: PlatformLogger + + @BeforeEach + fun setUp() { + logger = mock(PlatformLogger::class.java) + } + + @Test + fun `loads json data from a given file`() { + val file = File.createTempFile("test_config", ".json") + file.writeText(jsonString) + + val storage = JsonStorage( + file = file, + logger = logger, + typeToken = object : TypeToken() {} + ) + assertEquals(testData, storage.read()) + } + + @Test + fun `load returns null if error is thrown`() { + val file = File.createTempFile("test_config", ".json") + file.delete() + + val storage = JsonStorage( + file = file, + logger = logger, + typeToken = object : TypeToken() {} + ) + assertEquals(null, storage.read()) + } + + @Test + fun `writes json data to a given file`() { + val file = File.createTempFile("test_config", ".json") + val storage = JsonStorage( + file = file, + logger = logger, + typeToken = object : TypeToken() {} + ) + storage.write(testData) + assertEquals(jsonString, file.readText()) + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/ConfigData.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/ConfigData.kt new file mode 100644 index 000000000..ebba7483e --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/ConfigData.kt @@ -0,0 +1,174 @@ +package com.projectcitybuild + +import kotlinx.serialization.Serializable + +@Serializable +data class ConfigData( + val api: Api, + val database: Database, + val webServer: WebServer, + val errorReporting: ErrorReporting, + val localization: Localization, + val chatBadge: ChatBadge, + val warps: Warps, + val integrations: Integrations, + val announcements: Announcements, + val groups: Groups, +) { + companion object { + val default = ConfigData( + api = Api( + token = "FILL_THIS_IN", + baseUrl = "https://projectcitybuild.com/api/", + isLoggingEnabled = false, + ), + database = Database( + hostName = "127.0.0.1", + port = 3306, + name = "pcbridge", + username = "FILL_THIS_IN", + password = "FILL_THIS_IN", + ), + webServer = WebServer( + token = "FILL_THIS_IN", + port = 8080, + ), + errorReporting = ErrorReporting( + isSentryEnabled = false, + sentryDsn = "https://@sentry.io/", + ), + localization = Localization( + timeZone = "UTC", + locale = "en-us", + ), + chatBadge = ChatBadge( + icon = "§6★" + ), + warps = Warps( + itemsPerPage = 15, + ), + integrations = Integrations( + dynmap = Integrations.Dynmap( + warpIconName = "portal", + ) + ), + announcements = Announcements( + intervalInMins = 30, + messages = listOf( + "§bJoin the Project City Build Discord server! Type /discord in game!", + "§bDonations are the only way to keep PCB running! If you would like to donate to the server, you can do so by typing /donate in game!", + "§bVote for us to help keep PCB active! Type /vote in game!", + "§bPost screenshots of your builds to the #showcase channel on our Discord to be featured on the PCB Instagram! Type /discord to join!", + "§bMake sure to follow the Project City Build Instagram for features of YOUR builds! Type /instagram in game!", + ), + ), + groups = Groups( + displayPriority = Groups.DisplayPriority( + builder = listOf( + "architect", + "engineer", + "planner", + "builder", + "intern", + ), + trust = listOf( + "developer", + "moderator", + "trusted+", + "trusted", + "member", + ), + donor = listOf( + "donator", + "legacy-donator", + ), + ), + donorTierGroupNames = Groups.DonorTierGroupNames( + copper = "copper_tier", + iron = "iron_tier", + diamond = "diamond_tier", + ), + ), + ) + } + + @Serializable + data class Api( + val token: String, + val baseUrl: String, + val isLoggingEnabled: Boolean + ) + + @Serializable + data class Database( + val hostName: String, + val port: Int, + val name: String, + val username: String, + val password: String, + ) + + @Serializable + data class WebServer( + val token: String, + val port: Int, + ) + + @Serializable + data class ErrorReporting( + val isSentryEnabled: Boolean, + val sentryDsn: String, + ) + + @Serializable + data class Localization( + val timeZone: String, + val locale: String, + ) + + @Serializable + data class ChatBadge( + val icon: String, + ) + + @Serializable + data class Warps( + val itemsPerPage: Int, + ) + + @Serializable + data class Integrations( + val dynmap: Dynmap, + ) { + @Serializable + data class Dynmap( + val warpIconName: String, + ) + } + + @Serializable + data class Announcements( + val intervalInMins: Int, + val messages: List, + ) + + @Serializable + data class Groups( + val displayPriority: DisplayPriority, + val donorTierGroupNames: DonorTierGroupNames, + ) { + @Serializable + data class DisplayPriority( + val builder: List, + val trust: List, + val donor: List, + ) + + @Serializable + data class DonorTierGroupNames( + val copper: String, + val iron: String, + val diamond: String, + ) + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/DependencyContainer.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/DependencyContainer.kt index 865a9ae28..fe240bf76 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/DependencyContainer.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/DependencyContainer.kt @@ -1,5 +1,6 @@ package com.projectcitybuild +import com.google.gson.reflect.TypeToken import com.projectcitybuild.modules.chat.ChatBadgeFormatter import com.projectcitybuild.modules.chat.ChatGroupFormatter import com.projectcitybuild.modules.ranksync.actions.UpdatePlayerGroups @@ -7,9 +8,7 @@ import com.projectcitybuild.integrations.dynmap.DynmapMarkerIntegration import com.projectcitybuild.integrations.essentials.EssentialsIntegration import com.projectcitybuild.integrations.gadgetsmenu.GadgetsMenuIntegration import com.projectcitybuild.integrations.luckperms.LuckPermsIntegration -import com.projectcitybuild.libs.config.Config -import com.projectcitybuild.libs.config.ConfigKeys -import com.projectcitybuild.libs.config.adapters.YamlKeyValueStorage +import com.projectcitybuild.pcbridge.core.modules.config.Config import com.projectcitybuild.libs.database.DataSource import com.projectcitybuild.pcbridge.core.modules.datetime.formatter.DateTimeFormatter import com.projectcitybuild.pcbridge.core.modules.datetime.formatter.DateTimeFormatterImpl @@ -22,7 +21,7 @@ import com.projectcitybuild.libs.nameguesser.NameGuesser import com.projectcitybuild.libs.permissions.Permissions import com.projectcitybuild.libs.permissions.adapters.LuckPermsPermissions import com.projectcitybuild.libs.playercache.PlayerConfigCache -import com.projectcitybuild.libs.storage.adapters.YamlStorage +import com.projectcitybuild.pcbridge.core.storage.adapters.JsonStorage import com.projectcitybuild.modules.buildtools.nightvision.NightVisionModule import com.projectcitybuild.modules.buildtools.nightvision.commands.NightVisionCommand import com.projectcitybuild.pcbridge.core.contracts.PlatformLogger @@ -50,7 +49,6 @@ import com.projectcitybuild.support.spigot.eventbroadcast.SpigotLocalEventBroadc import com.projectcitybuild.support.spigot.listeners.SpigotListenerRegistry import com.projectcitybuild.support.spigot.SpigotServer import org.bukkit.Server -import org.bukkit.configuration.file.FileConfiguration import org.bukkit.plugin.java.JavaPlugin import java.time.Clock import java.time.ZoneId @@ -61,32 +59,36 @@ import java.util.logging.Logger as JavaLogger class DependencyContainer( val plugin: JavaPlugin, val server: Server, - val spigotConfig: FileConfiguration, val spigotLogger: JavaLogger, val minecraftDispatcher: CoroutineContext, ) { - val config: Config by lazy { + val config: Config by lazy { Config( - YamlKeyValueStorage( - storage = YamlStorage(spigotConfig) - ) + default = ConfigData.default, + jsonStorage = JsonStorage( + file = plugin.dataFolder.resolve("config.json"), + logger = logger, + typeToken = object : TypeToken(){}, + ), ) } + // TODO: inject config instead of the config keys, otherwise flushing the cache + // will never do anything val dateTimeFormatter: DateTimeFormatter get() = DateTimeFormatterImpl( locale = Locale.forLanguageTag( - config.get(ConfigKeys.timeLocale) + config.get().localization.locale, ), timezone = ZoneId.of( - config.get(ConfigKeys.timeTimezone) + config.get().localization.timeZone ), ) val time: Time get() = LocalizedTime( clock = Clock.system( - ZoneId.of(config.get(ConfigKeys.timeTimezone)) + ZoneId.of(config.get().localization.timeZone), ), ) @@ -108,12 +110,12 @@ class DependencyContainer( val dataSource by lazy { DataSource( logger = logger, - hostName = config.get(ConfigKeys.dbHostName), - port = config.get(ConfigKeys.dbPort), - databaseName = config.get(ConfigKeys.dbName), - username = config.get(ConfigKeys.dbUsername), - password = config.get(ConfigKeys.dbPassword), - shouldRunMigrations = true + hostName = config.get().database.hostName, + port = config.get().database.port, + databaseName = config.get().database.name, + username = config.get().database.username, + password = config.get().database.password, + shouldRunMigrations = true, ) } @@ -154,9 +156,9 @@ class DependencyContainer( private val httpService by lazy { HttpService( - authToken = config.get(ConfigKeys.apiToken), - baseURL = config.get(ConfigKeys.apiBaseURL), - withLogging = config.get(ConfigKeys.apiIsLoggingEnabled), + authToken = config.get().api.token, + baseURL = config.get().api.baseUrl, + withLogging = config.get().api.isLoggingEnabled, contextBuilder = { minecraftDispatcher }, ) } @@ -164,8 +166,8 @@ class DependencyContainer( val webServer by lazy { HttpServer( config = HttpServerConfig( - authToken = config.get(ConfigKeys.internalWebServerToken), - port = config.get(ConfigKeys.internalWebServerPort), + authToken = config.get().webServer.token, + port = config.get().webServer.port, ), delegate = WebServerDelegate( scheduler, diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/PCBridge.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/PCBridge.kt index a0b2d0ab0..7d86e4714 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/PCBridge.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/PCBridge.kt @@ -36,7 +36,6 @@ class PCBridge : JavaPlugin() { plugin = this, server = server, spigotLogger = logger, - spigotConfig = config, minecraftDispatcher = minecraftDispatcher ) containerLifecycle = ContainerLifecycle(container!!) diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/integrations/dynmap/DynmapMarkerIntegration.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/integrations/dynmap/DynmapMarkerIntegration.kt index be42aeedb..b388d63b5 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/integrations/dynmap/DynmapMarkerIntegration.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/integrations/dynmap/DynmapMarkerIntegration.kt @@ -1,10 +1,10 @@ package com.projectcitybuild.integrations.dynmap +import com.projectcitybuild.ConfigData import com.projectcitybuild.events.WarpCreateEvent import com.projectcitybuild.events.WarpDeleteEvent import com.projectcitybuild.integrations.SpigotIntegration -import com.projectcitybuild.libs.config.Config -import com.projectcitybuild.libs.config.ConfigKeys +import com.projectcitybuild.pcbridge.core.modules.config.Config import com.projectcitybuild.pcbridge.core.contracts.PlatformLogger import com.projectcitybuild.repositories.WarpRepository import org.bukkit.event.EventHandler @@ -15,7 +15,7 @@ import org.dynmap.DynmapAPI class DynmapMarkerIntegration( private val plugin: Plugin, private val warpRepository: WarpRepository, - private val config: Config, + private val config: Config, private val logger: PlatformLogger, ) : Listener, SpigotIntegration { @@ -88,7 +88,7 @@ class DynmapMarkerIntegration( it.deleteMarker() } - val iconName = config.get(ConfigKeys.integrationDynmapWarpIcon) + val iconName = config.get().integrations.dynmap.warpIconName val icon = markerAPI.getMarkerIcon(iconName) ?: throw DynmapMarkerIconNotFoundException() diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/config/Config.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/config/Config.kt deleted file mode 100644 index 9f9118f6b..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/config/Config.kt +++ /dev/null @@ -1,25 +0,0 @@ -package com.projectcitybuild.libs.config - -class Config( - private val keyValueStorage: KeyValueStorage, -) { - private val cache: MutableMap = mutableMapOf() - - fun get(key: ConfigStorageKey): T { - val cached = cache[key.path] - if (cached != null) { - return cached as T - } - return keyValueStorage.get(key) - .also { cache[key.path] = it as Any } - } - - fun set(key: ConfigStorageKey, value: T) { - keyValueStorage.set(key, value) - cache[key.path] = value - } - - fun flush() { - cache.clear() - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/config/ConfigKeys.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/config/ConfigKeys.kt deleted file mode 100644 index 097345361..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/config/ConfigKeys.kt +++ /dev/null @@ -1,49 +0,0 @@ -package com.projectcitybuild.libs.config - -class ConfigKeys { - companion object { - val apiToken = "api.token" defaultsTo "FILL_THIS_IN" - val apiBaseURL = "api.base_url" defaultsTo "https://projectcitybuild.com/api/" - val apiIsLoggingEnabled = "api.is_logging_enabled" defaultsTo false - - val dbHostName = "database.hostname" defaultsTo "127.0.0.1" - val dbPort = "database.port" defaultsTo 3306 - val dbName = "database.name" defaultsTo "pcbridge" - val dbUsername = "database.username" defaultsTo "FILL_THIS_IN" - val dbPassword = "database.password" defaultsTo "FILL_THIS_IN" - - val internalWebServerToken = "webserver.bearer" defaultsTo "FILL_THIS_IN" - val internalWebServerPort = "webserver.port" defaultsTo 8080 - - val errorReportingSentryEnabled = "error_reporting.sentry.enabled" defaultsTo false - val errorReportingSentryDSN = "error_reporting.sentry.dsn" defaultsTo "https://@sentry.io/" - - val timeTimezone = "time.timezone" defaultsTo "UTC" - val timeLocale = "time.locale" defaultsTo "en-us" - - val chatBadgeIcon = "chat.badge.icon" defaultsTo "§6★" - - val warpsPerPage = "warps.warps_per_page" defaultsTo 15 - - val integrationDynmapWarpIcon = "integrations.dynmap.warp_icon" defaultsTo "portal" - - val groupsBuildPriority = "groups.build_priority" defaultsTo listOf( - "architect", - "engineer", - "planner", - "builder", - "intern", - ) - val groupsTrustPriority = "groups.trust_priority" defaultsTo listOf( - "developer", - "moderator", - "trusted+", - "trusted", - "member", - ) - val groupsDonorPriority = "groups.donor_priority" defaultsTo listOf( - "donator", - "legacy-donator", - ) - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/config/ConfigStorageKey.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/config/ConfigStorageKey.kt deleted file mode 100644 index 7ecba5926..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/config/ConfigStorageKey.kt +++ /dev/null @@ -1,10 +0,0 @@ -package com.projectcitybuild.libs.config - -data class ConfigStorageKey( - val path: String, - val defaultValue: T, -) - -infix fun String.defaultsTo(defaultValue: T): ConfigStorageKey { - return ConfigStorageKey(this, defaultValue) -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/config/KeyValueStorage.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/config/KeyValueStorage.kt deleted file mode 100644 index a40cdeba9..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/config/KeyValueStorage.kt +++ /dev/null @@ -1,6 +0,0 @@ -package com.projectcitybuild.libs.config - -interface KeyValueStorage { - fun get(key: ConfigStorageKey): T - fun set(key: ConfigStorageKey, value: T) -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/config/adapters/MemoryKeyValueStorage.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/config/adapters/MemoryKeyValueStorage.kt deleted file mode 100644 index 9823d7124..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/config/adapters/MemoryKeyValueStorage.kt +++ /dev/null @@ -1,18 +0,0 @@ -package com.projectcitybuild.libs.config.adapters - -import com.projectcitybuild.libs.config.ConfigStorageKey -import com.projectcitybuild.libs.config.KeyValueStorage - -class MemoryKeyValueStorage : KeyValueStorage { - - private var data: MutableMap = mutableMapOf() - - override fun get(key: ConfigStorageKey): T { - return data[key.path]?.let { it as T } - ?: key.defaultValue - } - - override fun set(key: ConfigStorageKey, value: T) { - data[key.path] = value as Any - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/config/adapters/YamlKeyValueStorage.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/config/adapters/YamlKeyValueStorage.kt deleted file mode 100644 index c00eb77e8..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/config/adapters/YamlKeyValueStorage.kt +++ /dev/null @@ -1,30 +0,0 @@ -package com.projectcitybuild.libs.config.adapters - -import com.projectcitybuild.libs.config.ConfigStorageKey -import com.projectcitybuild.libs.config.KeyValueStorage -import com.projectcitybuild.libs.storage.StoragePath -import com.projectcitybuild.libs.storage.adapters.YamlStorage - -class YamlKeyValueStorage( - private val storage: YamlStorage, -) : KeyValueStorage { - - override fun get(key: ConfigStorageKey): T { - return storage.get( - StoragePath( - key = key.path, - defaultValue = key.defaultValue, - ) - ) - } - - override fun set(key: ConfigStorageKey, value: T) { - storage.set( - path = StoragePath( - key = key.path, - defaultValue = key.defaultValue, - ), - value = value, - ) - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/errorreporting/outputs/SentryErrorOutput.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/errorreporting/outputs/SentryErrorOutput.kt index 87e499003..7cddcd4f2 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/errorreporting/outputs/SentryErrorOutput.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/errorreporting/outputs/SentryErrorOutput.kt @@ -1,24 +1,24 @@ package com.projectcitybuild.libs.errorreporting.outputs -import com.projectcitybuild.libs.config.Config -import com.projectcitybuild.libs.config.ConfigKeys +import com.projectcitybuild.pcbridge.core.modules.config.Config +import com.projectcitybuild.ConfigData import com.projectcitybuild.libs.errorreporting.ErrorOutput import com.projectcitybuild.pcbridge.core.contracts.PlatformLogger import io.sentry.Sentry class SentryErrorOutput( - private val config: Config, + private val config: Config, private val logger: PlatformLogger, ) : ErrorOutput { override fun start() { - val isEnabled = config.get(ConfigKeys.errorReportingSentryEnabled) + val isEnabled = config.get().errorReporting.isSentryEnabled if (!isEnabled) return logger.info("Enabling error reporting") Sentry.init { options -> - options.dsn = config.get(ConfigKeys.errorReportingSentryDSN) + options.dsn = config.get().errorReporting.sentryDsn } } diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/storage/Storage.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/storage/Storage.kt deleted file mode 100644 index 78924adb2..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/storage/Storage.kt +++ /dev/null @@ -1,6 +0,0 @@ -package com.projectcitybuild.libs.storage - -interface Storage { - fun get(path: StoragePath): T - fun set(path: StoragePath, value: T) -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/storage/StoragePath.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/storage/StoragePath.kt deleted file mode 100644 index cdb4c0656..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/storage/StoragePath.kt +++ /dev/null @@ -1,3 +0,0 @@ -package com.projectcitybuild.libs.storage - -data class StoragePath(val key: String, val defaultValue: T) diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/storage/adapters/YamlStorage.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/storage/adapters/YamlStorage.kt deleted file mode 100644 index e9c3dd2bc..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/storage/adapters/YamlStorage.kt +++ /dev/null @@ -1,22 +0,0 @@ -package com.projectcitybuild.libs.storage.adapters - -import com.projectcitybuild.libs.storage.Storage -import com.projectcitybuild.libs.storage.StoragePath -import org.bukkit.configuration.file.FileConfiguration - -class YamlStorage( - private val config: FileConfiguration -) : Storage { - - override fun get(path: StoragePath): T { - val value = config.get(path.key) as T - if (value != null) { - return value - } - return path.defaultValue - } - - override fun set(path: StoragePath, value: T) { - config.set(path.key, value) - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/chat/ChatBadgeFormatter.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/chat/ChatBadgeFormatter.kt index 91985daf7..5516c8d8f 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/chat/ChatBadgeFormatter.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/chat/ChatBadgeFormatter.kt @@ -1,7 +1,7 @@ package com.projectcitybuild.modules.chat -import com.projectcitybuild.libs.config.Config -import com.projectcitybuild.libs.config.ConfigKeys +import com.projectcitybuild.ConfigData +import com.projectcitybuild.pcbridge.core.modules.config.Config import com.projectcitybuild.repositories.ChatBadgeRepository import com.projectcitybuild.repositories.PlayerConfigRepository import com.projectcitybuild.support.textcomponent.add @@ -15,7 +15,7 @@ import java.util.UUID class ChatBadgeFormatter( private val playerConfigRepository: PlayerConfigRepository, private val chatBadgeRepository: ChatBadgeRepository, - private val config: Config, + private val config: Config, ) { fun get(playerUUID: UUID): TextComponent? { val playerConfig = playerConfigRepository.get(playerUUID) @@ -39,7 +39,7 @@ class ChatBadgeFormatter( val tc = TextComponent() TextComponent - .fromLegacyText(config.get(ConfigKeys.chatBadgeIcon)) + .fromLegacyText(config.get().chatBadge.icon) .forEach { c -> tc.add(c) { it.hoverEvent = HoverEvent( diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/chat/ChatGroupFormatter.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/chat/ChatGroupFormatter.kt index 4679c3cf6..d88fd0064 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/chat/ChatGroupFormatter.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/chat/ChatGroupFormatter.kt @@ -1,7 +1,7 @@ package com.projectcitybuild.modules.chat -import com.projectcitybuild.libs.config.Config -import com.projectcitybuild.libs.config.ConfigKeys +import com.projectcitybuild.ConfigData +import com.projectcitybuild.pcbridge.core.modules.config.Config import com.projectcitybuild.libs.permissions.Permissions import net.md_5.bungee.api.chat.BaseComponent import net.md_5.bungee.api.chat.HoverEvent @@ -11,7 +11,7 @@ import java.util.UUID class ChatGroupFormatter( private val permissions: Permissions, - private val config: Config, + private val config: Config, ) { data class Aggregate( val prefix: List, @@ -114,9 +114,9 @@ class ChatGroupFormatter( } private fun buildGroupList() { - val trustedGroupPriority = config.get(ConfigKeys.groupsTrustPriority) - val builderGroupPriority = config.get(ConfigKeys.groupsBuildPriority) - val donorGroupPriority = config.get(ConfigKeys.groupsDonorPriority) + val trustedGroupPriority = config.get().groups.displayPriority.trust + val builderGroupPriority = config.get().groups.displayPriority.builder + val donorGroupPriority = config.get().groups.displayPriority.donor trustedGroupPriority.withIndex().forEach { groupPriorities[it.value.lowercase()] = Pair(GroupType.TRUST, it.index) diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/pluginutils/actions/ReloadPlugin.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/pluginutils/actions/ReloadPlugin.kt index 01ba9133f..75410d893 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/pluginutils/actions/ReloadPlugin.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/pluginutils/actions/ReloadPlugin.kt @@ -1,7 +1,8 @@ package com.projectcitybuild.modules.pluginutils.actions +import com.projectcitybuild.ConfigData import com.projectcitybuild.modules.chat.ChatGroupFormatter -import com.projectcitybuild.libs.config.Config +import com.projectcitybuild.pcbridge.core.modules.config.Config import com.projectcitybuild.libs.playercache.PlayerConfigCache import com.projectcitybuild.repositories.WarpRepository @@ -9,7 +10,7 @@ class ReloadPlugin( private val chatGroupFormatter: ChatGroupFormatter, private val playerConfigCache: PlayerConfigCache, private val warpRepository: WarpRepository, - private val config: Config, + private val config: Config, ) { fun execute() { chatGroupFormatter.flushAllCaches() diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/ranksync/actions/SyncPlayerGroupsWithAggregate.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/ranksync/actions/SyncPlayerGroupsWithAggregate.kt index ea57db041..618e55644 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/ranksync/actions/SyncPlayerGroupsWithAggregate.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/ranksync/actions/SyncPlayerGroupsWithAggregate.kt @@ -1,7 +1,7 @@ package com.projectcitybuild.modules.ranksync.actions -import com.projectcitybuild.libs.config.Config -import com.projectcitybuild.libs.config.ConfigStorageKey +import com.projectcitybuild.ConfigData +import com.projectcitybuild.pcbridge.core.modules.config.Config import com.projectcitybuild.libs.permissions.Permissions import com.projectcitybuild.pcbridge.core.contracts.PlatformLogger import com.projectcitybuild.pcbridge.http.responses.Aggregate @@ -9,7 +9,7 @@ import java.util.UUID class SyncPlayerGroupsWithAggregate( private val permissions: Permissions, - private val config: Config, + private val config: Config, private val logger: PlatformLogger, ) { fun execute(playerUUID: UUID, aggregate: Aggregate) { @@ -23,17 +23,16 @@ class SyncPlayerGroupsWithAggregate( aggregate.donationPerks.mapNotNull { donorPerk -> val tierName = donorPerk.donationTier.name - val configNode = ConfigStorageKey( - path = "donors.tiers.$tierName.permission_group_name", - defaultValue = null - ) - val permissionGroupName = config.get(configNode) - - if (permissionGroupName == null) { - logger.severe("Missing config node for donor tier: $tierName") - return@mapNotNull null + val groupNames = config.get().groups.donorTierGroupNames + val permissionGroupName = when (tierName) { + "copper_tier" -> groupNames.copper + "iron_tier" -> groupNames.iron + "diamond_tier" -> groupNames.diamond + else -> { + logger.severe("Missing config node for donor tier: $tierName") + return@mapNotNull null + } } - return@mapNotNull permissionGroupName } ) diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/warps/actions/GetWarpList.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/warps/actions/GetWarpList.kt index 42aa54e45..13a1c468f 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/warps/actions/GetWarpList.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/warps/actions/GetWarpList.kt @@ -1,7 +1,7 @@ package com.projectcitybuild.modules.warps.actions -import com.projectcitybuild.libs.config.Config -import com.projectcitybuild.libs.config.ConfigKeys +import com.projectcitybuild.ConfigData +import com.projectcitybuild.pcbridge.core.modules.config.Config import com.projectcitybuild.repositories.WarpRepository import kotlin.math.ceil import kotlin.math.max @@ -9,7 +9,7 @@ import kotlin.math.min class GetWarpList( private val warpRepository: WarpRepository, - private val config: Config + private val config: Config ) { data class WarpList( val totalWarps: Int, @@ -19,7 +19,7 @@ class GetWarpList( ) fun getList(page: Int = 1): WarpList? { - val warpsPerPage = config.get(ConfigKeys.warpsPerPage) + val warpsPerPage = config.get().warps.itemsPerPage val availableWarps = warpRepository.names() val totalWarpPages = ceil((availableWarps.size.toDouble() / warpsPerPage.toDouble())).toInt() diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/repositories/PlayerGroupRepository.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/repositories/PlayerGroupRepository.kt index 9bed69a9b..2ab188a94 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/repositories/PlayerGroupRepository.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/repositories/PlayerGroupRepository.kt @@ -1,14 +1,14 @@ package com.projectcitybuild.repositories -import com.projectcitybuild.libs.config.Config -import com.projectcitybuild.libs.config.ConfigStorageKey +import com.projectcitybuild.ConfigData +import com.projectcitybuild.pcbridge.core.modules.config.Config import com.projectcitybuild.pcbridge.core.contracts.PlatformLogger import com.projectcitybuild.pcbridge.http.services.pcb.PlayerGroupHttpService import java.util.UUID class PlayerGroupRepository( private val playerGroupHttpService: PlayerGroupHttpService, - private val config: Config, + private val config: Config, private val logger: PlatformLogger, ) { @Throws(PlayerGroupHttpService.NoLinkedAccountException::class) @@ -24,18 +24,16 @@ class PlayerGroupRepository( return perks.mapNotNull { donorPerk -> val tierName = donorPerk.donationTier.name - val configNode = ConfigStorageKey( - path = "donors.tiers.$tierName.permission_group_name", - defaultValue = null - ) - val permissionGroupName = config.get(configNode) - - if (permissionGroupName == null) { - logger.severe("Missing config node for donor tier: $tierName") - return@mapNotNull null + val groupNames = config.get().groups.donorTierGroupNames + when (tierName) { + "copper" -> groupNames.copper + "iron" -> groupNames.iron + "diamond" -> groupNames.diamond + else -> { + logger.severe("Missing config node for donor tier: $tierName") + null + } } - - return@mapNotNull permissionGroupName } } } diff --git a/pcbridge-spigot/test/com/projectcitybuild/libs/config/ConfigTest.kt b/pcbridge-spigot/test/com/projectcitybuild/libs/config/ConfigTest.kt deleted file mode 100644 index 3f7b36ea3..000000000 --- a/pcbridge-spigot/test/com/projectcitybuild/libs/config/ConfigTest.kt +++ /dev/null @@ -1,57 +0,0 @@ -package com.projectcitybuild.libs.config - -import com.projectcitybuild.libs.config.adapters.MemoryKeyValueStorage -import org.junit.jupiter.api.Assertions.assertEquals -import org.junit.jupiter.api.BeforeEach -import org.junit.jupiter.api.Test - -class ConfigTest { - - private lateinit var config: Config - private lateinit var keyValueStorage: MemoryKeyValueStorage - - @BeforeEach - fun setUp() { - keyValueStorage = MemoryKeyValueStorage() - config = Config(keyValueStorage) - } - - @Test - fun `get() returns value in storage`() { - val key = ConfigStorageKey("test", defaultValue = "default") - keyValueStorage.set(key, "value") - - assertEquals("value", config.get(key)) - } - - @Test - fun `get() returns default value if not set`() { - val key = ConfigStorageKey("test", defaultValue = "default") - - assertEquals("default", config.get(key)) - } - - @Test - fun `get() caches value`() { - val key = ConfigStorageKey("test", defaultValue = "default") - keyValueStorage.set(key, "value1") - assertEquals("value1", config.get(key)) - - keyValueStorage.set(key, "value2") - assertEquals("value1", config.get(key)) - } - - @Test - fun `set() updates cache and storage`() { - val key = ConfigStorageKey("test", defaultValue = "default") - keyValueStorage.set(key, "value1") - assertEquals("value1", config.get(key)) - - keyValueStorage.set(key, "value2") - assertEquals("value1", config.get(key)) - - config.set(key, "value2") - assertEquals("value2", config.get(key)) - assertEquals("value2", keyValueStorage.get(key)) - } -} diff --git a/pcbridge-spigot/test/com/projectcitybuild/modules/ranksync/actions/SyncPlayerGroupsWithAggregateTest.kt b/pcbridge-spigot/test/com/projectcitybuild/modules/ranksync/actions/SyncPlayerGroupsWithAggregateTest.kt index 57afc9fbc..606dbf05d 100644 --- a/pcbridge-spigot/test/com/projectcitybuild/modules/ranksync/actions/SyncPlayerGroupsWithAggregateTest.kt +++ b/pcbridge-spigot/test/com/projectcitybuild/modules/ranksync/actions/SyncPlayerGroupsWithAggregateTest.kt @@ -1,8 +1,7 @@ package com.projectcitybuild.modules.ranksync.actions -import com.projectcitybuild.libs.config.Config -import com.projectcitybuild.libs.config.ConfigStorageKey -import com.projectcitybuild.libs.config.adapters.MemoryKeyValueStorage +import com.projectcitybuild.ConfigData +import com.projectcitybuild.pcbridge.core.modules.config.Config import com.projectcitybuild.libs.permissions.Permissions import com.projectcitybuild.pcbridge.core.contracts.PlatformLogger import com.projectcitybuild.pcbridge.http.responses.Account @@ -13,24 +12,30 @@ import com.projectcitybuild.pcbridge.http.responses.Group import kotlinx.coroutines.test.runTest import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test +import org.mockito.Mock import org.mockito.Mockito.mock import org.mockito.Mockito.verify +import org.mockito.MockitoAnnotations +import org.mockito.kotlin.whenever import java.util.UUID class SyncPlayerGroupsWithAggregateTest { - private lateinit var useCase: SyncPlayerGroupsWithAggregate + @Mock private lateinit var permissions: Permissions - private lateinit var keyValueStorage: MemoryKeyValueStorage + + @Mock + private lateinit var config: Config + + private lateinit var useCase: SyncPlayerGroupsWithAggregate @BeforeEach fun setUp() { - permissions = mock(Permissions::class.java) - keyValueStorage = MemoryKeyValueStorage() + MockitoAnnotations.openMocks(this) useCase = SyncPlayerGroupsWithAggregate( permissions = permissions, - config = Config(keyValueStorage), + config = config, logger = mock(PlatformLogger::class.java), ) } @@ -47,10 +52,15 @@ class SyncPlayerGroupsWithAggregateTest { val aggregate = Aggregate(account = account, donationPerks = listOf(donorPerk)) val uuid = UUID.randomUUID() - keyValueStorage.set( - key = ConfigStorageKey(path = "donors.tiers.copper_tier.permission_group_name", defaultValue = "default"), - value = "tier1", - ) + whenever(config.get()).thenReturn(ConfigData.default.copy( + groups = ConfigData.default.groups.copy( + donorTierGroupNames = ConfigData.Groups.DonorTierGroupNames( + copper = "tier1", + iron = "tier2", + diamond = "tier3", + ), + ), + )) useCase.execute(uuid, aggregate) diff --git a/pcbridge-spigot/test/com/projectcitybuild/modules/warps/actions/GetWarpListTest.kt b/pcbridge-spigot/test/com/projectcitybuild/modules/warps/actions/GetWarpListTest.kt index 1d367f844..c2e887cc0 100644 --- a/pcbridge-spigot/test/com/projectcitybuild/modules/warps/actions/GetWarpListTest.kt +++ b/pcbridge-spigot/test/com/projectcitybuild/modules/warps/actions/GetWarpListTest.kt @@ -1,29 +1,31 @@ package com.projectcitybuild.modules.warps.actions -import com.projectcitybuild.libs.config.Config -import com.projectcitybuild.libs.config.ConfigKeys -import com.projectcitybuild.libs.config.adapters.MemoryKeyValueStorage +import com.projectcitybuild.ConfigData +import com.projectcitybuild.pcbridge.core.modules.config.Config import com.projectcitybuild.repositories.WarpRepository import kotlinx.coroutines.test.runTest import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Assertions.assertTrue import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test +import org.mockito.Mock import org.mockito.Mockito.mock +import org.mockito.MockitoAnnotations import org.mockito.kotlin.whenever class GetWarpListTest { + @Mock + private lateinit var config: Config + private lateinit var useCase: GetWarpList - private lateinit var keyValueStorage: MemoryKeyValueStorage - private lateinit var config: Config private val warpRepository = mock(WarpRepository::class.java) @BeforeEach fun setUp() { - keyValueStorage = MemoryKeyValueStorage() - config = Config(keyValueStorage) + MockitoAnnotations.openMocks(this) + useCase = GetWarpList( warpRepository, config, @@ -34,7 +36,9 @@ class GetWarpListTest { fun `should return all warps sorted`() = runTest { val warps = listOf("b", "c", "a",) whenever(warpRepository.names()).thenReturn(warps) - keyValueStorage.set(ConfigKeys.warpsPerPage, warps.size) + whenever(config.get()).thenReturn(ConfigData.default.copy( + warps = ConfigData.Warps(itemsPerPage = warps.size), + )) val received = useCase.getList(page = 1) val expected = listOf("a", "b", "c") @@ -47,7 +51,9 @@ class GetWarpListTest { val warps = MutableList(3) { index -> "warp_$index" } whenever(warpRepository.names()).thenReturn(warps) - keyValueStorage.set(ConfigKeys.warpsPerPage, 3) + whenever(config.get()).thenReturn(ConfigData.default.copy( + warps = ConfigData.Warps(itemsPerPage = 3), + )) val received = useCase.getList(page = 1) @@ -64,7 +70,9 @@ class GetWarpListTest { val warps = MutableList(5) { index -> "warp_$index" } whenever(warpRepository.names()).thenReturn(warps) - keyValueStorage.set(ConfigKeys.warpsPerPage, 2) + whenever(config.get()).thenReturn(ConfigData.default.copy( + warps = ConfigData.Warps(itemsPerPage = 2), + )) val firstPage = useCase.getList(page = 1) assertEquals(listOf("warp_0", "warp_1"), firstPage?.warps) From 8b059ed4a3cb7f0b59fce6990031d065630c3892 Mon Sep 17 00:00:00 2001 From: Andy Saw <7236312+andyksaw@users.noreply.github.com> Date: Tue, 12 Sep 2023 23:03:35 +0900 Subject: [PATCH 02/15] Force unregister clashing commands (#225) --- .../pcbridge/core/storage/adapters/JsonStorage.kt | 7 +++++-- pcbridge-spigot/build.gradle.kts | 2 +- .../src/main/kotlin/com/projectcitybuild/PCBridge.kt | 8 ++++++++ 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/storage/adapters/JsonStorage.kt b/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/storage/adapters/JsonStorage.kt index bc7417f6d..9db927223 100644 --- a/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/storage/adapters/JsonStorage.kt +++ b/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/storage/adapters/JsonStorage.kt @@ -1,6 +1,7 @@ package com.projectcitybuild.pcbridge.core.storage.adapters -import com.google.gson.Gson +import com.google.gson.FieldNamingPolicy +import com.google.gson.GsonBuilder import com.google.gson.reflect.TypeToken import com.google.gson.stream.JsonReader import com.projectcitybuild.pcbridge.core.contracts.PlatformLogger @@ -14,7 +15,9 @@ class JsonStorage( private val logger: PlatformLogger, private val typeToken: TypeToken, ) { - private val gson = Gson() + private val gson = GsonBuilder() + .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES) + .create() fun read(): T? { return try { diff --git a/pcbridge-spigot/build.gradle.kts b/pcbridge-spigot/build.gradle.kts index 3fcdb9584..6df107077 100644 --- a/pcbridge-spigot/build.gradle.kts +++ b/pcbridge-spigot/build.gradle.kts @@ -51,7 +51,7 @@ dependencies { implementation("com.zaxxer:HikariCP:5.0.1") implementation("co.aikar:idb-core:1.0.0-SNAPSHOT") implementation("io.sentry:sentry:5.7.4") - implementation("dev.jorel:commandapi-bukkit-shade:9.0.3") + implementation("dev.jorel:commandapi-bukkit-shade:9.1.0") testImplementation("net.md-5:bungeecord-api:1.16-R0.4") testImplementation("org.spigotmc:spigot-api:1.20.1-R0.1-SNAPSHOT") diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/PCBridge.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/PCBridge.kt index 7d86e4714..d4e8511bf 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/PCBridge.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/PCBridge.kt @@ -15,6 +15,7 @@ import com.projectcitybuild.modules.telemetry.TelemetryModule import com.projectcitybuild.modules.warps.WarpsModule import com.projectcitybuild.support.modules.ModuleRegisterDSL import dev.jorel.commandapi.CommandAPI +import dev.jorel.commandapi.CommandAPIBukkit import dev.jorel.commandapi.CommandAPIBukkitConfig import org.bukkit.plugin.java.JavaPlugin @@ -32,6 +33,13 @@ class PCBridge : JavaPlugin() { override fun onEnable() { printLogo() + // Since CommandAPIBukkit doesn't support namespaces (yet?), we need to force + // unregister Essentials commands that name clash with ours + CommandAPIBukkit.unregister("ban", false, true) + CommandAPIBukkit.unregister("unban", false, true) + CommandAPIBukkit.unregister("mute", false, true) + CommandAPIBukkit.unregister("unmute", false, true) + container = DependencyContainer( plugin = this, server = server, From dd7ee3245cd0d9e0f3968c05bad3b0368767e5b4 Mon Sep 17 00:00:00 2001 From: Andy Saw <7236312+andyksaw@users.noreply.github.com> Date: Thu, 14 Sep 2023 23:35:22 +0900 Subject: [PATCH 03/15] Fix ASCII characters being eaten by gson (#226) * Fix ASCII characters being eaten by gson * Add test --- .../core/storage/adapters/JsonStorage.kt | 14 +++++++------- .../core/storage/adapters/JsonStorageTest.kt | 19 +++++++++++++++++++ .../projectcitybuild/DependencyContainer.kt | 9 --------- .../kotlin/com/projectcitybuild/PCBridge.kt | 3 ++- .../nightvision/NightVisionModule.kt | 6 ++---- 5 files changed, 30 insertions(+), 21 deletions(-) diff --git a/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/storage/adapters/JsonStorage.kt b/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/storage/adapters/JsonStorage.kt index 9db927223..0c035a8bb 100644 --- a/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/storage/adapters/JsonStorage.kt +++ b/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/storage/adapters/JsonStorage.kt @@ -3,10 +3,8 @@ package com.projectcitybuild.pcbridge.core.storage.adapters import com.google.gson.FieldNamingPolicy import com.google.gson.GsonBuilder import com.google.gson.reflect.TypeToken -import com.google.gson.stream.JsonReader import com.projectcitybuild.pcbridge.core.contracts.PlatformLogger import java.io.File -import java.io.FileReader import java.io.PrintWriter import java.lang.Exception @@ -17,15 +15,17 @@ class JsonStorage( ) { private val gson = GsonBuilder() .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES) + .disableHtmlEscaping() .create() fun read(): T? { return try { - FileReader(file).use { fileReader -> - JsonReader(fileReader).use { jsonReader -> - gson.fromJson(jsonReader, typeToken.type) - } - } + // Normally we'd pass a FileReader+JsonReader to gson to read the file contents, + // but it's unable to interpret ASCII characters. For some reason, feeding a + // JSON string to it instead doesn't have the same problem... + var jsonString = "" + file.inputStream().bufferedReader().forEachLine { jsonString += it } + gson.fromJson(jsonString, typeToken.type) } catch (error: Exception) { logger.severe("Failed to deserialize from json: ${error.message}") null diff --git a/pcbridge-core/src/test/kotlin/com/projectcitybuild/pcbridge/core/storage/adapters/JsonStorageTest.kt b/pcbridge-core/src/test/kotlin/com/projectcitybuild/pcbridge/core/storage/adapters/JsonStorageTest.kt index df609a00d..5c0073d0a 100644 --- a/pcbridge-core/src/test/kotlin/com/projectcitybuild/pcbridge/core/storage/adapters/JsonStorageTest.kt +++ b/pcbridge-core/src/test/kotlin/com/projectcitybuild/pcbridge/core/storage/adapters/JsonStorageTest.kt @@ -26,6 +26,11 @@ class JsonStorageTest { private val value: String, ) + @Serializable + data class StringConfig( + private val string: String, + ) + companion object { val testData = TestConfig( testString = "string", @@ -83,4 +88,18 @@ class JsonStorageTest { storage.write(testData) assertEquals(jsonString, file.readText()) } + + @Test + fun `can read ASCII characters`() { + val file = File.createTempFile("test_config", ".json") + file.writeText("{\"string\": \"§6test★\"}") + + val storage = JsonStorage( + file = file, + logger = logger, + typeToken = object : TypeToken() {} + ) + val expected = StringConfig(string = "§6test★") + assertEquals(expected, storage.read()) + } } diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/DependencyContainer.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/DependencyContainer.kt index fe240bf76..2ce806e7a 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/DependencyContainer.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/DependencyContainer.kt @@ -297,13 +297,4 @@ class DependencyContainer( chatGroupFormatter, ) } - - /** - * Modules - */ - - val nightVisionModule - get() = NightVisionModule( - nightVisionCommandFactory = { NightVisionCommand() }, - ) } diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/PCBridge.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/PCBridge.kt index d4e8511bf..f9dc1573f 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/PCBridge.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/PCBridge.kt @@ -3,6 +3,7 @@ package com.projectcitybuild import com.github.shynixn.mccoroutine.bukkit.minecraftDispatcher import com.projectcitybuild.integrations.SpigotIntegration import com.projectcitybuild.modules.buildtools.invisframes.InvisFramesModule +import com.projectcitybuild.modules.buildtools.nightvision.NightVisionModule import com.projectcitybuild.modules.chat.ChatModule import com.projectcitybuild.modules.joinmessages.JoinMessagesModule import com.projectcitybuild.modules.moderation.bans.BansModule @@ -103,7 +104,7 @@ private class ContainerLifecycle( InvisFramesModule(), JoinMessagesModule(), MutesModule(), - nightVisionModule, + NightVisionModule(), PluginUtilsModule(), RankSyncModule(), StaffChatModule(), diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/nightvision/NightVisionModule.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/nightvision/NightVisionModule.kt index 9eea61db7..a0a77d038 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/nightvision/NightVisionModule.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/nightvision/NightVisionModule.kt @@ -8,9 +8,7 @@ import com.projectcitybuild.support.modules.PluginModule import dev.jorel.commandapi.arguments.MultiLiteralArgument import dev.jorel.commandapi.executors.PlayerCommandExecutor -class NightVisionModule( - private val nightVisionCommandFactory: () -> NightVisionCommand, -): PluginModule { +class NightVisionModule: PluginModule { override fun register(module: ModuleDeclaration) = module { command("nv") { @@ -26,7 +24,7 @@ class NightVisionModule( "off" -> ToggleOption.OFF else -> ToggleOption.UNSPECIFIED } - nightVisionCommandFactory().execute(player, desiredState) + NightVisionCommand().execute(player, desiredState) }) } } From 1edd5e32715c10c91bde2eee64ff35d374a4bd42 Mon Sep 17 00:00:00 2001 From: Andy Saw <7236312+andyksaw@users.noreply.github.com> Date: Fri, 15 Sep 2023 00:13:21 +0900 Subject: [PATCH 04/15] Show time online upon disconnecting (#227) --- .../projectcitybuild/DependencyContainer.kt | 5 +++ .../joinmessages/JoinMessagesModule.kt | 11 +++++-- .../joinmessages/PlayerJoinTimeCache.kt | 23 +++++++++++++ .../listeners/AnnounceJoinListener.kt | 9 +++-- .../listeners/AnnounceQuitListener.kt | 33 +++++++++++++++++-- .../modules/pluginutils/PluginUtilsModule.kt | 1 + .../listeners/CachePlayerOnJoinListener.kt | 5 +-- 7 files changed, 77 insertions(+), 10 deletions(-) create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/PlayerJoinTimeCache.kt diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/DependencyContainer.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/DependencyContainer.kt index 2ce806e7a..394516b2d 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/DependencyContainer.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/DependencyContainer.kt @@ -24,6 +24,7 @@ import com.projectcitybuild.libs.playercache.PlayerConfigCache import com.projectcitybuild.pcbridge.core.storage.adapters.JsonStorage import com.projectcitybuild.modules.buildtools.nightvision.NightVisionModule import com.projectcitybuild.modules.buildtools.nightvision.commands.NightVisionCommand +import com.projectcitybuild.modules.joinmessages.PlayerJoinTimeCache import com.projectcitybuild.pcbridge.core.contracts.PlatformLogger import com.projectcitybuild.pcbridge.core.contracts.PlatformScheduler import com.projectcitybuild.pcbridge.http.HttpService @@ -184,6 +185,10 @@ class DependencyContainer( val spigotNamespace get() = SpigotNamespace(plugin) + val playerJoinTimeCache by lazy { + PlayerJoinTimeCache(time) + } + /** * Repositories */ diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/JoinMessagesModule.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/JoinMessagesModule.kt index 382774795..23e17c5da 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/JoinMessagesModule.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/JoinMessagesModule.kt @@ -11,10 +11,17 @@ class JoinMessagesModule: PluginModule { override fun register(module: ModuleDeclaration) { module { listener( - AnnounceJoinListener(container.server), + AnnounceJoinListener( + container.spigotServer, + container.playerJoinTimeCache, + ), ) listener( - AnnounceQuitListener(container.server), + AnnounceQuitListener( + container.spigotServer, + container.playerJoinTimeCache, + container.time, + ), ) listener( FirstTimeJoinListener( diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/PlayerJoinTimeCache.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/PlayerJoinTimeCache.kt new file mode 100644 index 000000000..4e7fa60d8 --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/PlayerJoinTimeCache.kt @@ -0,0 +1,23 @@ +package com.projectcitybuild.modules.joinmessages + +import com.projectcitybuild.pcbridge.core.modules.datetime.time.Time +import java.time.LocalDateTime +import java.util.UUID + +class PlayerJoinTimeCache( + private val time: Time, +) { + private val joinTimes: MutableMap = mutableMapOf() + + fun get(uuid: UUID): LocalDateTime? { + return joinTimes[uuid] + } + + fun put(uuid: UUID) { + joinTimes[uuid] = time.now() + } + + fun remove(uuid: UUID) { + joinTimes.remove(uuid) + } +} \ No newline at end of file diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/listeners/AnnounceJoinListener.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/listeners/AnnounceJoinListener.kt index a446f4d84..ca178a2f8 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/listeners/AnnounceJoinListener.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/listeners/AnnounceJoinListener.kt @@ -1,19 +1,23 @@ package com.projectcitybuild.modules.joinmessages.listeners +import com.projectcitybuild.modules.joinmessages.PlayerJoinTimeCache +import com.projectcitybuild.support.spigot.SpigotServer import com.projectcitybuild.support.spigot.listeners.SpigotListener import com.projectcitybuild.support.textcomponent.add import net.md_5.bungee.api.ChatColor import net.md_5.bungee.api.chat.TextComponent -import org.bukkit.Server import org.bukkit.event.EventHandler import org.bukkit.event.player.PlayerJoinEvent class AnnounceJoinListener( - private val server: Server, + private val server: SpigotServer, + private val playerJoinTimeCache: PlayerJoinTimeCache, ) : SpigotListener { @EventHandler override suspend fun handle(event: PlayerJoinEvent) { + playerJoinTimeCache.put(event.player.uniqueId) + server.broadcastMessage( TextComponent() .add("+ ") { @@ -22,7 +26,6 @@ class AnnounceJoinListener( } .add(event.player.name) { it.color = ChatColor.WHITE } .add(" joined the server") { it.color = ChatColor.GRAY } - .toLegacyText() ) } } diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/listeners/AnnounceQuitListener.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/listeners/AnnounceQuitListener.kt index 25c717820..d8d17d1d5 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/listeners/AnnounceQuitListener.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/listeners/AnnounceQuitListener.kt @@ -1,19 +1,27 @@ package com.projectcitybuild.modules.joinmessages.listeners +import com.projectcitybuild.modules.joinmessages.PlayerJoinTimeCache +import com.projectcitybuild.pcbridge.core.modules.datetime.time.Time +import com.projectcitybuild.support.spigot.SpigotServer import com.projectcitybuild.support.spigot.listeners.SpigotListener import com.projectcitybuild.support.textcomponent.add import net.md_5.bungee.api.ChatColor import net.md_5.bungee.api.chat.TextComponent -import org.bukkit.Server import org.bukkit.event.EventHandler import org.bukkit.event.player.PlayerQuitEvent +import java.time.Duration class AnnounceQuitListener( - private val server: Server, + private val server: SpigotServer, + private val playerJoinTimeCache: PlayerJoinTimeCache, + private val time: Time, ) : SpigotListener { @EventHandler override suspend fun handle(event: PlayerQuitEvent) { + val joinTime = playerJoinTimeCache.get(event.player.uniqueId) + playerJoinTimeCache.remove(event.player.uniqueId) + server.broadcastMessage( TextComponent() .add("- ") { @@ -22,7 +30,26 @@ class AnnounceQuitListener( } .add(event.player.name) { it.color = ChatColor.WHITE } .add(" left the server") { it.color = ChatColor.GRAY } - .toLegacyText() + .also { + if (joinTime != null) { + val now = time.now() + val diff = Duration.between(joinTime, now) + + val secsOnline = diff.toSeconds() + val minsOnline = diff.toMinutes() + val hoursOnline = diff.toHours() + + val timeOnline = if (secsOnline < 60) { + "$secsOnline sec" + if (secsOnline > 1) "s" else "" + } else if(minsOnline < 60) { + "$minsOnline min" + if (minsOnline > 1) "s" else "" + } else { + "$hoursOnline hour" + if (hoursOnline > 1) "s" else "" + } + + it.add(" (online for $timeOnline)") + } + } ) } } diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/pluginutils/PluginUtilsModule.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/pluginutils/PluginUtilsModule.kt index 87beefa95..426f235fd 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/pluginutils/PluginUtilsModule.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/pluginutils/PluginUtilsModule.kt @@ -49,6 +49,7 @@ class PluginUtilsModule: PluginModule { container.localEventBroadcaster, container.playerConfigRepository, container.logger, + container.time, ), ) listener( diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/pluginutils/listeners/CachePlayerOnJoinListener.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/pluginutils/listeners/CachePlayerOnJoinListener.kt index 18aa3d8d0..ed6d66fd4 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/pluginutils/listeners/CachePlayerOnJoinListener.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/pluginutils/listeners/CachePlayerOnJoinListener.kt @@ -2,18 +2,19 @@ package com.projectcitybuild.modules.pluginutils.listeners import com.projectcitybuild.events.FirstTimeJoinEvent import com.projectcitybuild.pcbridge.core.contracts.PlatformLogger +import com.projectcitybuild.pcbridge.core.modules.datetime.time.Time import com.projectcitybuild.repositories.PlayerConfigRepository import com.projectcitybuild.support.spigot.eventbroadcast.LocalEventBroadcaster import com.projectcitybuild.support.spigot.listeners.SpigotListener import org.bukkit.event.EventHandler import org.bukkit.event.player.PlayerJoinEvent -import java.time.LocalDateTime // TODO: move this to somewhere more appropriate class CachePlayerOnJoinListener( private val localEventBroadcaster: LocalEventBroadcaster, private val playerConfigRepository: PlayerConfigRepository, private val logger: PlatformLogger, + private val time: Time, ) : SpigotListener { @EventHandler @@ -31,7 +32,7 @@ class CachePlayerOnJoinListener( uuid = uuid, isMuted = false, isChatBadgeDisabled = false, - firstSeen = LocalDateTime.now(), + firstSeen = time.now(), ) } } From 334805ec245b5b3167d499854aeab88e9fb657c2 Mon Sep 17 00:00:00 2001 From: Andy Saw <7236312+andyksaw@users.noreply.github.com> Date: Fri, 15 Sep 2023 19:48:10 +0900 Subject: [PATCH 05/15] Fix donor tiers not being assigned on login (#229) * Fix donor tiers not being assigned on login * Fix test --- .../ranksync/actions/SyncPlayerGroupsWithAggregate.kt | 6 +++--- .../ranksync/actions/SyncPlayerGroupsWithAggregateTest.kt | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/ranksync/actions/SyncPlayerGroupsWithAggregate.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/ranksync/actions/SyncPlayerGroupsWithAggregate.kt index 618e55644..644a45e43 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/ranksync/actions/SyncPlayerGroupsWithAggregate.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/ranksync/actions/SyncPlayerGroupsWithAggregate.kt @@ -25,9 +25,9 @@ class SyncPlayerGroupsWithAggregate( val groupNames = config.get().groups.donorTierGroupNames val permissionGroupName = when (tierName) { - "copper_tier" -> groupNames.copper - "iron_tier" -> groupNames.iron - "diamond_tier" -> groupNames.diamond + "copper" -> groupNames.copper + "iron" -> groupNames.iron + "diamond" -> groupNames.diamond else -> { logger.severe("Missing config node for donor tier: $tierName") return@mapNotNull null diff --git a/pcbridge-spigot/test/com/projectcitybuild/modules/ranksync/actions/SyncPlayerGroupsWithAggregateTest.kt b/pcbridge-spigot/test/com/projectcitybuild/modules/ranksync/actions/SyncPlayerGroupsWithAggregateTest.kt index 606dbf05d..a78427385 100644 --- a/pcbridge-spigot/test/com/projectcitybuild/modules/ranksync/actions/SyncPlayerGroupsWithAggregateTest.kt +++ b/pcbridge-spigot/test/com/projectcitybuild/modules/ranksync/actions/SyncPlayerGroupsWithAggregateTest.kt @@ -48,7 +48,7 @@ class SyncPlayerGroupsWithAggregateTest { Group(minecraftName = "group2"), ) ) - val donorPerk = DonationPerk(donationTier = DonationTier(name = "copper_tier")) + val donorPerk = DonationPerk(donationTier = DonationTier(name = "copper")) val aggregate = Aggregate(account = account, donationPerks = listOf(donorPerk)) val uuid = UUID.randomUUID() From 67ae98626ba428edf6b9eda6494fbe5816b768ac Mon Sep 17 00:00:00 2001 From: Andy Saw <7236312+andyksaw@users.noreply.github.com> Date: Fri, 15 Sep 2023 21:00:32 +0900 Subject: [PATCH 06/15] Create `/bin` command (#230) * Create bin command * Remove print --- .../kotlin/com/projectcitybuild/PCBridge.kt | 2 ++ .../com/projectcitybuild/Permissions.kt | 1 + .../general/GeneralBuildToolsModule.kt | 26 +++++++++++++++ .../buildtools/general/commands/BinCommand.kt | 17 ++++++++++ .../general/listeners/BinCloseListener.kt | 32 +++++++++++++++++++ .../support/spigot/SpigotServer.kt | 6 ++++ 6 files changed, 84 insertions(+) create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/general/GeneralBuildToolsModule.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/general/commands/BinCommand.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/general/listeners/BinCloseListener.kt diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/PCBridge.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/PCBridge.kt index f9dc1573f..54a45aa55 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/PCBridge.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/PCBridge.kt @@ -2,6 +2,7 @@ package com.projectcitybuild import com.github.shynixn.mccoroutine.bukkit.minecraftDispatcher import com.projectcitybuild.integrations.SpigotIntegration +import com.projectcitybuild.modules.buildtools.general.GeneralBuildToolsModule import com.projectcitybuild.modules.buildtools.invisframes.InvisFramesModule import com.projectcitybuild.modules.buildtools.nightvision.NightVisionModule import com.projectcitybuild.modules.chat.ChatModule @@ -101,6 +102,7 @@ private class ContainerLifecycle( listOf( BansModule(), ChatModule(), + GeneralBuildToolsModule(), InvisFramesModule(), JoinMessagesModule(), MutesModule(), diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/Permissions.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/Permissions.kt index 2d4bf73ac..e0684f5f7 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/Permissions.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/Permissions.kt @@ -4,6 +4,7 @@ class Permissions private constructor() { companion object { const val COMMAND_BUILD_NIGHTVISION = "pcbridge.build.nightvision" const val COMMAND_BUILD_INVIS_FRAME = "pcbridge.build.invisframe" + const val COMMAND_BUILD_BIN = "pcbridge.build.bin" const val COMMAND_CHAT_TOGGLE_BADGE = "pcbridge.chat.badge" const val COMMAND_BANS_BAN = "pcbridge.ban.ban" const val COMMAND_BANS_BAN_IP = "pcbridge.ban.banip" diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/general/GeneralBuildToolsModule.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/general/GeneralBuildToolsModule.kt new file mode 100644 index 000000000..53d413f28 --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/general/GeneralBuildToolsModule.kt @@ -0,0 +1,26 @@ +package com.projectcitybuild.modules.buildtools.general + +import com.projectcitybuild.Permissions +import com.projectcitybuild.modules.buildtools.general.commands.BinCommand +import com.projectcitybuild.modules.buildtools.general.listeners.BinCloseListener +import com.projectcitybuild.support.modules.ModuleDeclaration +import com.projectcitybuild.support.modules.PluginModule +import dev.jorel.commandapi.executors.PlayerCommandExecutor + +class GeneralBuildToolsModule: PluginModule { + + override fun register(module: ModuleDeclaration) = module { + command("bin") { + withAliases("trash") + withPermission(Permissions.COMMAND_BUILD_BIN) + withShortDescription("Opens a temporary menu to dispose of items and blocks") + executesPlayer(PlayerCommandExecutor { player, _ -> + BinCommand(container.spigotServer).execute(player) + }) + } + + listener( + BinCloseListener() + ) + } +} \ No newline at end of file diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/general/commands/BinCommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/general/commands/BinCommand.kt new file mode 100644 index 000000000..88c9babe2 --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/general/commands/BinCommand.kt @@ -0,0 +1,17 @@ +package com.projectcitybuild.modules.buildtools.general.commands + +import com.projectcitybuild.support.spigot.SpigotServer +import org.bukkit.entity.Player + +class BinCommand( + private val spigotServer: SpigotServer, +) { + fun execute(player: Player) { + val inventory = spigotServer.createInventory( + owner = player, + size = 36, + title = "Garbage Bin", + ) + player.openInventory(inventory) + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/general/listeners/BinCloseListener.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/general/listeners/BinCloseListener.kt new file mode 100644 index 000000000..cac14d523 --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/general/listeners/BinCloseListener.kt @@ -0,0 +1,32 @@ +package com.projectcitybuild.modules.buildtools.general.listeners + +import com.projectcitybuild.support.spigot.listeners.SpigotListener +import net.md_5.bungee.api.ChatColor +import net.md_5.bungee.api.chat.TextComponent +import org.bukkit.event.EventHandler +import org.bukkit.event.inventory.InventoryCloseEvent +import org.bukkit.event.inventory.InventoryType + +class BinCloseListener : SpigotListener { + + @EventHandler + override suspend fun handle(event: InventoryCloseEvent) { + if (event.inventory.type != InventoryType.CHEST) return + + val inventoryTitle = event.view.title + if (inventoryTitle != "Garbage Bin") return + + val disposedCount = event.inventory.contents + .filterNotNull() + .sumOf { it.amount } + + if (disposedCount == 0) return + + event.player.spigot().sendMessage( + TextComponent("Disposed of \uD83D\uDD25 $disposedCount items").apply { + color = ChatColor.GRAY + isItalic = true + } + ) + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/spigot/SpigotServer.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/spigot/SpigotServer.kt index 1bdf04e71..3dca23ece 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/spigot/SpigotServer.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/spigot/SpigotServer.kt @@ -3,6 +3,8 @@ package com.projectcitybuild.support.spigot import net.md_5.bungee.api.ChatColor import net.md_5.bungee.api.chat.TextComponent import org.bukkit.Server +import org.bukkit.entity.Player +import org.bukkit.inventory.Inventory import java.util.UUID class SpigotServer( @@ -43,4 +45,8 @@ class SpigotServer( fun broadcastMessage(message: TextComponent) { server.broadcastMessage(message.toLegacyText()) } + + fun createInventory(owner: Player, size: Int, title: String): Inventory { + return server.createInventory(owner, size, title) + } } \ No newline at end of file From abf6fc0fe886c44cbeade06856a48b52fa9f78fa Mon Sep 17 00:00:00 2001 From: Andy Saw <7236312+andyksaw@users.noreply.github.com> Date: Sat, 16 Sep 2023 22:47:39 +0900 Subject: [PATCH 07/15] Use config for join/leave messages (#232) --- .../core/storage/adapters/JsonStorageTest.kt | 2 +- .../kotlin/com/projectcitybuild/ConfigData.kt | 22 +++ .../joinmessages/JoinMessagesModule.kt | 9 +- .../listeners/AnnounceJoinListener.kt | 16 +-- .../listeners/AnnounceQuitListener.kt | 55 ++++---- .../listeners/FirstTimeJoinListener.kt | 24 ++-- .../listeners/ServerOverviewJoinListener.kt | 22 +-- .../test/com/projectcitybuild/Mock.kt | 13 ++ .../listeners/AnnounceJoinListenerTest.kt | 55 ++++++++ .../listeners/AnnounceQuitListenerTest.kt | 127 ++++++++++++++++++ .../listeners/FirstTimeJoinListenerTest.kt | 50 +++++++ .../ServerOverviewJoinListenerTest.kt | 46 +++++++ 12 files changed, 367 insertions(+), 74 deletions(-) create mode 100644 pcbridge-spigot/test/com/projectcitybuild/Mock.kt create mode 100644 pcbridge-spigot/test/com/projectcitybuild/modules/joinmessages/listeners/AnnounceJoinListenerTest.kt create mode 100644 pcbridge-spigot/test/com/projectcitybuild/modules/joinmessages/listeners/AnnounceQuitListenerTest.kt create mode 100644 pcbridge-spigot/test/com/projectcitybuild/modules/joinmessages/listeners/FirstTimeJoinListenerTest.kt create mode 100644 pcbridge-spigot/test/com/projectcitybuild/modules/joinmessages/listeners/ServerOverviewJoinListenerTest.kt diff --git a/pcbridge-core/src/test/kotlin/com/projectcitybuild/pcbridge/core/storage/adapters/JsonStorageTest.kt b/pcbridge-core/src/test/kotlin/com/projectcitybuild/pcbridge/core/storage/adapters/JsonStorageTest.kt index 5c0073d0a..c1085d981 100644 --- a/pcbridge-core/src/test/kotlin/com/projectcitybuild/pcbridge/core/storage/adapters/JsonStorageTest.kt +++ b/pcbridge-core/src/test/kotlin/com/projectcitybuild/pcbridge/core/storage/adapters/JsonStorageTest.kt @@ -41,7 +41,7 @@ class JsonStorageTest { testObject = NestedObject(value = "test") ) - val jsonString = "{\"testString\":\"string\",\"testInt\":123,\"testFloat\":1.0,\"testBoolean\":true,\"testList\":[\"1\",\"2\",\"3\"],\"testObject\":{\"value\":\"test\"}}" + val jsonString = "{\"test_string\":\"string\",\"test_int\":123,\"test_float\":1.0,\"test_boolean\":true,\"test_list\":[\"1\",\"2\",\"3\"],\"test_object\":{\"value\":\"test\"}}" } private lateinit var logger: PlatformLogger diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/ConfigData.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/ConfigData.kt index ebba7483e..3cd5fca23 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/ConfigData.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/ConfigData.kt @@ -14,6 +14,7 @@ data class ConfigData( val integrations: Integrations, val announcements: Announcements, val groups: Groups, + val messages: Messages, ) { companion object { val default = ConfigData( @@ -89,6 +90,19 @@ data class ConfigData( diamond = "diamond_tier", ), ), + messages = Messages( + join = "§a§l+ §r§f%name% §7joined the server", + leave = "§c§l- §r§f%name% §7left the server (online for %time_online%)", + firstTimeJoin = "§d✦ Welcome §f%name%§d to the server!", + welcome = """ + #§3Welcome to §f§lPROJECT §6§lCITY §9§lBUILD + # + #§3Type §c/register §3to become a member. + #§3Type §c/list§6 §3to see who else is online. + # + #§f§lAsk our staff if you have any questions. + """.trimMargin("#"), + ) ) } @@ -171,4 +185,12 @@ data class ConfigData( val diamond: String, ) } + + @Serializable + data class Messages( + val join: String, + val leave: String, + val firstTimeJoin: String, + val welcome: String, + ) } diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/JoinMessagesModule.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/JoinMessagesModule.kt index 23e17c5da..bce068899 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/JoinMessagesModule.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/JoinMessagesModule.kt @@ -13,24 +13,29 @@ class JoinMessagesModule: PluginModule { listener( AnnounceJoinListener( container.spigotServer, + container.config, container.playerJoinTimeCache, ), ) listener( AnnounceQuitListener( container.spigotServer, + container.config, container.playerJoinTimeCache, container.time, ), ) listener( FirstTimeJoinListener( - container.server, + container.spigotServer, + container.config, container.logger, ), ) listener( - ServerOverviewJoinListener(container.server), + ServerOverviewJoinListener( + container.config, + ), ) } } diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/listeners/AnnounceJoinListener.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/listeners/AnnounceJoinListener.kt index ca178a2f8..56c071b73 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/listeners/AnnounceJoinListener.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/listeners/AnnounceJoinListener.kt @@ -1,16 +1,17 @@ package com.projectcitybuild.modules.joinmessages.listeners +import com.projectcitybuild.ConfigData import com.projectcitybuild.modules.joinmessages.PlayerJoinTimeCache +import com.projectcitybuild.pcbridge.core.modules.config.Config import com.projectcitybuild.support.spigot.SpigotServer import com.projectcitybuild.support.spigot.listeners.SpigotListener -import com.projectcitybuild.support.textcomponent.add -import net.md_5.bungee.api.ChatColor import net.md_5.bungee.api.chat.TextComponent import org.bukkit.event.EventHandler import org.bukkit.event.player.PlayerJoinEvent class AnnounceJoinListener( private val server: SpigotServer, + private val config: Config, private val playerJoinTimeCache: PlayerJoinTimeCache, ) : SpigotListener { @@ -18,14 +19,11 @@ class AnnounceJoinListener( override suspend fun handle(event: PlayerJoinEvent) { playerJoinTimeCache.put(event.player.uniqueId) + val message = config.get().messages.join + .replace("%name%", event.player.name) + server.broadcastMessage( - TextComponent() - .add("+ ") { - it.color = ChatColor.GREEN - it.isBold = true - } - .add(event.player.name) { it.color = ChatColor.WHITE } - .add(" joined the server") { it.color = ChatColor.GRAY } + TextComponent(message) ) } } diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/listeners/AnnounceQuitListener.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/listeners/AnnounceQuitListener.kt index d8d17d1d5..79b94f3a4 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/listeners/AnnounceQuitListener.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/listeners/AnnounceQuitListener.kt @@ -1,11 +1,11 @@ package com.projectcitybuild.modules.joinmessages.listeners +import com.projectcitybuild.ConfigData import com.projectcitybuild.modules.joinmessages.PlayerJoinTimeCache +import com.projectcitybuild.pcbridge.core.modules.config.Config import com.projectcitybuild.pcbridge.core.modules.datetime.time.Time import com.projectcitybuild.support.spigot.SpigotServer import com.projectcitybuild.support.spigot.listeners.SpigotListener -import com.projectcitybuild.support.textcomponent.add -import net.md_5.bungee.api.ChatColor import net.md_5.bungee.api.chat.TextComponent import org.bukkit.event.EventHandler import org.bukkit.event.player.PlayerQuitEvent @@ -13,43 +13,38 @@ import java.time.Duration class AnnounceQuitListener( private val server: SpigotServer, + private val config: Config, private val playerJoinTimeCache: PlayerJoinTimeCache, private val time: Time, ) : SpigotListener { @EventHandler override suspend fun handle(event: PlayerQuitEvent) { - val joinTime = playerJoinTimeCache.get(event.player.uniqueId) + val joinTime = playerJoinTimeCache + .get(event.player.uniqueId) ?: time.now() playerJoinTimeCache.remove(event.player.uniqueId) + val now = time.now() + val diff = Duration.between(joinTime, now) + + val secsOnline = diff.toSeconds() + val minsOnline = diff.toMinutes() + val hoursOnline = diff.toHours() + + val timeOnline = if (secsOnline < 60) { + "$secsOnline sec" + if (secsOnline > 1) "s" else "" + } else if(minsOnline < 60) { + "$minsOnline min" + if (minsOnline > 1) "s" else "" + } else { + "$hoursOnline hour" + if (hoursOnline > 1) "s" else "" + } + + val message = config.get().messages.leave + .replace("%name%", event.player.name) + .replace("%time_online%", timeOnline) + server.broadcastMessage( - TextComponent() - .add("- ") { - it.color = ChatColor.RED - it.isBold = true - } - .add(event.player.name) { it.color = ChatColor.WHITE } - .add(" left the server") { it.color = ChatColor.GRAY } - .also { - if (joinTime != null) { - val now = time.now() - val diff = Duration.between(joinTime, now) - - val secsOnline = diff.toSeconds() - val minsOnline = diff.toMinutes() - val hoursOnline = diff.toHours() - - val timeOnline = if (secsOnline < 60) { - "$secsOnline sec" + if (secsOnline > 1) "s" else "" - } else if(minsOnline < 60) { - "$minsOnline min" + if (minsOnline > 1) "s" else "" - } else { - "$hoursOnline hour" + if (hoursOnline > 1) "s" else "" - } - - it.add(" (online for $timeOnline)") - } - } + TextComponent(message) ) } } diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/listeners/FirstTimeJoinListener.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/listeners/FirstTimeJoinListener.kt index 3fe35b6ea..af5a1e4b4 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/listeners/FirstTimeJoinListener.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/listeners/FirstTimeJoinListener.kt @@ -1,16 +1,17 @@ package com.projectcitybuild.modules.joinmessages.listeners +import com.projectcitybuild.ConfigData import com.projectcitybuild.events.FirstTimeJoinEvent import com.projectcitybuild.pcbridge.core.contracts.PlatformLogger +import com.projectcitybuild.pcbridge.core.modules.config.Config +import com.projectcitybuild.support.spigot.SpigotServer import com.projectcitybuild.support.spigot.listeners.SpigotListener -import com.projectcitybuild.support.textcomponent.add -import net.md_5.bungee.api.ChatColor import net.md_5.bungee.api.chat.TextComponent -import org.bukkit.Server import org.bukkit.event.EventHandler class FirstTimeJoinListener( - private val server: Server, + private val server: SpigotServer, + private val config: Config, private val logger: PlatformLogger, ) : SpigotListener { @@ -18,18 +19,11 @@ class FirstTimeJoinListener( override suspend fun handle(event: FirstTimeJoinEvent) { logger.debug("Sending first-time welcome message for ${event.player.name}") + val message = config.get().messages.firstTimeJoin + .replace("%name%", event.player.name) + server.broadcastMessage( - TextComponent() - .add("✦ Welcome ") { - it.color = ChatColor.LIGHT_PURPLE - } - .add(event.player.name) { - it.color = ChatColor.WHITE - } - .add(" to the server!") { - it.color = ChatColor.LIGHT_PURPLE - } - .toLegacyText() + TextComponent(message) ) } } diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/listeners/ServerOverviewJoinListener.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/listeners/ServerOverviewJoinListener.kt index ad40f6cf6..6628af538 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/listeners/ServerOverviewJoinListener.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/listeners/ServerOverviewJoinListener.kt @@ -1,34 +1,22 @@ package com.projectcitybuild.modules.joinmessages.listeners +import com.projectcitybuild.ConfigData +import com.projectcitybuild.pcbridge.core.modules.config.Config import com.projectcitybuild.support.spigot.listeners.SpigotListener -import com.projectcitybuild.support.textcomponent.add import net.md_5.bungee.api.chat.TextComponent -import org.bukkit.Server import org.bukkit.event.EventHandler import org.bukkit.event.player.PlayerJoinEvent class ServerOverviewJoinListener( - private val server: Server, + private val config: Config, ) : SpigotListener { @EventHandler override suspend fun handle(event: PlayerJoinEvent) { - val onlinePlayerCount = server.onlinePlayers.size + val message = config.get().messages.welcome event.player.spigot().sendMessage( - TextComponent().add( - TextComponent.fromLegacyText( - """ - #§3Welcome to §f§lPROJECT §6§lCITY §9§lBUILD - # - #§3Type §c/register §3to become a member. - #§3Type §c/list§6 §3to see who else is online. - #§3Players online:§c $onlinePlayerCount - # - #§f§lAsk our staff if you have any questions. - """.trimMargin("#") - ) - ) + TextComponent(message) ) } } diff --git a/pcbridge-spigot/test/com/projectcitybuild/Mock.kt b/pcbridge-spigot/test/com/projectcitybuild/Mock.kt new file mode 100644 index 000000000..43df24685 --- /dev/null +++ b/pcbridge-spigot/test/com/projectcitybuild/Mock.kt @@ -0,0 +1,13 @@ +package com.projectcitybuild + +import org.mockito.Mockito + +/** + * Mocks a class or interface that has generic types + * + * Usage: + * ``` + * val myClass = mock>() + * ``` + */ +inline fun mock(): T = Mockito.mock(T::class.java)!! \ No newline at end of file diff --git a/pcbridge-spigot/test/com/projectcitybuild/modules/joinmessages/listeners/AnnounceJoinListenerTest.kt b/pcbridge-spigot/test/com/projectcitybuild/modules/joinmessages/listeners/AnnounceJoinListenerTest.kt new file mode 100644 index 000000000..f400aedfa --- /dev/null +++ b/pcbridge-spigot/test/com/projectcitybuild/modules/joinmessages/listeners/AnnounceJoinListenerTest.kt @@ -0,0 +1,55 @@ +package com.projectcitybuild.modules.joinmessages.listeners + +import com.projectcitybuild.ConfigData +import com.projectcitybuild.modules.joinmessages.PlayerJoinTimeCache +import com.projectcitybuild.pcbridge.core.modules.config.Config +import com.projectcitybuild.support.spigot.SpigotServer +import kotlinx.coroutines.test.runTest +import net.md_5.bungee.api.chat.TextComponent +import org.bukkit.entity.Player +import org.bukkit.event.player.PlayerJoinEvent +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import org.mockito.Mockito.mock +import org.mockito.Mockito.verify +import org.mockito.kotlin.whenever +import java.util.* + +class AnnounceJoinListenerTest { + private lateinit var player: Player + private lateinit var server: SpigotServer + private lateinit var playerJoinTimeCache: PlayerJoinTimeCache + private lateinit var config: Config + + @BeforeEach + fun setUp() { + player = mock(Player::class.java) + server = mock(SpigotServer::class.java) + playerJoinTimeCache = mock(PlayerJoinTimeCache::class.java) + config = mock() + } + + @Test + fun `broadcasts join message set in config`() = runTest { + whenever(player.name).thenReturn("player_name") + whenever(player.uniqueId).thenReturn(UUID.randomUUID()) + + whenever(config.get()).thenReturn(ConfigData.default.copy( + messages = ConfigData.default.messages.copy( + join = "%name% joined the server", + ), + )) + + val event = PlayerJoinEvent(player, "join message") + AnnounceJoinListener( + server, + config, + playerJoinTimeCache, + ).handle(event) + + verify(server).broadcastMessage( + TextComponent("player_name joined the server") + ) + } +} + diff --git a/pcbridge-spigot/test/com/projectcitybuild/modules/joinmessages/listeners/AnnounceQuitListenerTest.kt b/pcbridge-spigot/test/com/projectcitybuild/modules/joinmessages/listeners/AnnounceQuitListenerTest.kt new file mode 100644 index 000000000..69dd4bd45 --- /dev/null +++ b/pcbridge-spigot/test/com/projectcitybuild/modules/joinmessages/listeners/AnnounceQuitListenerTest.kt @@ -0,0 +1,127 @@ +package com.projectcitybuild.modules.joinmessages.listeners + +import com.projectcitybuild.ConfigData +import com.projectcitybuild.modules.joinmessages.PlayerJoinTimeCache +import com.projectcitybuild.pcbridge.core.modules.config.Config +import com.projectcitybuild.pcbridge.core.modules.datetime.time.Time +import com.projectcitybuild.support.spigot.SpigotServer +import kotlinx.coroutines.test.runTest +import net.md_5.bungee.api.chat.TextComponent +import org.bukkit.entity.Player +import org.bukkit.event.player.PlayerQuitEvent +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import org.mockito.Mockito.mock +import org.mockito.Mockito.verify +import org.mockito.kotlin.whenever +import java.time.LocalDateTime +import java.util.UUID + +class AnnounceQuitListenerTest { + private lateinit var player: Player + private lateinit var server: SpigotServer + private lateinit var playerJoinTimeCache: PlayerJoinTimeCache + private lateinit var config: Config + private lateinit var time: Time + + @BeforeEach + fun setUp() { + player = mock(Player::class.java) + server = mock(SpigotServer::class.java) + playerJoinTimeCache = mock(PlayerJoinTimeCache::class.java) + config = mock() + time = mock(Time::class.java) + } + + @Test + fun `broadcasts quit message set in config`() = runTest { + val uuid = UUID.randomUUID() + val joinTime = LocalDateTime.of(2023, 9, 16, 0, 0) + val now = LocalDateTime.of(2023, 9, 16, 1, 30) + + whenever(time.now()).thenReturn(now) + whenever(player.name).thenReturn("player_name") + whenever(player.uniqueId).thenReturn(uuid) + whenever(playerJoinTimeCache.get(uuid)).thenReturn(joinTime) + whenever(config.get()).thenReturn(ConfigData.default.copy( + messages = ConfigData.default.messages.copy( + leave = "%name% left the server (online for %time_online%)", + ), + )) + + val event = PlayerQuitEvent(player, "quit message") + AnnounceQuitListener( + server, + config, + playerJoinTimeCache, + time, + ).handle(event) + + verify(server).broadcastMessage( + TextComponent("player_name left the server (online for 1 hour)") + ) + } + + + @Test + fun `shows highest time unit for connection time`() = runTest { + listOf( + Pair( + LocalDateTime.of(2023, 9, 17, 2, 0), + "26 hours", + ), + Pair( + LocalDateTime.of(2023, 9, 16, 2, 15), + "2 hours", + ), + Pair( + LocalDateTime.of(2023, 9, 16, 1, 30), + "1 hour", + ), + Pair( + LocalDateTime.of(2023, 9, 16, 0, 30), + "30 mins", + ), + Pair( + LocalDateTime.of(2023, 9, 16, 0, 1), + "1 min", + ), + Pair( + LocalDateTime.of(2023, 9, 16, 0, 0, 30), + "30 secs", + ), + Pair( + LocalDateTime.of(2023, 9, 16, 0, 0, 1), + "1 sec", + ), + ).forEach { pair -> + val now = pair.first + val expectedTime = pair.second + val uuid = UUID.randomUUID() + + val joinTime = LocalDateTime.of(2023, 9, 16, 0, 0) + whenever(time.now()).thenReturn(now) + whenever(player.name).thenReturn("player_name") + whenever(player.uniqueId).thenReturn(uuid) + whenever(playerJoinTimeCache.get(uuid)).thenReturn(joinTime) + whenever(config.get()).thenReturn(ConfigData.default.copy( + messages = ConfigData.default.messages.copy( + leave = "%name% left the server (online for %time_online%)", + ), + )) + + val event = PlayerQuitEvent(player, "quit message") + AnnounceQuitListener( + server, + config, + playerJoinTimeCache, + time, + ).handle(event) + + verify(server).broadcastMessage( + TextComponent("player_name left the server (online for $expectedTime)") + ) + } + } +} + diff --git a/pcbridge-spigot/test/com/projectcitybuild/modules/joinmessages/listeners/FirstTimeJoinListenerTest.kt b/pcbridge-spigot/test/com/projectcitybuild/modules/joinmessages/listeners/FirstTimeJoinListenerTest.kt new file mode 100644 index 000000000..887776456 --- /dev/null +++ b/pcbridge-spigot/test/com/projectcitybuild/modules/joinmessages/listeners/FirstTimeJoinListenerTest.kt @@ -0,0 +1,50 @@ +package com.projectcitybuild.modules.joinmessages.listeners + +import com.projectcitybuild.ConfigData +import com.projectcitybuild.events.FirstTimeJoinEvent +import com.projectcitybuild.pcbridge.core.contracts.PlatformLogger +import com.projectcitybuild.pcbridge.core.modules.config.Config +import com.projectcitybuild.support.spigot.SpigotServer +import kotlinx.coroutines.test.runTest +import net.md_5.bungee.api.chat.TextComponent +import org.bukkit.entity.Player +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import org.mockito.Mockito.mock +import org.mockito.Mockito.verify +import org.mockito.kotlin.whenever + +class FirstTimeJoinListenerTest { + private lateinit var player: Player + private lateinit var server: SpigotServer + private lateinit var config: Config + + @BeforeEach + fun setUp() { + player = mock(Player::class.java) + server = mock(SpigotServer::class.java) + config = mock() + } + + @Test + fun `broadcasts first time join message set in config`() = runTest { + whenever(player.name).thenReturn("player_name") + whenever(config.get()).thenReturn(ConfigData.default.copy( + messages = ConfigData.default.messages.copy( + firstTimeJoin = "Welcome %name% to the server", + ), + )) + + val event = FirstTimeJoinEvent(player) + FirstTimeJoinListener( + server, + config, + mock(PlatformLogger::class.java), + ).handle(event) + + verify(server).broadcastMessage( + TextComponent("Welcome player_name to the server") + ) + } +} + diff --git a/pcbridge-spigot/test/com/projectcitybuild/modules/joinmessages/listeners/ServerOverviewJoinListenerTest.kt b/pcbridge-spigot/test/com/projectcitybuild/modules/joinmessages/listeners/ServerOverviewJoinListenerTest.kt new file mode 100644 index 000000000..186e281ec --- /dev/null +++ b/pcbridge-spigot/test/com/projectcitybuild/modules/joinmessages/listeners/ServerOverviewJoinListenerTest.kt @@ -0,0 +1,46 @@ +package com.projectcitybuild.modules.joinmessages.listeners + +import com.projectcitybuild.ConfigData +import com.projectcitybuild.pcbridge.core.modules.config.Config +import kotlinx.coroutines.test.runTest +import net.md_5.bungee.api.chat.TextComponent +import org.bukkit.entity.Player +import org.bukkit.event.player.PlayerJoinEvent +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import org.mockito.Mockito.mock +import org.mockito.Mockito.verify +import org.mockito.kotlin.whenever + +class ServerOverviewJoinListenerTest { + private lateinit var player: Player + private lateinit var spigotPlayer: Player.Spigot + private lateinit var config: Config + + @BeforeEach + fun setUp() { + player = mock(Player::class.java) + spigotPlayer = mock(Player.Spigot::class.java) + config = mock() + + whenever(player.spigot()).thenReturn(spigotPlayer) + } + + @Test + fun `sends welcome message set in config`() = runTest { + val welcomeMessage = "welcome message" + whenever(config.get()).thenReturn(ConfigData.default.copy( + messages = ConfigData.default.messages.copy( + welcome = welcomeMessage, + ), + )) + + val event = PlayerJoinEvent(player, "join message") + ServerOverviewJoinListener(config).handle(event) + + verify(player.spigot()).sendMessage( + TextComponent(welcomeMessage) + ) + } +} + From e2d9352e92a936ae771916ffaab780907f83d05b Mon Sep 17 00:00:00 2001 From: Andy Saw <7236312+andyksaw@users.noreply.github.com> Date: Sun, 17 Sep 2023 23:13:24 +0900 Subject: [PATCH 08/15] Add scheduled announcements (#228) * Add scheduled announcements * Add repository layer and cache last broadcast index * Add tests --- .../core/modules/config/ConfigStorage.kt | 5 -- .../core/modules/filecache/FileCache.kt | 19 +++++ .../projectcitybuild/DependencyContainer.kt | 36 ++++---- .../kotlin/com/projectcitybuild/PCBridge.kt | 14 +++- .../announcements/AnnouncementsModule.kt | 25 ++++++ .../actions/StartAnnouncementTimer.kt | 42 ++++++++++ .../ScheduledAnnouncementsRepository.kt | 32 +++++++ .../support/modules/PluginModule.kt | 1 + .../support/spigot/SpigotTimer.kt | 13 ++- .../actions/StartAnnouncementTimerTest.kt | 58 +++++++++++++ .../nightvision/NightVisionModuleTest.kt | 5 -- .../modules/warps/actions/CreateWarpTest.kt | 1 - .../ScheduledAnnouncementsRepositoryTest.kt | 83 +++++++++++++++++++ 13 files changed, 305 insertions(+), 29 deletions(-) delete mode 100644 pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/modules/config/ConfigStorage.kt create mode 100644 pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/modules/filecache/FileCache.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/announcements/AnnouncementsModule.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/announcements/actions/StartAnnouncementTimer.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/repositories/ScheduledAnnouncementsRepository.kt create mode 100644 pcbridge-spigot/test/com/projectcitybuild/modules/announcements/actions/StartAnnouncementTimerTest.kt delete mode 100644 pcbridge-spigot/test/com/projectcitybuild/modules/buildtools/nightvision/NightVisionModuleTest.kt create mode 100644 pcbridge-spigot/test/com/projectcitybuild/repositories/ScheduledAnnouncementsRepositoryTest.kt diff --git a/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/modules/config/ConfigStorage.kt b/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/modules/config/ConfigStorage.kt deleted file mode 100644 index 45f6d8d7d..000000000 --- a/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/modules/config/ConfigStorage.kt +++ /dev/null @@ -1,5 +0,0 @@ -package com.projectcitybuild.pcbridge.core.modules.config - -interface ConfigStorage { - fun get(): T? -} diff --git a/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/modules/filecache/FileCache.kt b/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/modules/filecache/FileCache.kt new file mode 100644 index 000000000..993de6ac4 --- /dev/null +++ b/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/modules/filecache/FileCache.kt @@ -0,0 +1,19 @@ +package com.projectcitybuild.pcbridge.core.modules.filecache + +import com.projectcitybuild.pcbridge.core.storage.adapters.JsonStorage + +class FileCache( + private val jsonStorage: JsonStorage, +) { + private var cache: T? = null + + fun get(): T? { + return cache + ?: jsonStorage.read().also { cache = it } + } + + fun put(value: T) { + cache = value + jsonStorage.write(value) + } +} \ No newline at end of file diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/DependencyContainer.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/DependencyContainer.kt index 394516b2d..c5b6e4faa 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/DependencyContainer.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/DependencyContainer.kt @@ -22,26 +22,15 @@ import com.projectcitybuild.libs.permissions.Permissions import com.projectcitybuild.libs.permissions.adapters.LuckPermsPermissions import com.projectcitybuild.libs.playercache.PlayerConfigCache import com.projectcitybuild.pcbridge.core.storage.adapters.JsonStorage -import com.projectcitybuild.modules.buildtools.nightvision.NightVisionModule -import com.projectcitybuild.modules.buildtools.nightvision.commands.NightVisionCommand import com.projectcitybuild.modules.joinmessages.PlayerJoinTimeCache import com.projectcitybuild.pcbridge.core.contracts.PlatformLogger import com.projectcitybuild.pcbridge.core.contracts.PlatformScheduler +import com.projectcitybuild.pcbridge.core.contracts.PlatformTimer +import com.projectcitybuild.pcbridge.core.modules.filecache.FileCache import com.projectcitybuild.pcbridge.http.HttpService import com.projectcitybuild.pcbridge.webserver.HttpServer import com.projectcitybuild.pcbridge.webserver.HttpServerConfig -import com.projectcitybuild.repositories.AggregateRepository -import com.projectcitybuild.repositories.ChatBadgeRepository -import com.projectcitybuild.repositories.CurrencyRepository -import com.projectcitybuild.repositories.IPBanRepository -import com.projectcitybuild.repositories.PlayerBanRepository -import com.projectcitybuild.repositories.PlayerConfigRepository -import com.projectcitybuild.repositories.PlayerGroupRepository -import com.projectcitybuild.repositories.PlayerUUIDRepository -import com.projectcitybuild.repositories.PlayerWarningRepository -import com.projectcitybuild.repositories.TelemetryRepository -import com.projectcitybuild.repositories.VerificationURLRepository -import com.projectcitybuild.repositories.WarpRepository +import com.projectcitybuild.repositories.* import com.projectcitybuild.support.spigot.SpigotLogger import com.projectcitybuild.support.spigot.SpigotNamespace import com.projectcitybuild.support.spigot.SpigotScheduler @@ -49,8 +38,10 @@ import com.projectcitybuild.support.spigot.eventbroadcast.LocalEventBroadcaster import com.projectcitybuild.support.spigot.eventbroadcast.SpigotLocalEventBroadcaster import com.projectcitybuild.support.spigot.listeners.SpigotListenerRegistry import com.projectcitybuild.support.spigot.SpigotServer +import com.projectcitybuild.support.spigot.SpigotTimer import org.bukkit.Server import org.bukkit.plugin.java.JavaPlugin +import java.io.File import java.time.Clock import java.time.ZoneId import java.util.Locale @@ -99,6 +90,10 @@ class DependencyContainer( val scheduler: PlatformScheduler get() = SpigotScheduler(plugin) + val timer: PlatformTimer by lazy { + SpigotTimer(plugin) + } + val errorReporter: ErrorReporter by lazy { ErrorReporter( outputs = listOf( @@ -267,6 +262,19 @@ class DependencyContainer( ) } + val scheduledAnnouncementsRepository by lazy { + ScheduledAnnouncementsRepository( + config, + FileCache( + JsonStorage( + file = plugin.dataFolder.resolve("cache/scheduled_announcements.json"), + logger = logger, + typeToken = object : TypeToken(){}, + ), + ), + ) + } + /** * Integrations */ diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/PCBridge.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/PCBridge.kt index 54a45aa55..aae5ea2fb 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/PCBridge.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/PCBridge.kt @@ -3,6 +3,7 @@ package com.projectcitybuild import com.github.shynixn.mccoroutine.bukkit.minecraftDispatcher import com.projectcitybuild.integrations.SpigotIntegration import com.projectcitybuild.modules.buildtools.general.GeneralBuildToolsModule +import com.projectcitybuild.modules.announcements.AnnouncementsModule import com.projectcitybuild.modules.buildtools.invisframes.InvisFramesModule import com.projectcitybuild.modules.buildtools.nightvision.NightVisionModule import com.projectcitybuild.modules.chat.ChatModule @@ -16,6 +17,7 @@ import com.projectcitybuild.modules.ranksync.RankSyncModule import com.projectcitybuild.modules.telemetry.TelemetryModule import com.projectcitybuild.modules.warps.WarpsModule import com.projectcitybuild.support.modules.ModuleRegisterDSL +import com.projectcitybuild.support.modules.PluginModule import dev.jorel.commandapi.CommandAPI import dev.jorel.commandapi.CommandAPIBukkit import dev.jorel.commandapi.CommandAPIBukkitConfig @@ -38,7 +40,9 @@ class PCBridge : JavaPlugin() { // Since CommandAPIBukkit doesn't support namespaces (yet?), we need to force // unregister Essentials commands that name clash with ours CommandAPIBukkit.unregister("ban", false, true) + CommandAPIBukkit.unregister("banip", false, true) CommandAPIBukkit.unregister("unban", false, true) + CommandAPIBukkit.unregister("unbanip", false, true) CommandAPIBukkit.unregister("mute", false, true) CommandAPIBukkit.unregister("unmute", false, true) @@ -90,6 +94,7 @@ class PCBridge : JavaPlugin() { private class ContainerLifecycle( private val container: DependencyContainer, ) { + private var modules: List = emptyList() private var integrations: List = emptyList() fun onEnable() = container.apply { @@ -99,7 +104,8 @@ private class ContainerLifecycle( permissions.connect() webServer.start() - listOf( + modules = listOf( + AnnouncementsModule(), BansModule(), ChatModule(), GeneralBuildToolsModule(), @@ -113,7 +119,8 @@ private class ContainerLifecycle( TelemetryModule(), WarningsModule(), WarpsModule(), - ).forEach { module -> + ) + modules.forEach { module -> val builder = ModuleRegisterDSL(listenerRegistry, container) module.register(builder::apply) } @@ -131,6 +138,9 @@ private class ContainerLifecycle( integrations.forEach { it.onDisable() } integrations = emptyList() + modules.forEach { it.unregister() } + modules = emptyList() + listenerRegistry.unregisterAll() dataSource.disconnect() webServer.stop() diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/announcements/AnnouncementsModule.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/announcements/AnnouncementsModule.kt new file mode 100644 index 000000000..75cc5c9e0 --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/announcements/AnnouncementsModule.kt @@ -0,0 +1,25 @@ +package com.projectcitybuild.modules.announcements + +import com.projectcitybuild.modules.announcements.actions.StartAnnouncementTimer +import com.projectcitybuild.support.modules.ModuleDeclaration +import com.projectcitybuild.support.modules.PluginModule + +class AnnouncementsModule: PluginModule { + private var action: StartAnnouncementTimer? = null + + override fun register(module: ModuleDeclaration) { + module { + action = StartAnnouncementTimer( + container.scheduledAnnouncementsRepository, + container.config, + container.timer, + container.spigotServer, + ) + action?.start() + } + } + + override fun unregister() { + action?.stop() + } +} \ No newline at end of file diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/announcements/actions/StartAnnouncementTimer.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/announcements/actions/StartAnnouncementTimer.kt new file mode 100644 index 000000000..de4f1ac84 --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/announcements/actions/StartAnnouncementTimer.kt @@ -0,0 +1,42 @@ +package com.projectcitybuild.modules.announcements.actions + +import com.projectcitybuild.ConfigData +import com.projectcitybuild.pcbridge.core.contracts.PlatformTimer +import com.projectcitybuild.pcbridge.core.modules.config.Config +import com.projectcitybuild.repositories.ScheduledAnnouncementsRepository +import com.projectcitybuild.support.spigot.SpigotServer +import net.md_5.bungee.api.chat.TextComponent +import java.util.concurrent.TimeUnit + +class StartAnnouncementTimer( + private val repository: ScheduledAnnouncementsRepository, + private val config: Config, + private val timer: PlatformTimer, + private val server: SpigotServer, +) { + private val timerId = "scheduled_announcements" + + fun start() { + val config = config.get() + val intervalInMins = config.announcements.intervalInMins + + timer.cancel(timerId) + timer.scheduleRepeating( + identifier = timerId, + delay = 0, + repeatingInterval = 5, + // repeatingInterval = intervalInMins.toLong(), + unit = TimeUnit.SECONDS, + work = { + val message = repository.getNextAnnouncement() + server.broadcastMessage( + TextComponent(message) + ) + } + ) + } + + fun stop() { + timer.cancel(timerId) + } +} \ No newline at end of file diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/repositories/ScheduledAnnouncementsRepository.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/repositories/ScheduledAnnouncementsRepository.kt new file mode 100644 index 000000000..77bec9712 --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/repositories/ScheduledAnnouncementsRepository.kt @@ -0,0 +1,32 @@ +package com.projectcitybuild.repositories + +import com.projectcitybuild.ConfigData +import com.projectcitybuild.pcbridge.core.modules.config.Config +import com.projectcitybuild.pcbridge.core.modules.filecache.FileCache + +data class ScheduledAnnouncements( + val lastBroadcastIndex: Int, +) + +class ScheduledAnnouncementsRepository( + private val config: Config, + private val fileCache: FileCache, +) { + private var lastBroadcastIndex: Int? = null + + fun getNextAnnouncement(): String { + val lastIndex = lastBroadcastIndex + ?: fileCache.get()?.lastBroadcastIndex + ?: -1 + + val announcements = config.get().announcements.messages + + val index = (lastIndex + 1) % announcements.size + lastBroadcastIndex = index + fileCache.put( + ScheduledAnnouncements(lastBroadcastIndex = index), + ) + + return announcements[index] + } +} \ No newline at end of file diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/modules/PluginModule.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/modules/PluginModule.kt index e6eb8eabc..e8450ae73 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/modules/PluginModule.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/modules/PluginModule.kt @@ -2,4 +2,5 @@ package com.projectcitybuild.support.modules interface PluginModule { fun register(module: ModuleDeclaration) + fun unregister() {} } \ No newline at end of file diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/spigot/SpigotTimer.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/spigot/SpigotTimer.kt index da848e8b7..91fcd00d7 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/spigot/SpigotTimer.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/spigot/SpigotTimer.kt @@ -17,7 +17,11 @@ class SpigotTimer( unit: TimeUnit, work: () -> Unit, ): Cancellable { - val task = plugin.server.scheduler.runTaskLater(plugin, work, unit.toSeconds(delay)) + val task = plugin.server.scheduler.runTaskLater( + plugin, + work, + unit.toSeconds(delay), + ) tasks[identifier] = task return Cancellable { @@ -32,7 +36,12 @@ class SpigotTimer( unit: TimeUnit, work: () -> Unit, ): Cancellable { - val task = plugin.server.scheduler.runTaskTimer(plugin, work, unit.toSeconds(delay), unit.toSeconds(repeatingInterval)) + val task = plugin.server.scheduler.runTaskTimer( + plugin, + work, + unit.toSeconds(delay), + unit.toSeconds(repeatingInterval) * 20, // 20 ticks per second + ) tasks[identifier] = task return Cancellable { diff --git a/pcbridge-spigot/test/com/projectcitybuild/modules/announcements/actions/StartAnnouncementTimerTest.kt b/pcbridge-spigot/test/com/projectcitybuild/modules/announcements/actions/StartAnnouncementTimerTest.kt new file mode 100644 index 000000000..e3653b235 --- /dev/null +++ b/pcbridge-spigot/test/com/projectcitybuild/modules/announcements/actions/StartAnnouncementTimerTest.kt @@ -0,0 +1,58 @@ +package com.projectcitybuild.modules.announcements.actions + +import com.projectcitybuild.ConfigData +import com.projectcitybuild.mock +import com.projectcitybuild.pcbridge.core.contracts.PlatformTimer +import com.projectcitybuild.pcbridge.core.modules.config.Config +import com.projectcitybuild.repositories.ScheduledAnnouncementsRepository +import com.projectcitybuild.support.spigot.SpigotServer +import net.md_5.bungee.api.chat.TextComponent +import org.junit.jupiter.api.Test +import org.mockito.Mockito.mock +import org.mockito.kotlin.* +import java.util.concurrent.TimeUnit + +class StartAnnouncementTimerTest { + @Test + fun `broadcasts messages on a timer`() { + val repository = mock(ScheduledAnnouncementsRepository::class.java) + whenever(repository.getNextAnnouncement()).thenReturn( + "message1", + "message2", + ) + + val config = mock>() + whenever(config.get()).thenReturn( + ConfigData.default.copy( + announcements = ConfigData.default.announcements.copy( + intervalInMins = 5, + ) + ) + ) + + val timer = mock(PlatformTimer::class.java) + val server = mock(SpigotServer::class.java) + + val action = StartAnnouncementTimer( + repository, + config, + timer, + server, + ) + action.start() + + argumentCaptor<() -> Unit>().apply { + verify(timer).scheduleRepeating(any(), eq(0), eq(5), eq(TimeUnit.SECONDS), capture()) + firstValue() + firstValue() + } + + val order = inOrder(server) + order.verify(server).broadcastMessage( + TextComponent("message1") + ) + order.verify(server).broadcastMessage( + TextComponent("message2") + ) + } +} \ No newline at end of file diff --git a/pcbridge-spigot/test/com/projectcitybuild/modules/buildtools/nightvision/NightVisionModuleTest.kt b/pcbridge-spigot/test/com/projectcitybuild/modules/buildtools/nightvision/NightVisionModuleTest.kt deleted file mode 100644 index c594ac172..000000000 --- a/pcbridge-spigot/test/com/projectcitybuild/modules/buildtools/nightvision/NightVisionModuleTest.kt +++ /dev/null @@ -1,5 +0,0 @@ -package com.projectcitybuild.modules.buildtools.nightvision - -class NightVisionModuleTest { - -} \ No newline at end of file diff --git a/pcbridge-spigot/test/com/projectcitybuild/modules/warps/actions/CreateWarpTest.kt b/pcbridge-spigot/test/com/projectcitybuild/modules/warps/actions/CreateWarpTest.kt index 616be46f0..cb7b40787 100644 --- a/pcbridge-spigot/test/com/projectcitybuild/modules/warps/actions/CreateWarpTest.kt +++ b/pcbridge-spigot/test/com/projectcitybuild/modules/warps/actions/CreateWarpTest.kt @@ -19,7 +19,6 @@ import org.mockito.kotlin.whenever import java.time.LocalDateTime class CreateWarpTest { - private lateinit var useCase: CreateWarp private lateinit var warpRepository: WarpRepository diff --git a/pcbridge-spigot/test/com/projectcitybuild/repositories/ScheduledAnnouncementsRepositoryTest.kt b/pcbridge-spigot/test/com/projectcitybuild/repositories/ScheduledAnnouncementsRepositoryTest.kt new file mode 100644 index 000000000..516439d5f --- /dev/null +++ b/pcbridge-spigot/test/com/projectcitybuild/repositories/ScheduledAnnouncementsRepositoryTest.kt @@ -0,0 +1,83 @@ +package com.projectcitybuild.repositories + +import com.projectcitybuild.ConfigData +import com.projectcitybuild.mock +import com.projectcitybuild.pcbridge.core.modules.config.Config +import com.projectcitybuild.pcbridge.core.modules.filecache.FileCache +import kotlinx.coroutines.test.runTest +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import org.mockito.kotlin.inOrder +import org.mockito.kotlin.whenever + +class ScheduledAnnouncementsRepositoryTest { + private lateinit var config: Config + private lateinit var fileCache: FileCache + private lateinit var repository: ScheduledAnnouncementsRepository + + @BeforeEach + fun setUp() { + config = mock>() + fileCache = mock>() + + repository = ScheduledAnnouncementsRepository( + config, + fileCache, + ) + + whenever(config.get()).thenReturn(ConfigData.default.copy( + announcements = ConfigData.Announcements( + intervalInMins = 5, + messages = listOf( + "message1", + "message2", + "message3", + ) + ) + )) + } + + @Test + fun `returns messages from config in a loop`() = runTest { + whenever(fileCache.get()).thenReturn(null) + + assertEquals("message1", repository.getNextAnnouncement()) + assertEquals("message2", repository.getNextAnnouncement()) + assertEquals("message3", repository.getNextAnnouncement()) + assertEquals("message1", repository.getNextAnnouncement()) + } + + @Test + fun `caches last broadcast message index`() = runTest { + whenever(fileCache.get()).thenReturn(null) + + repository.getNextAnnouncement() + repository.getNextAnnouncement() + repository.getNextAnnouncement() + repository.getNextAnnouncement() + + val order = inOrder(fileCache) + order.verify(fileCache).put( + ScheduledAnnouncements(lastBroadcastIndex = 0) + ) + order.verify(fileCache).put( + ScheduledAnnouncements(lastBroadcastIndex = 1) + ) + order.verify(fileCache).put( + ScheduledAnnouncements(lastBroadcastIndex = 2) + ) + order.verify(fileCache).put( + ScheduledAnnouncements(lastBroadcastIndex = 0) + ) + } + + @Test + fun `starts from last broadcast index if possible`() = runTest { + whenever(fileCache.get()).thenReturn( + ScheduledAnnouncements(lastBroadcastIndex = 1) + ) + assertEquals("message3", repository.getNextAnnouncement()) + assertEquals("message1", repository.getNextAnnouncement()) + } +} \ No newline at end of file From 414bfddc3254b5fd5fec63f243093cf71b96fe78 Mon Sep 17 00:00:00 2001 From: Andy Saw <7236312+andyksaw@users.noreply.github.com> Date: Sun, 17 Sep 2023 23:38:32 +0900 Subject: [PATCH 09/15] Clean up files (#233) --- .../projectcitybuild/pcbridge/core/modules/config/Config.kt | 2 +- .../pcbridge/core/modules/filecache/FileCache.kt | 2 +- .../pcbridge/core/storage/{adapters => }/JsonStorage.kt | 2 +- .../projectcitybuild/pcbridge/core/storage/StoragePath.kt | 6 ------ .../pcbridge/core/modules/config/ConfigTest.kt | 3 +-- .../pcbridge/core/storage/{adapters => }/JsonStorageTest.kt | 3 ++- .../main/kotlin/com/projectcitybuild/DependencyContainer.kt | 4 ++-- .../com/projectcitybuild/{ => entities}/ConfigData.kt | 2 +- .../com/projectcitybuild/{ => entities}/Permissions.kt | 2 +- .../{ => entities}/events/ConnectionPermittedEvent.kt | 2 +- .../{ => entities}/events/FirstTimeJoinEvent.kt | 2 +- .../{ => entities}/events/PlayerPreWarpEvent.kt | 2 +- .../{ => entities}/events/WarpCreateEvent.kt | 2 +- .../{ => entities}/events/WarpDeleteEvent.kt | 2 +- .../integrations/dynmap/DynmapMarkerIntegration.kt | 6 +++--- .../integrations/essentials/EssentialsIntegration.kt | 2 +- .../libs/errorreporting/outputs/SentryErrorOutput.kt | 2 +- .../modules/announcements/actions/StartAnnouncementTimer.kt | 2 +- .../modules/buildtools/general/GeneralBuildToolsModule.kt | 2 +- .../modules/buildtools/invisframes/InvisFramesModule.kt | 2 +- .../modules/buildtools/nightvision/NightVisionModule.kt | 2 +- .../com/projectcitybuild/modules/chat/ChatBadgeFormatter.kt | 2 +- .../com/projectcitybuild/modules/chat/ChatGroupFormatter.kt | 2 +- .../kotlin/com/projectcitybuild/modules/chat/ChatModule.kt | 2 +- .../modules/chat/listeners/SyncBadgesOnJoinListener.kt | 2 +- .../modules/joinmessages/listeners/AnnounceJoinListener.kt | 2 +- .../modules/joinmessages/listeners/AnnounceQuitListener.kt | 2 +- .../modules/joinmessages/listeners/FirstTimeJoinListener.kt | 4 ++-- .../joinmessages/listeners/ServerOverviewJoinListener.kt | 2 +- .../projectcitybuild/modules/moderation/bans/BansModule.kt | 2 +- .../moderation/bans/listeners/CheckBanOnConnectListener.kt | 2 +- .../modules/moderation/mutes/MutesModule.kt | 2 +- .../modules/moderation/staffchat/StaffChatModule.kt | 2 +- .../modules/moderation/staffchat/commands/ACommand.kt | 2 +- .../modules/moderation/warnings/WarningsModule.kt | 2 +- .../modules/pluginutils/PluginUtilsModule.kt | 2 +- .../modules/pluginutils/actions/ReloadPlugin.kt | 2 +- .../pluginutils/listeners/CachePlayerOnJoinListener.kt | 2 +- .../com/projectcitybuild/modules/ranksync/RankSyncModule.kt | 2 +- .../ranksync/actions/SyncPlayerGroupsWithAggregate.kt | 2 +- .../ranksync/listener/SyncPlayerGroupsOnJoinListener.kt | 2 +- .../com/projectcitybuild/modules/warps/WarpsModule.kt | 2 +- .../projectcitybuild/modules/warps/actions/CreateWarp.kt | 2 +- .../projectcitybuild/modules/warps/actions/DeleteWarp.kt | 2 +- .../projectcitybuild/modules/warps/actions/GetWarpList.kt | 2 +- .../modules/warps/actions/TeleportToWarp.kt | 2 +- .../projectcitybuild/repositories/PlayerGroupRepository.kt | 2 +- .../repositories/ScheduledAnnouncementsRepository.kt | 2 +- .../announcements/actions/StartAnnouncementTimerTest.kt | 2 +- .../modules/chat/listeners/SyncBadgesOnJoinListenerTest.kt | 2 +- .../joinmessages/listeners/AnnounceJoinListenerTest.kt | 2 +- .../joinmessages/listeners/AnnounceQuitListenerTest.kt | 2 +- .../joinmessages/listeners/FirstTimeJoinListenerTest.kt | 4 ++-- .../listeners/ServerOverviewJoinListenerTest.kt | 2 +- .../modules/moderation/staffchat/commands/ACommandTest.kt | 2 +- .../pluginutils/listeners/CheckBanOnConnectListenerTest.kt | 2 +- .../ranksync/actions/SyncPlayerGroupsWithAggregateTest.kt | 2 +- .../modules/warps/actions/GetWarpListTest.kt | 2 +- .../repositories/ScheduledAnnouncementsRepositoryTest.kt | 2 +- 59 files changed, 64 insertions(+), 70 deletions(-) rename pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/storage/{adapters => }/JsonStorage.kt (96%) delete mode 100644 pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/storage/StoragePath.kt rename pcbridge-core/src/test/kotlin/com/projectcitybuild/pcbridge/core/storage/{adapters => }/JsonStorageTest.kt (96%) rename pcbridge-spigot/src/main/kotlin/com/projectcitybuild/{ => entities}/ConfigData.kt (99%) rename pcbridge-spigot/src/main/kotlin/com/projectcitybuild/{ => entities}/Permissions.kt (97%) rename pcbridge-spigot/src/main/kotlin/com/projectcitybuild/{ => entities}/events/ConnectionPermittedEvent.kt (93%) rename pcbridge-spigot/src/main/kotlin/com/projectcitybuild/{ => entities}/events/FirstTimeJoinEvent.kt (91%) rename pcbridge-spigot/src/main/kotlin/com/projectcitybuild/{ => entities}/events/PlayerPreWarpEvent.kt (93%) rename pcbridge-spigot/src/main/kotlin/com/projectcitybuild/{ => entities}/events/WarpCreateEvent.kt (91%) rename pcbridge-spigot/src/main/kotlin/com/projectcitybuild/{ => entities}/events/WarpDeleteEvent.kt (91%) diff --git a/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/modules/config/Config.kt b/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/modules/config/Config.kt index 2592b06a5..8d5943d88 100644 --- a/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/modules/config/Config.kt +++ b/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/modules/config/Config.kt @@ -1,6 +1,6 @@ package com.projectcitybuild.pcbridge.core.modules.config -import com.projectcitybuild.pcbridge.core.storage.adapters.JsonStorage +import com.projectcitybuild.pcbridge.core.storage.JsonStorage class Config( private val default: T, diff --git a/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/modules/filecache/FileCache.kt b/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/modules/filecache/FileCache.kt index 993de6ac4..9540daebf 100644 --- a/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/modules/filecache/FileCache.kt +++ b/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/modules/filecache/FileCache.kt @@ -1,6 +1,6 @@ package com.projectcitybuild.pcbridge.core.modules.filecache -import com.projectcitybuild.pcbridge.core.storage.adapters.JsonStorage +import com.projectcitybuild.pcbridge.core.storage.JsonStorage class FileCache( private val jsonStorage: JsonStorage, diff --git a/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/storage/adapters/JsonStorage.kt b/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/storage/JsonStorage.kt similarity index 96% rename from pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/storage/adapters/JsonStorage.kt rename to pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/storage/JsonStorage.kt index 0c035a8bb..0c169370d 100644 --- a/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/storage/adapters/JsonStorage.kt +++ b/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/storage/JsonStorage.kt @@ -1,4 +1,4 @@ -package com.projectcitybuild.pcbridge.core.storage.adapters +package com.projectcitybuild.pcbridge.core.storage import com.google.gson.FieldNamingPolicy import com.google.gson.GsonBuilder diff --git a/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/storage/StoragePath.kt b/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/storage/StoragePath.kt deleted file mode 100644 index 8b9a529c8..000000000 --- a/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/storage/StoragePath.kt +++ /dev/null @@ -1,6 +0,0 @@ -package com.projectcitybuild.pcbridge.core.storage - -data class StoragePath( - val key: String, - val defaultValue: T, -) diff --git a/pcbridge-core/src/test/kotlin/com/projectcitybuild/pcbridge/core/modules/config/ConfigTest.kt b/pcbridge-core/src/test/kotlin/com/projectcitybuild/pcbridge/core/modules/config/ConfigTest.kt index 659e2019f..d4fe0a6fd 100644 --- a/pcbridge-core/src/test/kotlin/com/projectcitybuild/pcbridge/core/modules/config/ConfigTest.kt +++ b/pcbridge-core/src/test/kotlin/com/projectcitybuild/pcbridge/core/modules/config/ConfigTest.kt @@ -1,13 +1,12 @@ package com.projectcitybuild.pcbridge.core.modules.config -import com.projectcitybuild.pcbridge.core.storage.adapters.JsonStorage +import com.projectcitybuild.pcbridge.core.storage.JsonStorage import kotlinx.serialization.Serializable import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test import org.mockito.Mock import org.mockito.MockitoAnnotations -import org.mockito.kotlin.verifyNoMoreInteractions import org.mockito.kotlin.whenever class ConfigTest { diff --git a/pcbridge-core/src/test/kotlin/com/projectcitybuild/pcbridge/core/storage/adapters/JsonStorageTest.kt b/pcbridge-core/src/test/kotlin/com/projectcitybuild/pcbridge/core/storage/JsonStorageTest.kt similarity index 96% rename from pcbridge-core/src/test/kotlin/com/projectcitybuild/pcbridge/core/storage/adapters/JsonStorageTest.kt rename to pcbridge-core/src/test/kotlin/com/projectcitybuild/pcbridge/core/storage/JsonStorageTest.kt index c1085d981..ff60aaf41 100644 --- a/pcbridge-core/src/test/kotlin/com/projectcitybuild/pcbridge/core/storage/adapters/JsonStorageTest.kt +++ b/pcbridge-core/src/test/kotlin/com/projectcitybuild/pcbridge/core/storage/JsonStorageTest.kt @@ -1,7 +1,8 @@ -package com.projectcitybuild.pcbridge.core.storage.adapters +package com.projectcitybuild.pcbridge.core.storage import com.google.gson.reflect.TypeToken import com.projectcitybuild.pcbridge.core.contracts.PlatformLogger +import com.projectcitybuild.pcbridge.core.storage.JsonStorage import kotlinx.serialization.Serializable import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.BeforeEach diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/DependencyContainer.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/DependencyContainer.kt index c5b6e4faa..7f1779cb8 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/DependencyContainer.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/DependencyContainer.kt @@ -1,6 +1,7 @@ package com.projectcitybuild import com.google.gson.reflect.TypeToken +import com.projectcitybuild.entities.ConfigData import com.projectcitybuild.modules.chat.ChatBadgeFormatter import com.projectcitybuild.modules.chat.ChatGroupFormatter import com.projectcitybuild.modules.ranksync.actions.UpdatePlayerGroups @@ -21,7 +22,7 @@ import com.projectcitybuild.libs.nameguesser.NameGuesser import com.projectcitybuild.libs.permissions.Permissions import com.projectcitybuild.libs.permissions.adapters.LuckPermsPermissions import com.projectcitybuild.libs.playercache.PlayerConfigCache -import com.projectcitybuild.pcbridge.core.storage.adapters.JsonStorage +import com.projectcitybuild.pcbridge.core.storage.JsonStorage import com.projectcitybuild.modules.joinmessages.PlayerJoinTimeCache import com.projectcitybuild.pcbridge.core.contracts.PlatformLogger import com.projectcitybuild.pcbridge.core.contracts.PlatformScheduler @@ -41,7 +42,6 @@ import com.projectcitybuild.support.spigot.SpigotServer import com.projectcitybuild.support.spigot.SpigotTimer import org.bukkit.Server import org.bukkit.plugin.java.JavaPlugin -import java.io.File import java.time.Clock import java.time.ZoneId import java.util.Locale diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/ConfigData.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/ConfigData.kt similarity index 99% rename from pcbridge-spigot/src/main/kotlin/com/projectcitybuild/ConfigData.kt rename to pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/ConfigData.kt index 3cd5fca23..74a3957cc 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/ConfigData.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/ConfigData.kt @@ -1,4 +1,4 @@ -package com.projectcitybuild +package com.projectcitybuild.entities import kotlinx.serialization.Serializable diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/Permissions.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/Permissions.kt similarity index 97% rename from pcbridge-spigot/src/main/kotlin/com/projectcitybuild/Permissions.kt rename to pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/Permissions.kt index e0684f5f7..c6e7b94f3 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/Permissions.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/Permissions.kt @@ -1,4 +1,4 @@ -package com.projectcitybuild +package com.projectcitybuild.entities class Permissions private constructor() { companion object { diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/events/ConnectionPermittedEvent.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/events/ConnectionPermittedEvent.kt similarity index 93% rename from pcbridge-spigot/src/main/kotlin/com/projectcitybuild/events/ConnectionPermittedEvent.kt rename to pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/events/ConnectionPermittedEvent.kt index 589cf3bfc..72f6a3548 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/events/ConnectionPermittedEvent.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/events/ConnectionPermittedEvent.kt @@ -1,4 +1,4 @@ -package com.projectcitybuild.events +package com.projectcitybuild.entities.events import com.projectcitybuild.pcbridge.http.responses.Aggregate import com.projectcitybuild.support.spigot.eventbroadcast.BroadcastableEvent diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/events/FirstTimeJoinEvent.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/events/FirstTimeJoinEvent.kt similarity index 91% rename from pcbridge-spigot/src/main/kotlin/com/projectcitybuild/events/FirstTimeJoinEvent.kt rename to pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/events/FirstTimeJoinEvent.kt index 1cc8822ca..165782230 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/events/FirstTimeJoinEvent.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/events/FirstTimeJoinEvent.kt @@ -1,4 +1,4 @@ -package com.projectcitybuild.events +package com.projectcitybuild.entities.events import com.projectcitybuild.support.spigot.eventbroadcast.BroadcastableEvent import org.bukkit.entity.Player diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/events/PlayerPreWarpEvent.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/events/PlayerPreWarpEvent.kt similarity index 93% rename from pcbridge-spigot/src/main/kotlin/com/projectcitybuild/events/PlayerPreWarpEvent.kt rename to pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/events/PlayerPreWarpEvent.kt index ae5a7326d..70a9ea6c7 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/events/PlayerPreWarpEvent.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/events/PlayerPreWarpEvent.kt @@ -1,4 +1,4 @@ -package com.projectcitybuild.events +package com.projectcitybuild.entities.events import com.projectcitybuild.support.spigot.eventbroadcast.BroadcastableEvent import org.bukkit.entity.Player diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/events/WarpCreateEvent.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/events/WarpCreateEvent.kt similarity index 91% rename from pcbridge-spigot/src/main/kotlin/com/projectcitybuild/events/WarpCreateEvent.kt rename to pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/events/WarpCreateEvent.kt index c6a436476..3e8136b0c 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/events/WarpCreateEvent.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/events/WarpCreateEvent.kt @@ -1,4 +1,4 @@ -package com.projectcitybuild.events +package com.projectcitybuild.entities.events import com.projectcitybuild.support.spigot.eventbroadcast.BroadcastableEvent import org.bukkit.event.HandlerList diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/events/WarpDeleteEvent.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/events/WarpDeleteEvent.kt similarity index 91% rename from pcbridge-spigot/src/main/kotlin/com/projectcitybuild/events/WarpDeleteEvent.kt rename to pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/events/WarpDeleteEvent.kt index 6d52e4baf..0ac8bb271 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/events/WarpDeleteEvent.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/events/WarpDeleteEvent.kt @@ -1,4 +1,4 @@ -package com.projectcitybuild.events +package com.projectcitybuild.entities.events import com.projectcitybuild.support.spigot.eventbroadcast.BroadcastableEvent import org.bukkit.event.HandlerList diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/integrations/dynmap/DynmapMarkerIntegration.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/integrations/dynmap/DynmapMarkerIntegration.kt index b388d63b5..fedd6a60a 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/integrations/dynmap/DynmapMarkerIntegration.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/integrations/dynmap/DynmapMarkerIntegration.kt @@ -1,8 +1,8 @@ package com.projectcitybuild.integrations.dynmap -import com.projectcitybuild.ConfigData -import com.projectcitybuild.events.WarpCreateEvent -import com.projectcitybuild.events.WarpDeleteEvent +import com.projectcitybuild.entities.ConfigData +import com.projectcitybuild.entities.events.WarpCreateEvent +import com.projectcitybuild.entities.events.WarpDeleteEvent import com.projectcitybuild.integrations.SpigotIntegration import com.projectcitybuild.pcbridge.core.modules.config.Config import com.projectcitybuild.pcbridge.core.contracts.PlatformLogger diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/integrations/essentials/EssentialsIntegration.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/integrations/essentials/EssentialsIntegration.kt index 4fd8a7bdd..76e5ae8bc 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/integrations/essentials/EssentialsIntegration.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/integrations/essentials/EssentialsIntegration.kt @@ -1,7 +1,7 @@ package com.projectcitybuild.integrations.essentials import com.earth2me.essentials.Essentials -import com.projectcitybuild.events.PlayerPreWarpEvent +import com.projectcitybuild.entities.events.PlayerPreWarpEvent import com.projectcitybuild.integrations.SpigotIntegration import com.projectcitybuild.pcbridge.core.contracts.PlatformLogger import org.bukkit.event.EventHandler diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/errorreporting/outputs/SentryErrorOutput.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/errorreporting/outputs/SentryErrorOutput.kt index 7cddcd4f2..eb6926303 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/errorreporting/outputs/SentryErrorOutput.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/errorreporting/outputs/SentryErrorOutput.kt @@ -1,7 +1,7 @@ package com.projectcitybuild.libs.errorreporting.outputs import com.projectcitybuild.pcbridge.core.modules.config.Config -import com.projectcitybuild.ConfigData +import com.projectcitybuild.entities.ConfigData import com.projectcitybuild.libs.errorreporting.ErrorOutput import com.projectcitybuild.pcbridge.core.contracts.PlatformLogger import io.sentry.Sentry diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/announcements/actions/StartAnnouncementTimer.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/announcements/actions/StartAnnouncementTimer.kt index de4f1ac84..85714b4f5 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/announcements/actions/StartAnnouncementTimer.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/announcements/actions/StartAnnouncementTimer.kt @@ -1,6 +1,6 @@ package com.projectcitybuild.modules.announcements.actions -import com.projectcitybuild.ConfigData +import com.projectcitybuild.entities.ConfigData import com.projectcitybuild.pcbridge.core.contracts.PlatformTimer import com.projectcitybuild.pcbridge.core.modules.config.Config import com.projectcitybuild.repositories.ScheduledAnnouncementsRepository diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/general/GeneralBuildToolsModule.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/general/GeneralBuildToolsModule.kt index 53d413f28..28f207faf 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/general/GeneralBuildToolsModule.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/general/GeneralBuildToolsModule.kt @@ -1,6 +1,6 @@ package com.projectcitybuild.modules.buildtools.general -import com.projectcitybuild.Permissions +import com.projectcitybuild.entities.Permissions import com.projectcitybuild.modules.buildtools.general.commands.BinCommand import com.projectcitybuild.modules.buildtools.general.listeners.BinCloseListener import com.projectcitybuild.support.modules.ModuleDeclaration diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/invisframes/InvisFramesModule.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/invisframes/InvisFramesModule.kt index 7aa0ba616..d4b5f601b 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/invisframes/InvisFramesModule.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/invisframes/InvisFramesModule.kt @@ -1,6 +1,6 @@ package com.projectcitybuild.modules.buildtools.invisframes -import com.projectcitybuild.Permissions +import com.projectcitybuild.entities.Permissions import com.projectcitybuild.modules.buildtools.invisframes.commands.InvisFrameCommand import com.projectcitybuild.modules.buildtools.invisframes.listeners.FramePlaceListener import com.projectcitybuild.modules.buildtools.invisframes.listeners.ItemInsertListener diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/nightvision/NightVisionModule.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/nightvision/NightVisionModule.kt index a0a77d038..61f20a2e7 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/nightvision/NightVisionModule.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/nightvision/NightVisionModule.kt @@ -1,6 +1,6 @@ package com.projectcitybuild.modules.buildtools.nightvision -import com.projectcitybuild.Permissions +import com.projectcitybuild.entities.Permissions import com.projectcitybuild.modules.buildtools.nightvision.commands.NightVisionCommand import com.projectcitybuild.support.commandapi.ToggleOption import com.projectcitybuild.support.modules.ModuleDeclaration diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/chat/ChatBadgeFormatter.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/chat/ChatBadgeFormatter.kt index 5516c8d8f..2963e5584 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/chat/ChatBadgeFormatter.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/chat/ChatBadgeFormatter.kt @@ -1,6 +1,6 @@ package com.projectcitybuild.modules.chat -import com.projectcitybuild.ConfigData +import com.projectcitybuild.entities.ConfigData import com.projectcitybuild.pcbridge.core.modules.config.Config import com.projectcitybuild.repositories.ChatBadgeRepository import com.projectcitybuild.repositories.PlayerConfigRepository diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/chat/ChatGroupFormatter.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/chat/ChatGroupFormatter.kt index d88fd0064..aac5b369b 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/chat/ChatGroupFormatter.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/chat/ChatGroupFormatter.kt @@ -1,6 +1,6 @@ package com.projectcitybuild.modules.chat -import com.projectcitybuild.ConfigData +import com.projectcitybuild.entities.ConfigData import com.projectcitybuild.pcbridge.core.modules.config.Config import com.projectcitybuild.libs.permissions.Permissions import net.md_5.bungee.api.chat.BaseComponent diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/chat/ChatModule.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/chat/ChatModule.kt index 8d6fbed59..2ae30ca73 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/chat/ChatModule.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/chat/ChatModule.kt @@ -1,6 +1,6 @@ package com.projectcitybuild.modules.chat -import com.projectcitybuild.Permissions +import com.projectcitybuild.entities.Permissions import com.projectcitybuild.modules.chat.commands.BadgeCommand import com.projectcitybuild.modules.chat.listeners.AsyncPlayerChatListener import com.projectcitybuild.modules.chat.listeners.EmojiChatListener diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/chat/listeners/SyncBadgesOnJoinListener.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/chat/listeners/SyncBadgesOnJoinListener.kt index e9428d5a6..70542fa8c 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/chat/listeners/SyncBadgesOnJoinListener.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/chat/listeners/SyncBadgesOnJoinListener.kt @@ -1,6 +1,6 @@ package com.projectcitybuild.modules.chat.listeners -import com.projectcitybuild.events.ConnectionPermittedEvent +import com.projectcitybuild.entities.events.ConnectionPermittedEvent import com.projectcitybuild.repositories.ChatBadgeRepository import com.projectcitybuild.support.spigot.listeners.SpigotListener import org.bukkit.event.EventHandler diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/listeners/AnnounceJoinListener.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/listeners/AnnounceJoinListener.kt index 56c071b73..590a2ad67 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/listeners/AnnounceJoinListener.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/listeners/AnnounceJoinListener.kt @@ -1,6 +1,6 @@ package com.projectcitybuild.modules.joinmessages.listeners -import com.projectcitybuild.ConfigData +import com.projectcitybuild.entities.ConfigData import com.projectcitybuild.modules.joinmessages.PlayerJoinTimeCache import com.projectcitybuild.pcbridge.core.modules.config.Config import com.projectcitybuild.support.spigot.SpigotServer diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/listeners/AnnounceQuitListener.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/listeners/AnnounceQuitListener.kt index 79b94f3a4..9f5441fd1 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/listeners/AnnounceQuitListener.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/listeners/AnnounceQuitListener.kt @@ -1,6 +1,6 @@ package com.projectcitybuild.modules.joinmessages.listeners -import com.projectcitybuild.ConfigData +import com.projectcitybuild.entities.ConfigData import com.projectcitybuild.modules.joinmessages.PlayerJoinTimeCache import com.projectcitybuild.pcbridge.core.modules.config.Config import com.projectcitybuild.pcbridge.core.modules.datetime.time.Time diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/listeners/FirstTimeJoinListener.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/listeners/FirstTimeJoinListener.kt index af5a1e4b4..838fb0342 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/listeners/FirstTimeJoinListener.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/listeners/FirstTimeJoinListener.kt @@ -1,7 +1,7 @@ package com.projectcitybuild.modules.joinmessages.listeners -import com.projectcitybuild.ConfigData -import com.projectcitybuild.events.FirstTimeJoinEvent +import com.projectcitybuild.entities.ConfigData +import com.projectcitybuild.entities.events.FirstTimeJoinEvent import com.projectcitybuild.pcbridge.core.contracts.PlatformLogger import com.projectcitybuild.pcbridge.core.modules.config.Config import com.projectcitybuild.support.spigot.SpigotServer diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/listeners/ServerOverviewJoinListener.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/listeners/ServerOverviewJoinListener.kt index 6628af538..77463aba8 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/listeners/ServerOverviewJoinListener.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/listeners/ServerOverviewJoinListener.kt @@ -1,6 +1,6 @@ package com.projectcitybuild.modules.joinmessages.listeners -import com.projectcitybuild.ConfigData +import com.projectcitybuild.entities.ConfigData import com.projectcitybuild.pcbridge.core.modules.config.Config import com.projectcitybuild.support.spigot.listeners.SpigotListener import net.md_5.bungee.api.chat.TextComponent diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/bans/BansModule.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/bans/BansModule.kt index 3bb1148ea..0ff94077d 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/bans/BansModule.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/bans/BansModule.kt @@ -1,6 +1,6 @@ package com.projectcitybuild.modules.moderation.bans -import com.projectcitybuild.Permissions +import com.projectcitybuild.entities.Permissions import com.projectcitybuild.modules.moderation.bans.actions.AuthoriseConnection import com.projectcitybuild.modules.moderation.bans.actions.BanIP import com.projectcitybuild.modules.moderation.bans.actions.BanUUID diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/bans/listeners/CheckBanOnConnectListener.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/bans/listeners/CheckBanOnConnectListener.kt index 4f20148ad..ff7cc71de 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/bans/listeners/CheckBanOnConnectListener.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/bans/listeners/CheckBanOnConnectListener.kt @@ -1,6 +1,6 @@ package com.projectcitybuild.modules.moderation.bans.listeners -import com.projectcitybuild.events.ConnectionPermittedEvent +import com.projectcitybuild.entities.events.ConnectionPermittedEvent import com.projectcitybuild.modules.moderation.bans.actions.AuthoriseConnection import com.projectcitybuild.pcbridge.core.modules.datetime.formatter.DateTimeFormatter import com.projectcitybuild.libs.errorreporting.ErrorReporter diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/mutes/MutesModule.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/mutes/MutesModule.kt index 6664ae1f3..eb80b8ac8 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/mutes/MutesModule.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/mutes/MutesModule.kt @@ -1,6 +1,6 @@ package com.projectcitybuild.modules.moderation.mutes -import com.projectcitybuild.Permissions +import com.projectcitybuild.entities.Permissions import com.projectcitybuild.modules.moderation.mutes.commands.MuteCommand import com.projectcitybuild.modules.moderation.mutes.commands.UnmuteCommand import com.projectcitybuild.modules.moderation.mutes.actions.MutePlayer diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/staffchat/StaffChatModule.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/staffchat/StaffChatModule.kt index 0dc36f222..fa2bae29a 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/staffchat/StaffChatModule.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/staffchat/StaffChatModule.kt @@ -1,6 +1,6 @@ package com.projectcitybuild.modules.moderation.staffchat -import com.projectcitybuild.Permissions +import com.projectcitybuild.entities.Permissions import com.projectcitybuild.modules.moderation.staffchat.commands.ACommand import com.projectcitybuild.support.modules.ModuleDeclaration import com.projectcitybuild.support.modules.PluginModule diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/staffchat/commands/ACommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/staffchat/commands/ACommand.kt index aac8dfb58..4897140a9 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/staffchat/commands/ACommand.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/staffchat/commands/ACommand.kt @@ -1,6 +1,6 @@ package com.projectcitybuild.modules.moderation.staffchat.commands -import com.projectcitybuild.Permissions +import com.projectcitybuild.entities.Permissions import com.projectcitybuild.support.textcomponent.add import net.md_5.bungee.api.ChatColor import net.md_5.bungee.api.chat.TextComponent diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/warnings/WarningsModule.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/warnings/WarningsModule.kt index 3392a0741..74658d8c4 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/warnings/WarningsModule.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/warnings/WarningsModule.kt @@ -1,6 +1,6 @@ package com.projectcitybuild.modules.moderation.warnings -import com.projectcitybuild.Permissions +import com.projectcitybuild.entities.Permissions import com.projectcitybuild.modules.moderation.warnings.actions.AcknowledgeWarning import com.projectcitybuild.modules.moderation.warnings.actions.GetUnacknowledgedWarnings import com.projectcitybuild.modules.moderation.warnings.commands.WarningAcknowledgeCommand diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/pluginutils/PluginUtilsModule.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/pluginutils/PluginUtilsModule.kt index 426f235fd..4e5af97a1 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/pluginutils/PluginUtilsModule.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/pluginutils/PluginUtilsModule.kt @@ -1,6 +1,6 @@ package com.projectcitybuild.modules.pluginutils -import com.projectcitybuild.Permissions +import com.projectcitybuild.entities.Permissions import com.projectcitybuild.modules.pluginutils.commands.VersionCommand import com.projectcitybuild.modules.pluginutils.actions.GetVersion import com.projectcitybuild.modules.pluginutils.actions.ReloadPlugin diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/pluginutils/actions/ReloadPlugin.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/pluginutils/actions/ReloadPlugin.kt index 75410d893..86e283ab6 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/pluginutils/actions/ReloadPlugin.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/pluginutils/actions/ReloadPlugin.kt @@ -1,6 +1,6 @@ package com.projectcitybuild.modules.pluginutils.actions -import com.projectcitybuild.ConfigData +import com.projectcitybuild.entities.ConfigData import com.projectcitybuild.modules.chat.ChatGroupFormatter import com.projectcitybuild.pcbridge.core.modules.config.Config import com.projectcitybuild.libs.playercache.PlayerConfigCache diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/pluginutils/listeners/CachePlayerOnJoinListener.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/pluginutils/listeners/CachePlayerOnJoinListener.kt index ed6d66fd4..3c830bf9d 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/pluginutils/listeners/CachePlayerOnJoinListener.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/pluginutils/listeners/CachePlayerOnJoinListener.kt @@ -1,6 +1,6 @@ package com.projectcitybuild.modules.pluginutils.listeners -import com.projectcitybuild.events.FirstTimeJoinEvent +import com.projectcitybuild.entities.events.FirstTimeJoinEvent import com.projectcitybuild.pcbridge.core.contracts.PlatformLogger import com.projectcitybuild.pcbridge.core.modules.datetime.time.Time import com.projectcitybuild.repositories.PlayerConfigRepository diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/ranksync/RankSyncModule.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/ranksync/RankSyncModule.kt index 85bde1b07..fb557bc07 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/ranksync/RankSyncModule.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/ranksync/RankSyncModule.kt @@ -1,6 +1,6 @@ package com.projectcitybuild.modules.ranksync -import com.projectcitybuild.Permissions +import com.projectcitybuild.entities.Permissions import com.projectcitybuild.modules.ranksync.actions.GenerateAccountVerificationURL import com.projectcitybuild.modules.ranksync.actions.SyncPlayerGroupsWithAggregate import com.projectcitybuild.modules.ranksync.actions.UpdatePlayerGroups diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/ranksync/actions/SyncPlayerGroupsWithAggregate.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/ranksync/actions/SyncPlayerGroupsWithAggregate.kt index 644a45e43..5ccbb4158 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/ranksync/actions/SyncPlayerGroupsWithAggregate.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/ranksync/actions/SyncPlayerGroupsWithAggregate.kt @@ -1,6 +1,6 @@ package com.projectcitybuild.modules.ranksync.actions -import com.projectcitybuild.ConfigData +import com.projectcitybuild.entities.ConfigData import com.projectcitybuild.pcbridge.core.modules.config.Config import com.projectcitybuild.libs.permissions.Permissions import com.projectcitybuild.pcbridge.core.contracts.PlatformLogger diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/ranksync/listener/SyncPlayerGroupsOnJoinListener.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/ranksync/listener/SyncPlayerGroupsOnJoinListener.kt index 01f03bbc4..5a4c1ffea 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/ranksync/listener/SyncPlayerGroupsOnJoinListener.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/ranksync/listener/SyncPlayerGroupsOnJoinListener.kt @@ -1,6 +1,6 @@ package com.projectcitybuild.modules.ranksync.listener -import com.projectcitybuild.events.ConnectionPermittedEvent +import com.projectcitybuild.entities.events.ConnectionPermittedEvent import com.projectcitybuild.modules.ranksync.actions.SyncPlayerGroupsWithAggregate import com.projectcitybuild.support.spigot.listeners.SpigotListener import org.bukkit.event.EventHandler diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/warps/WarpsModule.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/warps/WarpsModule.kt index f787bd3a5..16d77a335 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/warps/WarpsModule.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/warps/WarpsModule.kt @@ -1,6 +1,6 @@ package com.projectcitybuild.modules.warps -import com.projectcitybuild.Permissions +import com.projectcitybuild.entities.Permissions import com.projectcitybuild.modules.warps.actions.CreateWarp import com.projectcitybuild.modules.warps.actions.DeleteWarp import com.projectcitybuild.modules.warps.actions.GetWarpList diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/warps/actions/CreateWarp.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/warps/actions/CreateWarp.kt index 8e4c2c15d..f3fa0a2d3 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/warps/actions/CreateWarp.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/warps/actions/CreateWarp.kt @@ -2,7 +2,7 @@ package com.projectcitybuild.modules.warps.actions import com.projectcitybuild.entities.SerializableLocation import com.projectcitybuild.entities.Warp -import com.projectcitybuild.events.WarpCreateEvent +import com.projectcitybuild.entities.events.WarpCreateEvent import com.projectcitybuild.pcbridge.core.modules.datetime.time.Time import com.projectcitybuild.pcbridge.core.utils.Failure import com.projectcitybuild.pcbridge.core.utils.Result diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/warps/actions/DeleteWarp.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/warps/actions/DeleteWarp.kt index 0d4cc6529..46e3ba528 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/warps/actions/DeleteWarp.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/warps/actions/DeleteWarp.kt @@ -1,6 +1,6 @@ package com.projectcitybuild.modules.warps.actions -import com.projectcitybuild.events.WarpDeleteEvent +import com.projectcitybuild.entities.events.WarpDeleteEvent import com.projectcitybuild.pcbridge.core.utils.Failure import com.projectcitybuild.pcbridge.core.utils.Result import com.projectcitybuild.pcbridge.core.utils.Success diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/warps/actions/GetWarpList.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/warps/actions/GetWarpList.kt index 13a1c468f..28027a4f3 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/warps/actions/GetWarpList.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/warps/actions/GetWarpList.kt @@ -1,6 +1,6 @@ package com.projectcitybuild.modules.warps.actions -import com.projectcitybuild.ConfigData +import com.projectcitybuild.entities.ConfigData import com.projectcitybuild.pcbridge.core.modules.config.Config import com.projectcitybuild.repositories.WarpRepository import kotlin.math.ceil diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/warps/actions/TeleportToWarp.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/warps/actions/TeleportToWarp.kt index fbb8148c0..94ad25b5c 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/warps/actions/TeleportToWarp.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/warps/actions/TeleportToWarp.kt @@ -1,6 +1,6 @@ package com.projectcitybuild.modules.warps.actions -import com.projectcitybuild.events.PlayerPreWarpEvent +import com.projectcitybuild.entities.events.PlayerPreWarpEvent import com.projectcitybuild.libs.nameguesser.NameGuesser import com.projectcitybuild.pcbridge.core.contracts.PlatformLogger import com.projectcitybuild.pcbridge.core.utils.Failure diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/repositories/PlayerGroupRepository.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/repositories/PlayerGroupRepository.kt index 2ab188a94..e02ebcb9b 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/repositories/PlayerGroupRepository.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/repositories/PlayerGroupRepository.kt @@ -1,6 +1,6 @@ package com.projectcitybuild.repositories -import com.projectcitybuild.ConfigData +import com.projectcitybuild.entities.ConfigData import com.projectcitybuild.pcbridge.core.modules.config.Config import com.projectcitybuild.pcbridge.core.contracts.PlatformLogger import com.projectcitybuild.pcbridge.http.services.pcb.PlayerGroupHttpService diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/repositories/ScheduledAnnouncementsRepository.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/repositories/ScheduledAnnouncementsRepository.kt index 77bec9712..f6a3eefc1 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/repositories/ScheduledAnnouncementsRepository.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/repositories/ScheduledAnnouncementsRepository.kt @@ -1,6 +1,6 @@ package com.projectcitybuild.repositories -import com.projectcitybuild.ConfigData +import com.projectcitybuild.entities.ConfigData import com.projectcitybuild.pcbridge.core.modules.config.Config import com.projectcitybuild.pcbridge.core.modules.filecache.FileCache diff --git a/pcbridge-spigot/test/com/projectcitybuild/modules/announcements/actions/StartAnnouncementTimerTest.kt b/pcbridge-spigot/test/com/projectcitybuild/modules/announcements/actions/StartAnnouncementTimerTest.kt index e3653b235..b4eb37de5 100644 --- a/pcbridge-spigot/test/com/projectcitybuild/modules/announcements/actions/StartAnnouncementTimerTest.kt +++ b/pcbridge-spigot/test/com/projectcitybuild/modules/announcements/actions/StartAnnouncementTimerTest.kt @@ -1,6 +1,6 @@ package com.projectcitybuild.modules.announcements.actions -import com.projectcitybuild.ConfigData +import com.projectcitybuild.entities.ConfigData import com.projectcitybuild.mock import com.projectcitybuild.pcbridge.core.contracts.PlatformTimer import com.projectcitybuild.pcbridge.core.modules.config.Config diff --git a/pcbridge-spigot/test/com/projectcitybuild/modules/chat/listeners/SyncBadgesOnJoinListenerTest.kt b/pcbridge-spigot/test/com/projectcitybuild/modules/chat/listeners/SyncBadgesOnJoinListenerTest.kt index d56b3ed56..8268ed900 100644 --- a/pcbridge-spigot/test/com/projectcitybuild/modules/chat/listeners/SyncBadgesOnJoinListenerTest.kt +++ b/pcbridge-spigot/test/com/projectcitybuild/modules/chat/listeners/SyncBadgesOnJoinListenerTest.kt @@ -1,6 +1,6 @@ package com.projectcitybuild.modules.chat.listeners -import com.projectcitybuild.events.ConnectionPermittedEvent +import com.projectcitybuild.entities.events.ConnectionPermittedEvent import com.projectcitybuild.pcbridge.http.responses.Aggregate import com.projectcitybuild.pcbridge.http.responses.Badge import com.projectcitybuild.repositories.ChatBadgeRepository diff --git a/pcbridge-spigot/test/com/projectcitybuild/modules/joinmessages/listeners/AnnounceJoinListenerTest.kt b/pcbridge-spigot/test/com/projectcitybuild/modules/joinmessages/listeners/AnnounceJoinListenerTest.kt index f400aedfa..e5376b184 100644 --- a/pcbridge-spigot/test/com/projectcitybuild/modules/joinmessages/listeners/AnnounceJoinListenerTest.kt +++ b/pcbridge-spigot/test/com/projectcitybuild/modules/joinmessages/listeners/AnnounceJoinListenerTest.kt @@ -1,6 +1,6 @@ package com.projectcitybuild.modules.joinmessages.listeners -import com.projectcitybuild.ConfigData +import com.projectcitybuild.entities.ConfigData import com.projectcitybuild.modules.joinmessages.PlayerJoinTimeCache import com.projectcitybuild.pcbridge.core.modules.config.Config import com.projectcitybuild.support.spigot.SpigotServer diff --git a/pcbridge-spigot/test/com/projectcitybuild/modules/joinmessages/listeners/AnnounceQuitListenerTest.kt b/pcbridge-spigot/test/com/projectcitybuild/modules/joinmessages/listeners/AnnounceQuitListenerTest.kt index 69dd4bd45..13b0045cc 100644 --- a/pcbridge-spigot/test/com/projectcitybuild/modules/joinmessages/listeners/AnnounceQuitListenerTest.kt +++ b/pcbridge-spigot/test/com/projectcitybuild/modules/joinmessages/listeners/AnnounceQuitListenerTest.kt @@ -1,6 +1,6 @@ package com.projectcitybuild.modules.joinmessages.listeners -import com.projectcitybuild.ConfigData +import com.projectcitybuild.entities.ConfigData import com.projectcitybuild.modules.joinmessages.PlayerJoinTimeCache import com.projectcitybuild.pcbridge.core.modules.config.Config import com.projectcitybuild.pcbridge.core.modules.datetime.time.Time diff --git a/pcbridge-spigot/test/com/projectcitybuild/modules/joinmessages/listeners/FirstTimeJoinListenerTest.kt b/pcbridge-spigot/test/com/projectcitybuild/modules/joinmessages/listeners/FirstTimeJoinListenerTest.kt index 887776456..27ce0686d 100644 --- a/pcbridge-spigot/test/com/projectcitybuild/modules/joinmessages/listeners/FirstTimeJoinListenerTest.kt +++ b/pcbridge-spigot/test/com/projectcitybuild/modules/joinmessages/listeners/FirstTimeJoinListenerTest.kt @@ -1,7 +1,7 @@ package com.projectcitybuild.modules.joinmessages.listeners -import com.projectcitybuild.ConfigData -import com.projectcitybuild.events.FirstTimeJoinEvent +import com.projectcitybuild.entities.ConfigData +import com.projectcitybuild.entities.events.FirstTimeJoinEvent import com.projectcitybuild.pcbridge.core.contracts.PlatformLogger import com.projectcitybuild.pcbridge.core.modules.config.Config import com.projectcitybuild.support.spigot.SpigotServer diff --git a/pcbridge-spigot/test/com/projectcitybuild/modules/joinmessages/listeners/ServerOverviewJoinListenerTest.kt b/pcbridge-spigot/test/com/projectcitybuild/modules/joinmessages/listeners/ServerOverviewJoinListenerTest.kt index 186e281ec..290214969 100644 --- a/pcbridge-spigot/test/com/projectcitybuild/modules/joinmessages/listeners/ServerOverviewJoinListenerTest.kt +++ b/pcbridge-spigot/test/com/projectcitybuild/modules/joinmessages/listeners/ServerOverviewJoinListenerTest.kt @@ -1,6 +1,6 @@ package com.projectcitybuild.modules.joinmessages.listeners -import com.projectcitybuild.ConfigData +import com.projectcitybuild.entities.ConfigData import com.projectcitybuild.pcbridge.core.modules.config.Config import kotlinx.coroutines.test.runTest import net.md_5.bungee.api.chat.TextComponent diff --git a/pcbridge-spigot/test/com/projectcitybuild/modules/moderation/staffchat/commands/ACommandTest.kt b/pcbridge-spigot/test/com/projectcitybuild/modules/moderation/staffchat/commands/ACommandTest.kt index 689751158..b20bf8ead 100644 --- a/pcbridge-spigot/test/com/projectcitybuild/modules/moderation/staffchat/commands/ACommandTest.kt +++ b/pcbridge-spigot/test/com/projectcitybuild/modules/moderation/staffchat/commands/ACommandTest.kt @@ -1,6 +1,6 @@ package com.projectcitybuild.modules.moderation.staffchat.commands -import com.projectcitybuild.Permissions +import com.projectcitybuild.entities.Permissions import net.md_5.bungee.api.chat.TextComponent import org.bukkit.Server import org.bukkit.entity.Player diff --git a/pcbridge-spigot/test/com/projectcitybuild/modules/pluginutils/listeners/CheckBanOnConnectListenerTest.kt b/pcbridge-spigot/test/com/projectcitybuild/modules/pluginutils/listeners/CheckBanOnConnectListenerTest.kt index eec8403b6..719b28c8a 100644 --- a/pcbridge-spigot/test/com/projectcitybuild/modules/pluginutils/listeners/CheckBanOnConnectListenerTest.kt +++ b/pcbridge-spigot/test/com/projectcitybuild/modules/pluginutils/listeners/CheckBanOnConnectListenerTest.kt @@ -1,6 +1,6 @@ package com.projectcitybuild.modules.pluginutils.listeners -import com.projectcitybuild.events.ConnectionPermittedEvent +import com.projectcitybuild.entities.events.ConnectionPermittedEvent import com.projectcitybuild.libs.errorreporting.ErrorReporter import com.projectcitybuild.modules.moderation.bans.actions.AuthoriseConnection import com.projectcitybuild.modules.moderation.bans.listeners.CheckBanOnConnectListener diff --git a/pcbridge-spigot/test/com/projectcitybuild/modules/ranksync/actions/SyncPlayerGroupsWithAggregateTest.kt b/pcbridge-spigot/test/com/projectcitybuild/modules/ranksync/actions/SyncPlayerGroupsWithAggregateTest.kt index a78427385..f0c105b81 100644 --- a/pcbridge-spigot/test/com/projectcitybuild/modules/ranksync/actions/SyncPlayerGroupsWithAggregateTest.kt +++ b/pcbridge-spigot/test/com/projectcitybuild/modules/ranksync/actions/SyncPlayerGroupsWithAggregateTest.kt @@ -1,6 +1,6 @@ package com.projectcitybuild.modules.ranksync.actions -import com.projectcitybuild.ConfigData +import com.projectcitybuild.entities.ConfigData import com.projectcitybuild.pcbridge.core.modules.config.Config import com.projectcitybuild.libs.permissions.Permissions import com.projectcitybuild.pcbridge.core.contracts.PlatformLogger diff --git a/pcbridge-spigot/test/com/projectcitybuild/modules/warps/actions/GetWarpListTest.kt b/pcbridge-spigot/test/com/projectcitybuild/modules/warps/actions/GetWarpListTest.kt index c2e887cc0..04814fdcd 100644 --- a/pcbridge-spigot/test/com/projectcitybuild/modules/warps/actions/GetWarpListTest.kt +++ b/pcbridge-spigot/test/com/projectcitybuild/modules/warps/actions/GetWarpListTest.kt @@ -1,6 +1,6 @@ package com.projectcitybuild.modules.warps.actions -import com.projectcitybuild.ConfigData +import com.projectcitybuild.entities.ConfigData import com.projectcitybuild.pcbridge.core.modules.config.Config import com.projectcitybuild.repositories.WarpRepository import kotlinx.coroutines.test.runTest diff --git a/pcbridge-spigot/test/com/projectcitybuild/repositories/ScheduledAnnouncementsRepositoryTest.kt b/pcbridge-spigot/test/com/projectcitybuild/repositories/ScheduledAnnouncementsRepositoryTest.kt index 516439d5f..cf6dc97cc 100644 --- a/pcbridge-spigot/test/com/projectcitybuild/repositories/ScheduledAnnouncementsRepositoryTest.kt +++ b/pcbridge-spigot/test/com/projectcitybuild/repositories/ScheduledAnnouncementsRepositoryTest.kt @@ -1,6 +1,6 @@ package com.projectcitybuild.repositories -import com.projectcitybuild.ConfigData +import com.projectcitybuild.entities.ConfigData import com.projectcitybuild.mock import com.projectcitybuild.pcbridge.core.modules.config.Config import com.projectcitybuild.pcbridge.core.modules.filecache.FileCache From 16754fd7ab63023da86ae426d5e5c8ecb932c181 Mon Sep 17 00:00:00 2001 From: Andy Saw <7236312+andyksaw@users.noreply.github.com> Date: Fri, 19 Jan 2024 13:12:53 +0000 Subject: [PATCH 10/15] feat: update to latest Spigot and Bungeecord APIs (#235) * Update Spigot and Bungeecord APIs to latest * Update CommandAPI and fix errors * Fix cache folder not being generated * Adjust delay * Fix invalid chat color * Fix timing * Fix test --- build.gradle.kts | 2 +- .../projectcitybuild/pcbridge/core/storage/JsonStorage.kt | 5 +++++ pcbridge-spigot/build.gradle.kts | 6 +++--- .../src/main/kotlin/com/projectcitybuild/PCBridge.kt | 4 ++-- .../announcements/actions/StartAnnouncementTimer.kt | 5 ++--- .../GeneralBuildToolsModule.kt => bin/BinModule.kt} | 8 ++++---- .../buildtools/{general => bin}/commands/BinCommand.kt | 2 +- .../{general => bin}/listeners/BinCloseListener.kt | 2 +- .../projectcitybuild/modules/chat/ChatBadgeFormatter.kt | 2 +- .../modules/chat/listeners/AsyncPlayerChatListener.kt | 4 ++-- .../com/projectcitybuild/support/spigot/SpigotTimer.kt | 2 +- pcbridge-spigot/src/main/resources/plugin.yml | 2 +- .../announcements/actions/StartAnnouncementTimerTest.kt | 2 +- 13 files changed, 25 insertions(+), 21 deletions(-) rename pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/{general/GeneralBuildToolsModule.kt => bin/BinModule.kt} (73%) rename pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/{general => bin}/commands/BinCommand.kt (85%) rename pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/{general => bin}/listeners/BinCloseListener.kt (93%) diff --git a/build.gradle.kts b/build.gradle.kts index d54460050..34e6fa198 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,7 +1,7 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile val sharedGroup = "com.projectcitybuild.pcbridge" -val sharedVersion = "5.0.0" +val sharedVersion = "5.1.0" group = sharedGroup version = sharedVersion diff --git a/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/storage/JsonStorage.kt b/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/storage/JsonStorage.kt index 0c169370d..00a6f5a20 100644 --- a/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/storage/JsonStorage.kt +++ b/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/storage/JsonStorage.kt @@ -20,6 +20,8 @@ class JsonStorage( fun read(): T? { return try { + if (!file.exists()) return null + // Normally we'd pass a FileReader+JsonReader to gson to read the file contents, // but it's unable to interpret ASCII characters. For some reason, feeding a // JSON string to it instead doesn't have the same problem... @@ -34,6 +36,9 @@ class JsonStorage( fun write(data: T) { return try { + file.parentFile.mkdirs() + file.createNewFile() + PrintWriter(file).use { writer -> gson.toJson(data, typeToken.type, writer) } diff --git a/pcbridge-spigot/build.gradle.kts b/pcbridge-spigot/build.gradle.kts index 6df107077..87d074560 100644 --- a/pcbridge-spigot/build.gradle.kts +++ b/pcbridge-spigot/build.gradle.kts @@ -39,8 +39,8 @@ dependencies { implementation(project(":pcbridge-http")) implementation(project(":pcbridge-web-server")) - compileOnly("org.spigotmc:spigot-api:1.19.2-R0.1-SNAPSHOT") - compileOnly("net.md-5:bungeecord-api:1.16-R0.4") + compileOnly("org.spigotmc:spigot-api:1.20.4-R0.1-SNAPSHOT") + compileOnly("net.md-5:bungeecord-api:1.20-R0.1") compileOnly("net.luckperms:api:5.4") compileOnly("net.essentialsx:EssentialsX:2.19.0") compileOnly("us.dynmap:dynmap-api:3.3") @@ -51,7 +51,7 @@ dependencies { implementation("com.zaxxer:HikariCP:5.0.1") implementation("co.aikar:idb-core:1.0.0-SNAPSHOT") implementation("io.sentry:sentry:5.7.4") - implementation("dev.jorel:commandapi-bukkit-shade:9.1.0") + implementation("dev.jorel:commandapi-bukkit-shade:9.3.0") testImplementation("net.md-5:bungeecord-api:1.16-R0.4") testImplementation("org.spigotmc:spigot-api:1.20.1-R0.1-SNAPSHOT") diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/PCBridge.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/PCBridge.kt index aae5ea2fb..9ef623cac 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/PCBridge.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/PCBridge.kt @@ -2,7 +2,7 @@ package com.projectcitybuild import com.github.shynixn.mccoroutine.bukkit.minecraftDispatcher import com.projectcitybuild.integrations.SpigotIntegration -import com.projectcitybuild.modules.buildtools.general.GeneralBuildToolsModule +import com.projectcitybuild.modules.buildtools.bin.BinModule import com.projectcitybuild.modules.announcements.AnnouncementsModule import com.projectcitybuild.modules.buildtools.invisframes.InvisFramesModule import com.projectcitybuild.modules.buildtools.nightvision.NightVisionModule @@ -108,7 +108,7 @@ private class ContainerLifecycle( AnnouncementsModule(), BansModule(), ChatModule(), - GeneralBuildToolsModule(), + BinModule(), InvisFramesModule(), JoinMessagesModule(), MutesModule(), diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/announcements/actions/StartAnnouncementTimer.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/announcements/actions/StartAnnouncementTimer.kt index 85714b4f5..033ffdd8f 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/announcements/actions/StartAnnouncementTimer.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/announcements/actions/StartAnnouncementTimer.kt @@ -24,9 +24,8 @@ class StartAnnouncementTimer( timer.scheduleRepeating( identifier = timerId, delay = 0, - repeatingInterval = 5, - // repeatingInterval = intervalInMins.toLong(), - unit = TimeUnit.SECONDS, + repeatingInterval = intervalInMins.toLong(), + unit = TimeUnit.MINUTES, work = { val message = repository.getNextAnnouncement() server.broadcastMessage( diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/general/GeneralBuildToolsModule.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/bin/BinModule.kt similarity index 73% rename from pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/general/GeneralBuildToolsModule.kt rename to pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/bin/BinModule.kt index 28f207faf..358d82de9 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/general/GeneralBuildToolsModule.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/bin/BinModule.kt @@ -1,13 +1,13 @@ -package com.projectcitybuild.modules.buildtools.general +package com.projectcitybuild.modules.buildtools.bin import com.projectcitybuild.entities.Permissions -import com.projectcitybuild.modules.buildtools.general.commands.BinCommand -import com.projectcitybuild.modules.buildtools.general.listeners.BinCloseListener +import com.projectcitybuild.modules.buildtools.bin.commands.BinCommand +import com.projectcitybuild.modules.buildtools.bin.listeners.BinCloseListener import com.projectcitybuild.support.modules.ModuleDeclaration import com.projectcitybuild.support.modules.PluginModule import dev.jorel.commandapi.executors.PlayerCommandExecutor -class GeneralBuildToolsModule: PluginModule { +class BinModule: PluginModule { override fun register(module: ModuleDeclaration) = module { command("bin") { diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/general/commands/BinCommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/bin/commands/BinCommand.kt similarity index 85% rename from pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/general/commands/BinCommand.kt rename to pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/bin/commands/BinCommand.kt index 88c9babe2..bf8872b96 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/general/commands/BinCommand.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/bin/commands/BinCommand.kt @@ -1,4 +1,4 @@ -package com.projectcitybuild.modules.buildtools.general.commands +package com.projectcitybuild.modules.buildtools.bin.commands import com.projectcitybuild.support.spigot.SpigotServer import org.bukkit.entity.Player diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/general/listeners/BinCloseListener.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/bin/listeners/BinCloseListener.kt similarity index 93% rename from pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/general/listeners/BinCloseListener.kt rename to pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/bin/listeners/BinCloseListener.kt index cac14d523..4b143110b 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/general/listeners/BinCloseListener.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/bin/listeners/BinCloseListener.kt @@ -1,4 +1,4 @@ -package com.projectcitybuild.modules.buildtools.general.listeners +package com.projectcitybuild.modules.buildtools.bin.listeners import com.projectcitybuild.support.spigot.listeners.SpigotListener import net.md_5.bungee.api.ChatColor diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/chat/ChatBadgeFormatter.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/chat/ChatBadgeFormatter.kt index 2963e5584..0e131659c 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/chat/ChatBadgeFormatter.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/chat/ChatBadgeFormatter.kt @@ -50,7 +50,7 @@ class ChatBadgeFormatter( } tc.add(" ") { - it.color = ChatColor.RESET + it.color = ChatColor.WHITE } return tc } diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/chat/listeners/AsyncPlayerChatListener.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/chat/listeners/AsyncPlayerChatListener.kt index 90387587c..312376ebe 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/chat/listeners/AsyncPlayerChatListener.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/chat/listeners/AsyncPlayerChatListener.kt @@ -49,10 +49,10 @@ class AsyncPlayerChatListener( .add(badges) .add(format.prefix) .add(format.groups) - .add(" ") { it.color = ChatColor.RESET } + .add(" ") { it.color = ChatColor.WHITE } .add(TextComponent.fromLegacyText(event.player.displayName)) .add(format.suffix) - .add(": ") { it.color = ChatColor.RESET } + .add(": ") { it.color = ChatColor.WHITE } .add(TextComponent.fromLegacyText(event.message)) server.onlinePlayers.forEach { it.spigot().sendMessage(tc) } diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/spigot/SpigotTimer.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/spigot/SpigotTimer.kt index 91fcd00d7..ac93e9593 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/spigot/SpigotTimer.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/spigot/SpigotTimer.kt @@ -40,7 +40,7 @@ class SpigotTimer( plugin, work, unit.toSeconds(delay), - unit.toSeconds(repeatingInterval) * 20, // 20 ticks per second + unit.toSeconds(repeatingInterval) * 20, // Expects to be given in ticks (20 ticks per second) ) tasks[identifier] = task diff --git a/pcbridge-spigot/src/main/resources/plugin.yml b/pcbridge-spigot/src/main/resources/plugin.yml index dc04c7c8e..daac4086f 100644 --- a/pcbridge-spigot/src/main/resources/plugin.yml +++ b/pcbridge-spigot/src/main/resources/plugin.yml @@ -1,7 +1,7 @@ main: com.projectcitybuild.PCBridge name: PCBridge author: Andy -version: 5.0.0 +version: 5.1.0 softdepend: - LuckPerms - dynmap diff --git a/pcbridge-spigot/test/com/projectcitybuild/modules/announcements/actions/StartAnnouncementTimerTest.kt b/pcbridge-spigot/test/com/projectcitybuild/modules/announcements/actions/StartAnnouncementTimerTest.kt index b4eb37de5..858176232 100644 --- a/pcbridge-spigot/test/com/projectcitybuild/modules/announcements/actions/StartAnnouncementTimerTest.kt +++ b/pcbridge-spigot/test/com/projectcitybuild/modules/announcements/actions/StartAnnouncementTimerTest.kt @@ -42,7 +42,7 @@ class StartAnnouncementTimerTest { action.start() argumentCaptor<() -> Unit>().apply { - verify(timer).scheduleRepeating(any(), eq(0), eq(5), eq(TimeUnit.SECONDS), capture()) + verify(timer).scheduleRepeating(any(), eq(0), eq(5), eq(TimeUnit.MINUTES), capture()) firstValue() firstValue() } From 01e50eed661a4c069df3e6518c4b6ce697e56723 Mon Sep 17 00:00:00 2001 From: Andy Saw <7236312+andyksaw@users.noreply.github.com> Date: Sun, 12 May 2024 12:33:26 +0000 Subject: [PATCH 11/15] refactor: version 6 (#240) * Remove GadgetsMenu integration * Setup injection * Clean up * Fix * Fix warps * Add message builders and rename command * Display errors * Give parsed args to commands; remove JDBC wrapper; fix connection leak * Clean up args * Add warp command * Add warp delete command * Add warp move command * Add warp create command * Fix unclosed resources * Switch to Paper * Add Essentials integration * Add join messages and emoji formatter * Add staff chat command * Add telemetry join listeners * Add mute commands * Add NightVision command * Add invisframe command * Simplify dependencies * Add ban commands * Remove integration duplications * Add chat and sync features * Fix issues * Add announcements * Clean up * Add warnings * Show first time join message * Switch to Configurate * Remove core subproject * Replace logger * Clean up * Switch back to custom config for simplicity * Fix missing dependency * Fix namespace * Fix tests * Restore ktlint * Lint * Fix lint issue * Add missing serializer * Fix lint issues --- .github/workflows/release.yml | 33 +- .github/workflows/tests.yml | 12 +- .gitignore | 1 + build.gradle.kts | 21 +- gradle/wrapper/gradle-wrapper.jar | Bin 59203 -> 43453 bytes gradle/wrapper/gradle-wrapper.properties | 4 +- gradlew | 41 +- gradlew.bat | 35 +- pcbridge-core/build.gradle.kts | 7 - .../pcbridge/core/contracts/PlatformLogger.kt | 9 - .../core/contracts/PlatformScheduler.kt | 9 - .../pcbridge/core/contracts/PlatformTimer.kt | 26 - .../pcbridge/core/modules/config/Config.kt | 24 - .../datetime/formatter/DateTimeFormatter.kt | 10 - .../formatter/DateTimeFormatterImpl.kt | 36 - .../modules/datetime/time/LocalizedTime.kt | 12 - .../core/modules/datetime/time/Time.kt | 7 - .../core/modules/filecache/FileCache.kt | 19 - .../pcbridge/core/utils/AsyncTask.kt | 43 -- .../core/modules/config/ConfigTest.kt | 79 --- .../pcbridge/core/storage/JsonStorageTest.kt | 106 --- .../pcbridge/http/HttpService.kt | 15 +- .../pcbridge/http/RetrofitExtensions.kt | 2 +- .../pcbridge/http/clients/PCBClientFactory.kt | 19 +- .../pcbridge/http/parsing/ApiError.kt | 2 +- .../pcbridge/http/parsing/ApiResponse.kt | 2 +- .../pcbridge/http/parsing/ResponseParser.kt | 25 +- .../pcbridge/http/requests/MojangRequest.kt | 3 +- .../pcbridge/http/requests/PCBRequest.kt | 35 +- .../pcbridge/http/responses/Account.kt | 9 +- .../pcbridge/http/responses/AccountBalance.kt | 7 - .../pcbridge/http/responses/Aggregate.kt | 15 +- .../pcbridge/http/responses/AuthURL.kt | 3 +- .../pcbridge/http/responses/Badge.kt | 8 +- .../pcbridge/http/responses/DonationPerk.kt | 19 +- .../pcbridge/http/responses/DonationTier.kt | 6 +- .../pcbridge/http/responses/Group.kt | 21 +- .../pcbridge/http/responses/IPBan.kt | 30 +- .../pcbridge/http/responses/MojangPlayer.kt | 6 +- .../pcbridge/http/responses/PlayerBan.kt | 42 +- .../pcbridge/http/responses/PlayerWarning.kt | 30 +- .../services/mojang/PlayerUUIDHttpService.kt | 24 +- .../services/pcb/AccountLinkHTTPService.kt | 40 +- .../http/services/pcb/AggregateHttpService.kt | 25 +- .../http/services/pcb/CurrencyHttpService.kt | 31 - .../http/services/pcb/IPBanHttpService.kt | 20 +- .../services/pcb/PlayerGroupHttpService.kt | 65 +- .../services/pcb/PlayerWarningHttpService.kt | 64 +- .../http/services/pcb/TelemetryHttpService.kt | 9 +- .../http/services/pcb/UUIDBanHttpService.kt | 33 +- pcbridge-spigot/build.gradle.kts | 115 +-- pcbridge-spigot/libs/GadgetsMenu.jar | Bin 1929138 -> 0 bytes .../projectcitybuild/DependencyContainer.kt | 313 --------- .../kotlin/com/projectcitybuild/PCBridge.kt | 153 ---- .../com/projectcitybuild/WebServerDelegate.kt | 56 -- .../projectcitybuild/entities/ConfigData.kt | 196 ------ .../entities/PluginVersion.kt | 6 - .../com/projectcitybuild/entities/Warp.kt | 9 - .../entities/events/FirstTimeJoinEvent.kt | 22 - .../entities/events/WarpCreateEvent.kt | 21 - .../entities/events/WarpDeleteEvent.kt | 21 - .../migrations/202200821_add_badge_toggle.kt | 19 - .../migrations/20220114_first_time_run.kt | 13 - .../20220115_player_configs_warps.kt | 96 --- .../migrations/20220120_teleport_history.kt | 29 - .../entities/migrations/20220201_add_hub.kt | 27 - .../migrations/20220201_add_ip_bans.kt | 24 - ...20220207_add_teleport_message_silencing.kt | 19 - .../20220320_rename_queued_warps.kt | 19 - .../migrations/20220505_delete_queues.kt | 26 - .../20220530_delete_bungeecord_cols.kt | 50 -- .../integrations/SpigotIntegration.kt | 6 - .../dynmap/DynmapMarkerIntegration.kt | 108 --- .../essentials/EssentialsIntegration.kt | 57 -- .../gadgetsmenu/GadgetsMenuIntegration.kt | 79 --- .../luckperms/LuckPermsIntegration.kt | 57 -- .../libs/database/DataSource.kt | 84 --- .../libs/database/DatabaseMigration.kt | 8 - .../libs/database/Migration.kt | 47 -- .../libs/errorreporting/ErrorOutput.kt | 6 - .../libs/errorreporting/ErrorReporter.kt | 13 - .../outputs/PrintStackTraceOutput.kt | 11 - .../outputs/SentryErrorOutput.kt | 28 - .../libs/nameguesser/NameGuesser.kt | 58 -- .../libs/playercache/PlayerConfigCache.kt | 28 - .../announcements/AnnouncementsModule.kt | 25 - .../actions/StartAnnouncementTimer.kt | 41 -- .../modules/buildtools/bin/BinModule.kt | 26 - .../buildtools/bin/commands/BinCommand.kt | 17 - .../bin/listeners/BinCloseListener.kt | 32 - .../invisframes/InvisFramesModule.kt | 41 -- .../invisframes/commands/InvisFrameCommand.kt | 52 -- .../listeners/FramePlaceListener.kt | 36 - .../nightvision/NightVisionModule.kt | 31 - .../commands/NightVisionCommand.kt | 34 - .../modules/chat/ChatBadgeFormatter.kt | 57 -- .../modules/chat/ChatGroupFormatter.kt | 131 ---- .../modules/chat/ChatModule.kt | 50 -- .../modules/chat/commands/BadgeCommand.kt | 28 - .../chat/listeners/AsyncPlayerChatListener.kt | 60 -- .../chat/listeners/EmojiChatListener.kt | 30 - .../listeners/SyncBadgesOnJoinListener.kt | 16 - .../joinmessages/JoinMessagesModule.kt | 42 -- .../joinmessages/PlayerJoinTimeCache.kt | 23 - .../listeners/AnnounceJoinListener.kt | 29 - .../listeners/AnnounceQuitListener.kt | 50 -- .../listeners/FirstTimeJoinListener.kt | 29 - .../listeners/ServerOverviewJoinListener.kt | 22 - .../modules/moderation/bans/BansModule.kt | 144 ---- .../moderation/bans/actions/BanUUID.kt | 60 -- .../moderation/bans/actions/CheckUUIDBan.kt | 41 -- .../moderation/bans/actions/TempBanUUID.kt | 62 -- .../moderation/bans/actions/UnbanUUID.kt | 49 -- .../moderation/bans/commands/BanCommand.kt | 31 - .../moderation/bans/commands/BanIPCommand.kt | 40 -- .../bans/commands/CheckBanCommand.kt | 41 -- .../moderation/bans/commands/UnbanCommand.kt | 25 - .../bans/commands/UnbanIPCommand.kt | 29 - .../listeners/CheckBanOnConnectListener.kt | 107 --- .../modules/moderation/mutes/MutesModule.kt | 48 -- .../moderation/mutes/actions/MutePlayer.kt | 19 - .../moderation/mutes/commands/MuteCommand.kt | 18 - .../mutes/commands/UnmuteCommand.kt | 18 - .../moderation/staffchat/StaffChatModule.kt | 27 - .../moderation/staffchat/commands/ACommand.kt | 25 - .../moderation/warnings/WarningsModule.kt | 43 -- .../warnings/actions/AcknowledgeWarning.kt | 14 - .../commands/WarningAcknowledgeCommand.kt | 14 - .../listeners/NotifyWarningsOnJoinListener.kt | 59 -- .../modules/pluginutils/PluginUtilsModule.kt | 63 -- .../modules/pluginutils/actions/GetVersion.kt | 17 - .../pluginutils/actions/ReloadPlugin.kt | 21 - .../pluginutils/commands/ReloadCommand.kt | 14 - .../pluginutils/commands/VersionCommand.kt | 17 - .../listeners/CachePlayerOnJoinListener.kt | 39 -- .../listeners/ExceptionListener.kt | 17 - .../listeners/UncachePlayerOnQuitListener.kt | 24 - .../modules/ranksync/RankSyncModule.kt | 71 -- .../actions/SyncPlayerGroupsWithAggregate.kt | 41 -- .../ranksync/actions/UpdatePlayerGroups.kt | 33 - .../modules/ranksync/commands/SyncCommand.kt | 65 -- .../ranksync/commands/SyncOtherCommand.kt | 28 - .../SyncPlayerGroupsOnJoinListener.kt | 19 - .../modules/telemetry/TelemetryModule.kt | 19 - .../telemetry/listeners/PlayerJoinListener.kt | 19 - .../telemetry/listeners/PlayerQuitListener.kt | 19 - .../modules/warps/WarpsModule.kt | 111 --- .../modules/warps/actions/CreateWarp.kt | 37 - .../modules/warps/actions/DeleteWarp.kt | 29 - .../modules/warps/actions/GetWarpList.kt | 43 -- .../modules/warps/actions/TeleportToWarp.kt | 64 -- .../warps/commands/CreateWarpCommand.kt | 27 - .../warps/commands/DeleteWarpCommand.kt | 26 - .../warps/commands/ListWarpsCommand.kt | 49 -- .../modules/warps/commands/WarpCommand.kt | 27 - .../projectcitybuild/pcbridge/Container.kt | 662 ++++++++++++++++++ .../{entities => pcbridge}/Permissions.kt | 4 +- .../com/projectcitybuild/pcbridge/Plugin.kt | 209 ++++++ .../pcbridge/core/config/Config.kt | 24 + .../pcbridge/core/config}/JsonStorage.kt | 22 +- .../pcbridge/core/database/DatabaseSession.kt | 74 ++ .../pcbridge/core/database/DatabaseSource.kt | 22 + .../core/datetime/DateTimeFormatter.kt | 27 + .../pcbridge/core/datetime/LocalizedTime.kt | 10 + .../pcbridge/core/errors/SentryReporter.kt | 39 ++ .../pcbridge/core/logger/Logger.kt | 5 + .../core}/permissions/Permissions.kt | 15 +- .../adapters/LuckPermsPermissions.kt | 40 +- .../pcbridge/core/state/ServerState.kt | 52 ++ .../pcbridge/core/state/Store.kt | 37 + .../projectcitybuild/pcbridge/data/Page.kt | 7 + .../pcbridge/data/PluginConfig.kt | 210 ++++++ .../data}/SerializableLocation.kt | 4 +- .../actions/StartAnnouncementTimer.kt | 42 ++ .../listeners/AnnouncementEnableListener.kt | 54 ++ .../repositories/AnnouncementRepository.kt | 22 + .../features/bans}/Sanitizer.kt | 3 +- .../pcbridge/features/bans}/ValidIP.kt | 4 +- .../bans/actions/AuthoriseConnection.kt | 4 +- .../features}/bans/actions/BanIP.kt | 34 +- .../pcbridge/features/bans/actions/BanUUID.kt | 53 ++ .../features/bans/actions/CheckUUIDBan.kt | 42 ++ .../features}/bans/actions/UnbanIP.kt | 16 +- .../features/bans/actions/UnbanUUID.kt | 39 ++ .../features/bans/commands/BanCommand.kt | 76 ++ .../features/bans/commands/BanIPCommand.kt | 77 ++ .../features/bans/commands/CheckBanCommand.kt | 69 ++ .../features/bans/commands/UnbanCommand.kt | 63 ++ .../features/bans/commands/UnbanIPCommand.kt | 63 ++ .../bans}/events/ConnectionPermittedEvent.kt | 16 +- .../listeners/AuthorizeConnectionListener.kt | 118 ++++ .../bans}/repositories/AggregateRepository.kt | 11 +- .../bans}/repositories/IPBanRepository.kt | 16 +- .../bans}/repositories/PlayerBanRepository.kt | 10 +- .../repositories/PlayerUUIDRepository.kt | 8 +- .../features/chat/ChatBadgeFormatter.kt | 43 ++ .../features/chat/ChatGroupFormatter.kt | 109 +++ .../pcbridge/features/chat/ChatGroupType.kt | 7 + .../chat/listeners/EmojiChatListener.kt | 46 ++ .../chat/listeners/FormatNameChatListener.kt | 57 ++ .../listeners/SyncBadgesOnJoinListener.kt | 25 + .../chat/repositories/ChatBadgeRepository.kt | 20 + .../chat/repositories/ChatGroupRepository.kt | 45 ++ .../invisframes/commands/InvisFrameCommand.kt | 104 +++ .../listeners/FrameItemInsertListener.kt} | 26 +- .../listeners/FrameItemRemoveListener.kt} | 26 +- .../listeners/FramePlaceListener.kt | 34 + .../features/joinmessages}/PlayerConfig.kt | 4 +- .../listeners/AnnounceJoinListener.kt | 42 ++ .../listeners/AnnounceQuitListener.kt | 59 ++ .../listeners/FirstTimeJoinListener.kt | 44 ++ .../listeners/ServerOverviewJoinListener.kt | 21 + .../repositories/PlayerConfigRepository.kt | 73 ++ .../features/mute/commands/MuteCommand.kt | 61 ++ .../features/mute/commands/UnmuteCommand.kt | 61 ++ .../mute/listeners/MuteChatListener.kt | 25 + .../commands/NightVisionCommand.kt | 73 ++ .../staffchat/commands/StaffChatCommand.kt | 56 ++ .../actions/GenerateAccountVerificationURL.kt | 14 +- .../features/sync/actions/SyncPlayerGroups.kt | 27 + .../sync/actions/UpdatePlayerGroups.kt | 36 + .../features/sync/commands/SyncCommand.kt | 111 +++ .../sync/commands/SyncOtherCommand.kt | 70 ++ .../sync/listener/SyncRankOnJoinListener.kt | 19 + .../sync/repositories/SyncRepository.kt | 47 ++ .../TelemetryPlayerConnectListener.kt | 25 + .../repositories/TelemetryRepository.kt | 7 +- .../utilities/commands/PCBridgeCommand.kt | 92 +++ .../actions/GetUnacknowledgedWarnings.kt | 19 +- .../commands/WarningAcknowledgeCommand.kt | 37 + .../listeners/NotifyWarningsOnJoinListener.kt | 62 ++ .../repositories/PlayerWarningRepository.kt | 23 + .../pcbridge/features/warps/Warp.kt | 10 + .../features/warps/commands/WarpCommand.kt | 81 +++ .../features/warps/commands/WarpsCommand.kt | 148 ++++ .../warps/commands/warps/WarpCreateCommand.kt | 137 ++++ .../warps/commands/warps/WarpDeleteCommand.kt | 52 ++ .../warps/commands/warps/WarpListCommand.kt | 95 +++ .../warps/commands/warps/WarpMoveCommand.kt | 55 ++ .../warps/commands/warps/WarpRenameCommand.kt | 53 ++ .../warps}/events/PlayerPreWarpEvent.kt | 16 +- .../features/warps/events/WarpCreateEvent.kt | 17 + .../features/warps/events/WarpDeleteEvent.kt | 17 + .../warps/repositories/WarpRepository.kt | 209 ++++++ .../integrations/DynmapIntegration.kt | 109 +++ .../integrations/EssentialsIntegration.kt | 57 ++ .../integrations/LuckPermsIntegration.kt | 46 ++ .../pcbridge/support/EnumExtensions.kt | 11 + .../support/messages/CommandHelpBuilder.kt | 54 ++ .../support/messages/PaginationBuilder.kt | 43 ++ .../messages/TextComponentExtensions.kt | 14 + .../serializable/LocalDateTimeSerializer.kt | 27 + .../support/serializable/UUIDSerializer.kt | 23 + .../pcbridge/support/spigot/SpigotCommand.kt | 47 ++ .../support/spigot/SpigotCommandRegistry.kt | 95 +++ .../support/spigot/SpigotIntegration.kt | 31 + .../support/spigot/SpigotListenerRegistry.kt | 20 + .../support/spigot/SpigotNamespace.kt | 4 +- .../support/spigot/SpigotTimer.kt | 45 +- .../pcbridge}/utils/Cancellable.kt | 2 +- .../pcbridge}/utils/Result.kt | 3 +- .../utils/extensions/StringExtensions.kt | 2 +- .../repositories/ChatBadgeRepository.kt | 20 - .../repositories/CurrencyRepository.kt | 82 --- .../repositories/PlayerConfigRepository.kt | 75 -- .../repositories/PlayerGroupRepository.kt | 39 -- .../repositories/PlayerWarningRepository.kt | 36 - .../ScheduledAnnouncementsRepository.kt | 32 - .../repositories/VerificationURLRepository.kt | 14 - .../repositories/WarpRepository.kt | 103 --- .../support/commandapi/SuspendingExecutors.kt | 22 - .../support/commandapi/ToggleOption.kt | 7 - .../support/modules/ModuleRegisterDSL.kt | 27 - .../support/modules/PluginModule.kt | 6 - .../support/spigot/SpigotLogger.kt | 29 - .../support/spigot/SpigotScheduler.kt | 30 - .../support/spigot/SpigotServer.kt | 52 -- .../eventbroadcast/BroadcastableEvent.kt | 3 - .../eventbroadcast/LocalEventBroadcaster.kt | 11 - .../SpigotLocalEventBroadcaster.kt | 20 - .../spigot/listeners/SpigotListener.kt | 8 - .../listeners/SpigotListenerRegistry.kt | 22 - .../textcomponent/ChatMessageReceiver.kt | 7 - .../support/textcomponent/MessageSender.kt | 56 -- .../textcomponent/SpigotChatReceiver.kt | 22 - .../textcomponent/TextComponentBuilder.kt | 44 -- pcbridge-spigot/src/main/resources/plugin.yml | 42 +- .../libs/errorreporting/ErrorReporterTest.kt | 33 - .../libs/nameguesser/NameGuesserTest.kt | 50 -- .../actions/StartAnnouncementTimerTest.kt | 58 -- .../commands/NightVisionCommandTest.kt | 82 --- .../modules/chat/commands/BadgeCommandTest.kt | 108 --- .../chat/listeners/EmojiChatListenerTest.kt | 58 -- .../listeners/SyncBadgesOnJoinListenerTest.kt | 32 - .../listeners/AnnounceJoinListenerTest.kt | 55 -- .../listeners/AnnounceQuitListenerTest.kt | 127 ---- .../listeners/FirstTimeJoinListenerTest.kt | 50 -- .../ServerOverviewJoinListenerTest.kt | 46 -- .../bans/actions/AuthoriseConnectionTest.kt | 89 --- .../moderation/bans/actions/BanIPTest.kt | 112 --- .../moderation/bans/actions/BanUUIDTest.kt | 108 --- .../bans/actions/CheckBanUUIDTest.kt | 116 --- .../moderation/bans/actions/UnbanIPTest.kt | 80 --- .../moderation/bans/actions/UnbanUUIDTest.kt | 90 --- .../moderation/mute/actions/MutePlayerTest.kt | 63 -- .../staffchat/commands/ACommandTest.kt | 48 -- .../CheckBanOnConnectListenerTest.kt | 135 ---- .../GenerateAccountVerificationURLTest.kt | 78 --- .../SyncPlayerGroupsWithAggregateTest.kt | 80 --- .../actions/UpdatePlayerGroupsTest.kt | 68 -- .../modules/warps/actions/CreateWarpTest.kt | 82 --- .../modules/warps/actions/DeleteWarpTest.kt | 63 -- .../modules/warps/actions/GetWarpListTest.kt | 97 --- .../warps/actions/TeleportToWarpTest.kt | 105 --- .../{Mock.kt => pcbridge/Mockito.kt} | 4 +- .../datetime/DateTimeFormatterTest.kt | 15 +- .../pcbridge/datetime}/LocalizedTimeTest.kt | 13 +- .../features/bans}/SanitizerTest.kt | 3 +- .../pcbridge/features/bans}/ValidIPTest.kt | 8 +- .../bans/actions/AuthoriseConnectionTest.kt | 99 +++ .../features/bans/actions/BanIPTest.kt | 131 ++++ .../features/bans/actions/BanUUIDTest.kt | 84 +++ .../features/bans/actions/CheckBanUUIDTest.kt | 128 ++++ .../features/bans/actions/UnbanIPTest.kt | 84 +++ .../features/bans/actions/UnbanUUIDTest.kt | 77 ++ .../commands/NightVisionCommandTest.kt | 98 +++ .../staffchat/commands/ACommandTest.kt | 57 ++ .../pcbridge}/utils/CancellableTest.kt | 4 +- .../utils/extensions/StringExtensionsTest.kt | 4 +- .../ScheduledAnnouncementsRepositoryTest.kt | 83 --- .../support/spigot/SpigotLoggerTest.kt | 53 -- .../support/spigot/SpigotSchedulerTest.kt | 114 --- .../support/spigot/SpigotServerTest.kt | 105 --- .../api_ban_already_banned_response.json | 8 - .../api_ban_invalid_input_response.json | 8 - .../api_ban_not_banned_response.json | 8 - .../api_ban_status_ban_response.json | 17 - .../resources/api_ban_unban_response.json | 10 - .../test/resources/api_no_data_response.json | 3 - pcbridge-web-server/build.gradle.kts | 18 - .../pcbridge/webserver/HttpServer.kt | 63 -- .../pcbridge/webserver/HttpServerConfig.kt | 6 - settings.gradle.kts | 2 - 343 files changed, 6547 insertions(+), 8881 deletions(-) delete mode 100644 pcbridge-core/build.gradle.kts delete mode 100644 pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/contracts/PlatformLogger.kt delete mode 100644 pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/contracts/PlatformScheduler.kt delete mode 100644 pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/contracts/PlatformTimer.kt delete mode 100644 pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/modules/config/Config.kt delete mode 100644 pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/modules/datetime/formatter/DateTimeFormatter.kt delete mode 100644 pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/modules/datetime/formatter/DateTimeFormatterImpl.kt delete mode 100644 pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/modules/datetime/time/LocalizedTime.kt delete mode 100644 pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/modules/datetime/time/Time.kt delete mode 100644 pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/modules/filecache/FileCache.kt delete mode 100644 pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/utils/AsyncTask.kt delete mode 100644 pcbridge-core/src/test/kotlin/com/projectcitybuild/pcbridge/core/modules/config/ConfigTest.kt delete mode 100644 pcbridge-core/src/test/kotlin/com/projectcitybuild/pcbridge/core/storage/JsonStorageTest.kt delete mode 100644 pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/AccountBalance.kt delete mode 100644 pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/services/pcb/CurrencyHttpService.kt delete mode 100644 pcbridge-spigot/libs/GadgetsMenu.jar delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/DependencyContainer.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/PCBridge.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/WebServerDelegate.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/ConfigData.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/PluginVersion.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/Warp.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/events/FirstTimeJoinEvent.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/events/WarpCreateEvent.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/events/WarpDeleteEvent.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/migrations/202200821_add_badge_toggle.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/migrations/20220114_first_time_run.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/migrations/20220115_player_configs_warps.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/migrations/20220120_teleport_history.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/migrations/20220201_add_hub.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/migrations/20220201_add_ip_bans.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/migrations/20220207_add_teleport_message_silencing.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/migrations/20220320_rename_queued_warps.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/migrations/20220505_delete_queues.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/migrations/20220530_delete_bungeecord_cols.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/integrations/SpigotIntegration.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/integrations/dynmap/DynmapMarkerIntegration.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/integrations/essentials/EssentialsIntegration.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/integrations/gadgetsmenu/GadgetsMenuIntegration.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/integrations/luckperms/LuckPermsIntegration.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/database/DataSource.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/database/DatabaseMigration.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/database/Migration.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/errorreporting/ErrorOutput.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/errorreporting/ErrorReporter.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/errorreporting/outputs/PrintStackTraceOutput.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/errorreporting/outputs/SentryErrorOutput.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/nameguesser/NameGuesser.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/playercache/PlayerConfigCache.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/announcements/AnnouncementsModule.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/announcements/actions/StartAnnouncementTimer.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/bin/BinModule.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/bin/commands/BinCommand.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/bin/listeners/BinCloseListener.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/invisframes/InvisFramesModule.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/invisframes/commands/InvisFrameCommand.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/invisframes/listeners/FramePlaceListener.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/nightvision/NightVisionModule.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/nightvision/commands/NightVisionCommand.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/chat/ChatBadgeFormatter.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/chat/ChatGroupFormatter.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/chat/ChatModule.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/chat/commands/BadgeCommand.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/chat/listeners/AsyncPlayerChatListener.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/chat/listeners/EmojiChatListener.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/chat/listeners/SyncBadgesOnJoinListener.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/JoinMessagesModule.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/PlayerJoinTimeCache.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/listeners/AnnounceJoinListener.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/listeners/AnnounceQuitListener.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/listeners/FirstTimeJoinListener.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/listeners/ServerOverviewJoinListener.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/bans/BansModule.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/bans/actions/BanUUID.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/bans/actions/CheckUUIDBan.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/bans/actions/TempBanUUID.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/bans/actions/UnbanUUID.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/bans/commands/BanCommand.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/bans/commands/BanIPCommand.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/bans/commands/CheckBanCommand.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/bans/commands/UnbanCommand.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/bans/commands/UnbanIPCommand.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/bans/listeners/CheckBanOnConnectListener.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/mutes/MutesModule.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/mutes/actions/MutePlayer.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/mutes/commands/MuteCommand.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/mutes/commands/UnmuteCommand.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/staffchat/StaffChatModule.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/staffchat/commands/ACommand.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/warnings/WarningsModule.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/warnings/actions/AcknowledgeWarning.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/warnings/commands/WarningAcknowledgeCommand.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/warnings/listeners/NotifyWarningsOnJoinListener.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/pluginutils/PluginUtilsModule.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/pluginutils/actions/GetVersion.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/pluginutils/actions/ReloadPlugin.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/pluginutils/commands/ReloadCommand.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/pluginutils/commands/VersionCommand.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/pluginutils/listeners/CachePlayerOnJoinListener.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/pluginutils/listeners/ExceptionListener.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/pluginutils/listeners/UncachePlayerOnQuitListener.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/ranksync/RankSyncModule.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/ranksync/actions/SyncPlayerGroupsWithAggregate.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/ranksync/actions/UpdatePlayerGroups.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/ranksync/commands/SyncCommand.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/ranksync/commands/SyncOtherCommand.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/ranksync/listener/SyncPlayerGroupsOnJoinListener.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/telemetry/TelemetryModule.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/telemetry/listeners/PlayerJoinListener.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/telemetry/listeners/PlayerQuitListener.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/warps/WarpsModule.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/warps/actions/CreateWarp.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/warps/actions/DeleteWarp.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/warps/actions/GetWarpList.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/warps/actions/TeleportToWarp.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/warps/commands/CreateWarpCommand.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/warps/commands/DeleteWarpCommand.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/warps/commands/ListWarpsCommand.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/warps/commands/WarpCommand.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/Container.kt rename pcbridge-spigot/src/main/kotlin/com/projectcitybuild/{entities => pcbridge}/Permissions.kt (97%) create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/Plugin.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/core/config/Config.kt rename {pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/storage => pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/core/config}/JsonStorage.kt (66%) create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/core/database/DatabaseSession.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/core/database/DatabaseSource.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/core/datetime/DateTimeFormatter.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/core/datetime/LocalizedTime.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/core/errors/SentryReporter.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/core/logger/Logger.kt rename pcbridge-spigot/src/main/kotlin/com/projectcitybuild/{libs => pcbridge/core}/permissions/Permissions.kt (52%) rename pcbridge-spigot/src/main/kotlin/com/projectcitybuild/{libs => pcbridge/core}/permissions/adapters/LuckPermsPermissions.kt (74%) create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/core/state/ServerState.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/core/state/Store.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/data/Page.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/data/PluginConfig.kt rename pcbridge-spigot/src/main/kotlin/com/projectcitybuild/{entities => pcbridge/data}/SerializableLocation.kt (88%) create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/announcements/actions/StartAnnouncementTimer.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/announcements/listeners/AnnouncementEnableListener.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/announcements/repositories/AnnouncementRepository.kt rename pcbridge-spigot/src/main/kotlin/com/projectcitybuild/{utils => pcbridge/features/bans}/Sanitizer.kt (92%) rename {pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/utils/helpers => pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans}/ValidIP.kt (85%) rename pcbridge-spigot/src/main/kotlin/com/projectcitybuild/{modules/moderation => pcbridge/features}/bans/actions/AuthoriseConnection.kt (94%) rename pcbridge-spigot/src/main/kotlin/com/projectcitybuild/{modules/moderation => pcbridge/features}/bans/actions/BanIP.kt (52%) create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/actions/BanUUID.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/actions/CheckUUIDBan.kt rename pcbridge-spigot/src/main/kotlin/com/projectcitybuild/{modules/moderation => pcbridge/features}/bans/actions/UnbanIP.kt (65%) create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/actions/UnbanUUID.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/commands/BanCommand.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/commands/BanIPCommand.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/commands/CheckBanCommand.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/commands/UnbanCommand.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/commands/UnbanIPCommand.kt rename pcbridge-spigot/src/main/kotlin/com/projectcitybuild/{entities => pcbridge/features/bans}/events/ConnectionPermittedEvent.kt (63%) create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/listeners/AuthorizeConnectionListener.kt rename pcbridge-spigot/src/main/kotlin/com/projectcitybuild/{ => pcbridge/features/bans}/repositories/AggregateRepository.kt (57%) rename pcbridge-spigot/src/main/kotlin/com/projectcitybuild/{ => pcbridge/features/bans}/repositories/IPBanRepository.kt (72%) rename pcbridge-spigot/src/main/kotlin/com/projectcitybuild/{ => pcbridge/features/bans}/repositories/PlayerBanRepository.kt (83%) rename pcbridge-spigot/src/main/kotlin/com/projectcitybuild/{ => pcbridge/features/bans}/repositories/PlayerUUIDRepository.kt (81%) create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/chat/ChatBadgeFormatter.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/chat/ChatGroupFormatter.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/chat/ChatGroupType.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/chat/listeners/EmojiChatListener.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/chat/listeners/FormatNameChatListener.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/chat/listeners/SyncBadgesOnJoinListener.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/chat/repositories/ChatBadgeRepository.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/chat/repositories/ChatGroupRepository.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/invisframes/commands/InvisFrameCommand.kt rename pcbridge-spigot/src/main/kotlin/com/projectcitybuild/{modules/buildtools/invisframes/listeners/ItemInsertListener.kt => pcbridge/features/invisframes/listeners/FrameItemInsertListener.kt} (52%) rename pcbridge-spigot/src/main/kotlin/com/projectcitybuild/{modules/buildtools/invisframes/listeners/ItemRemoveListener.kt => pcbridge/features/invisframes/listeners/FrameItemRemoveListener.kt} (52%) create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/invisframes/listeners/FramePlaceListener.kt rename pcbridge-spigot/src/main/kotlin/com/projectcitybuild/{entities => pcbridge/features/joinmessages}/PlayerConfig.kt (60%) create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/joinmessages/listeners/AnnounceJoinListener.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/joinmessages/listeners/AnnounceQuitListener.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/joinmessages/listeners/FirstTimeJoinListener.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/joinmessages/listeners/ServerOverviewJoinListener.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/joinmessages/repositories/PlayerConfigRepository.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/mute/commands/MuteCommand.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/mute/commands/UnmuteCommand.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/mute/listeners/MuteChatListener.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/nightvision/commands/NightVisionCommand.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/staffchat/commands/StaffChatCommand.kt rename pcbridge-spigot/src/main/kotlin/com/projectcitybuild/{modules/ranksync => pcbridge/features/sync}/actions/GenerateAccountVerificationURL.kt (61%) create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/sync/actions/SyncPlayerGroups.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/sync/actions/UpdatePlayerGroups.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/sync/commands/SyncCommand.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/sync/commands/SyncOtherCommand.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/sync/listener/SyncRankOnJoinListener.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/sync/repositories/SyncRepository.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/telemetry/listeners/TelemetryPlayerConnectListener.kt rename pcbridge-spigot/src/main/kotlin/com/projectcitybuild/{ => pcbridge/features/telemetry}/repositories/TelemetryRepository.kt (66%) create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/utilities/commands/PCBridgeCommand.kt rename pcbridge-spigot/src/main/kotlin/com/projectcitybuild/{modules/moderation => pcbridge/features}/warnings/actions/GetUnacknowledgedWarnings.kt (55%) create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warnings/commands/WarningAcknowledgeCommand.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warnings/listeners/NotifyWarningsOnJoinListener.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warnings/repositories/PlayerWarningRepository.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/Warp.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/commands/WarpCommand.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/commands/WarpsCommand.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/commands/warps/WarpCreateCommand.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/commands/warps/WarpDeleteCommand.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/commands/warps/WarpListCommand.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/commands/warps/WarpMoveCommand.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/commands/warps/WarpRenameCommand.kt rename pcbridge-spigot/src/main/kotlin/com/projectcitybuild/{entities => pcbridge/features/warps}/events/PlayerPreWarpEvent.kt (62%) create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/events/WarpCreateEvent.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/events/WarpDeleteEvent.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/repositories/WarpRepository.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/integrations/DynmapIntegration.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/integrations/EssentialsIntegration.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/integrations/LuckPermsIntegration.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/support/EnumExtensions.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/support/messages/CommandHelpBuilder.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/support/messages/PaginationBuilder.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/support/messages/TextComponentExtensions.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/support/serializable/LocalDateTimeSerializer.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/support/serializable/UUIDSerializer.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/support/spigot/SpigotCommand.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/support/spigot/SpigotCommandRegistry.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/support/spigot/SpigotIntegration.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/support/spigot/SpigotListenerRegistry.kt rename pcbridge-spigot/src/main/kotlin/com/projectcitybuild/{ => pcbridge}/support/spigot/SpigotNamespace.kt (76%) rename pcbridge-spigot/src/main/kotlin/com/projectcitybuild/{ => pcbridge}/support/spigot/SpigotTimer.kt (52%) rename {pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core => pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge}/utils/Cancellable.kt (90%) rename {pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core => pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge}/utils/Result.kt (81%) rename {pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core => pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge}/utils/extensions/StringExtensions.kt (83%) delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/repositories/ChatBadgeRepository.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/repositories/CurrencyRepository.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/repositories/PlayerConfigRepository.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/repositories/PlayerGroupRepository.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/repositories/PlayerWarningRepository.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/repositories/ScheduledAnnouncementsRepository.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/repositories/VerificationURLRepository.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/repositories/WarpRepository.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/commandapi/SuspendingExecutors.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/commandapi/ToggleOption.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/modules/ModuleRegisterDSL.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/modules/PluginModule.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/spigot/SpigotLogger.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/spigot/SpigotScheduler.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/spigot/SpigotServer.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/spigot/eventbroadcast/BroadcastableEvent.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/spigot/eventbroadcast/LocalEventBroadcaster.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/spigot/eventbroadcast/SpigotLocalEventBroadcaster.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/spigot/listeners/SpigotListener.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/spigot/listeners/SpigotListenerRegistry.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/textcomponent/ChatMessageReceiver.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/textcomponent/MessageSender.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/textcomponent/SpigotChatReceiver.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/textcomponent/TextComponentBuilder.kt delete mode 100644 pcbridge-spigot/test/com/projectcitybuild/libs/errorreporting/ErrorReporterTest.kt delete mode 100644 pcbridge-spigot/test/com/projectcitybuild/libs/nameguesser/NameGuesserTest.kt delete mode 100644 pcbridge-spigot/test/com/projectcitybuild/modules/announcements/actions/StartAnnouncementTimerTest.kt delete mode 100644 pcbridge-spigot/test/com/projectcitybuild/modules/buildtools/nightvision/commands/NightVisionCommandTest.kt delete mode 100644 pcbridge-spigot/test/com/projectcitybuild/modules/chat/commands/BadgeCommandTest.kt delete mode 100644 pcbridge-spigot/test/com/projectcitybuild/modules/chat/listeners/EmojiChatListenerTest.kt delete mode 100644 pcbridge-spigot/test/com/projectcitybuild/modules/chat/listeners/SyncBadgesOnJoinListenerTest.kt delete mode 100644 pcbridge-spigot/test/com/projectcitybuild/modules/joinmessages/listeners/AnnounceJoinListenerTest.kt delete mode 100644 pcbridge-spigot/test/com/projectcitybuild/modules/joinmessages/listeners/AnnounceQuitListenerTest.kt delete mode 100644 pcbridge-spigot/test/com/projectcitybuild/modules/joinmessages/listeners/FirstTimeJoinListenerTest.kt delete mode 100644 pcbridge-spigot/test/com/projectcitybuild/modules/joinmessages/listeners/ServerOverviewJoinListenerTest.kt delete mode 100644 pcbridge-spigot/test/com/projectcitybuild/modules/moderation/bans/actions/AuthoriseConnectionTest.kt delete mode 100644 pcbridge-spigot/test/com/projectcitybuild/modules/moderation/bans/actions/BanIPTest.kt delete mode 100644 pcbridge-spigot/test/com/projectcitybuild/modules/moderation/bans/actions/BanUUIDTest.kt delete mode 100644 pcbridge-spigot/test/com/projectcitybuild/modules/moderation/bans/actions/CheckBanUUIDTest.kt delete mode 100644 pcbridge-spigot/test/com/projectcitybuild/modules/moderation/bans/actions/UnbanIPTest.kt delete mode 100644 pcbridge-spigot/test/com/projectcitybuild/modules/moderation/bans/actions/UnbanUUIDTest.kt delete mode 100644 pcbridge-spigot/test/com/projectcitybuild/modules/moderation/mute/actions/MutePlayerTest.kt delete mode 100644 pcbridge-spigot/test/com/projectcitybuild/modules/moderation/staffchat/commands/ACommandTest.kt delete mode 100644 pcbridge-spigot/test/com/projectcitybuild/modules/pluginutils/listeners/CheckBanOnConnectListenerTest.kt delete mode 100644 pcbridge-spigot/test/com/projectcitybuild/modules/ranksync/actions/GenerateAccountVerificationURLTest.kt delete mode 100644 pcbridge-spigot/test/com/projectcitybuild/modules/ranksync/actions/SyncPlayerGroupsWithAggregateTest.kt delete mode 100644 pcbridge-spigot/test/com/projectcitybuild/modules/ranksync/actions/UpdatePlayerGroupsTest.kt delete mode 100644 pcbridge-spigot/test/com/projectcitybuild/modules/warps/actions/CreateWarpTest.kt delete mode 100644 pcbridge-spigot/test/com/projectcitybuild/modules/warps/actions/DeleteWarpTest.kt delete mode 100644 pcbridge-spigot/test/com/projectcitybuild/modules/warps/actions/GetWarpListTest.kt delete mode 100644 pcbridge-spigot/test/com/projectcitybuild/modules/warps/actions/TeleportToWarpTest.kt rename pcbridge-spigot/test/com/projectcitybuild/{Mock.kt => pcbridge/Mockito.kt} (83%) rename pcbridge-core/src/test/kotlin/com/projectcitybuild/pcbridge/core/modules/datetime/formatter/DateTimeFormatterImplTest.kt => pcbridge-spigot/test/com/projectcitybuild/pcbridge/datetime/DateTimeFormatterTest.kt (56%) rename {pcbridge-core/src/test/kotlin/com/projectcitybuild/pcbridge/core/modules/datetime/time => pcbridge-spigot/test/com/projectcitybuild/pcbridge/datetime}/LocalizedTimeTest.kt (67%) rename pcbridge-spigot/test/com/projectcitybuild/{utils => pcbridge/features/bans}/SanitizerTest.kt (88%) rename {pcbridge-core/src/test/kotlin/com/projectcitybuild/pcbridge/core/utils/helpers => pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/bans}/ValidIPTest.kt (85%) create mode 100644 pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/bans/actions/AuthoriseConnectionTest.kt create mode 100644 pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/bans/actions/BanIPTest.kt create mode 100644 pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/bans/actions/BanUUIDTest.kt create mode 100644 pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/bans/actions/CheckBanUUIDTest.kt create mode 100644 pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/bans/actions/UnbanIPTest.kt create mode 100644 pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/bans/actions/UnbanUUIDTest.kt create mode 100644 pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/buildtools/nightvision/commands/NightVisionCommandTest.kt create mode 100644 pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/staffchat/commands/ACommandTest.kt rename {pcbridge-core/src/test/kotlin/com/projectcitybuild/pcbridge/core => pcbridge-spigot/test/com/projectcitybuild/pcbridge}/utils/CancellableTest.kt (92%) rename {pcbridge-core/src/test/kotlin/com/projectcitybuild/pcbridge/core => pcbridge-spigot/test/com/projectcitybuild/pcbridge}/utils/extensions/StringExtensionsTest.kt (86%) delete mode 100644 pcbridge-spigot/test/com/projectcitybuild/repositories/ScheduledAnnouncementsRepositoryTest.kt delete mode 100644 pcbridge-spigot/test/com/projectcitybuild/support/spigot/SpigotLoggerTest.kt delete mode 100644 pcbridge-spigot/test/com/projectcitybuild/support/spigot/SpigotSchedulerTest.kt delete mode 100644 pcbridge-spigot/test/com/projectcitybuild/support/spigot/SpigotServerTest.kt delete mode 100644 pcbridge-spigot/test/resources/api_ban_already_banned_response.json delete mode 100644 pcbridge-spigot/test/resources/api_ban_invalid_input_response.json delete mode 100644 pcbridge-spigot/test/resources/api_ban_not_banned_response.json delete mode 100644 pcbridge-spigot/test/resources/api_ban_status_ban_response.json delete mode 100644 pcbridge-spigot/test/resources/api_ban_unban_response.json delete mode 100644 pcbridge-spigot/test/resources/api_no_data_response.json delete mode 100644 pcbridge-web-server/build.gradle.kts delete mode 100644 pcbridge-web-server/src/main/kotlin/com/projectcitybuild/pcbridge/webserver/HttpServer.kt delete mode 100644 pcbridge-web-server/src/main/kotlin/com/projectcitybuild/pcbridge/webserver/HttpServerConfig.kt diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a13676fae..45b488d9d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -14,11 +14,10 @@ jobs: build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - with: - fetch-depth: 0 + - uses: actions/checkout@v4 - - uses: ./.github/actions/setup-java + - name: Install Java + uses: ./.github/actions/setup-java - name: Get version from build.gradle.kts id: plugin_version @@ -52,29 +51,3 @@ jobs: files: pcbridge-spigot/build/release/pcbridge*.jar fail_on_unmatched_files: true generate_release_notes: true - - bump-version: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - with: - fetch-depth: 0 - ref: dev - - - name: Bump minor version - run: gradle incrementVersion - - - name: Get the new version from build.gradle.kts - id: plugin_version - working-directory: pcbridge-spigot - run: | - version="$(gradle properties -q | grep "version:" | awk '{print $2}')" - echo "plugin_version=$version" >> $GITHUB_OUTPUT - - - name: Create Pull Request - uses: peter-evans/create-pull-request@v4.2.4 - with: - branch: bump-version - branch-suffix: short-commit-hash - commit-message: "Bump version to v${{ steps.plugin_version.outputs.plugin_version }}" - title: "Bump version to v${{ steps.plugin_version.outputs.plugin_version }}" diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index d99001b70..619ef8216 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -11,7 +11,7 @@ jobs: linter: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - uses: ./.github/actions/setup-java - name: Check code formatting @@ -20,16 +20,14 @@ jobs: unit-tests: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - with: - fetch-depth: 0 + - uses: actions/checkout@v4 - - uses: ./.github/actions/setup-java + - name: Install Java + uses: ./.github/actions/setup-java - name: Build with Gradle run: gradle shadowJar working-directory: pcbridge-spigot - name: Run tests - run: gradle test --info - working-directory: pcbridge-spigot \ No newline at end of file + run: gradle test --info \ No newline at end of file diff --git a/.gitignore b/.gitignore index 3f874f512..62bc83579 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ .gradle build out +.env \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index 34e6fa198..0a08dd287 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,18 +1,17 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile val sharedGroup = "com.projectcitybuild.pcbridge" -val sharedVersion = "5.1.0" +val sharedVersion = "6.0.0" group = sharedGroup version = sharedVersion plugins { - kotlin("jvm") version "1.6.10" + kotlin("jvm") version "1.9.22" + id("org.jlleitschuh.gradle.ktlint") version "12.1.1" id("org.jetbrains.kotlin.plugin.serialization") version "1.6.10" - id("org.jetbrains.kotlin.kapt") version "1.6.10" - id("org.jlleitschuh.gradle.ktlint") version "10.2.1" - id("org.jlleitschuh.gradle.ktlint-idea") version "10.2.1" + id("co.uzzu.dotenv.gradle") version "4.0.0" } repositories { @@ -24,15 +23,17 @@ subprojects { version = sharedVersion apply(plugin = "org.jetbrains.kotlin.jvm") + apply(plugin = "org.jlleitschuh.gradle.ktlint") + apply(plugin = "org.jetbrains.kotlin.plugin.serialization") dependencies { + // Kotlin implementation(kotlin("stdlib-jdk8")) - - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.0-native-mt") - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.6.0-native-mt") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0") implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.3.2") - testImplementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.0-native-mt") + // Tests + testImplementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:1.8.0") testImplementation("org.junit.jupiter:junit-jupiter-api:5.8.2") testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.8.2") testImplementation("org.mockito.kotlin:mockito-kotlin:5.0.0") @@ -52,7 +53,7 @@ subprojects { tasks.withType { kotlinOptions { - jvmTarget = "11" + jvmTarget = "17" } } diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index e708b1c023ec8b20f512888fe07c5bd3ff77bb8f..e6441136f3d4ba8a0da8d277868979cfbc8ad796 100644 GIT binary patch literal 43453 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 yu?e%!_ptzGB|8GrCfu%p?(_ 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
NnX)EH+Nua)3Y(c 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

K7UpUK$>l@ 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 E2O(~oYXATM diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index ffed3a254..b82aa23a4 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip +networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 1b6c78733..1aa94a426 100755 --- a/gradlew +++ b/gradlew @@ -55,7 +55,7 @@ # 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 +# https://github.com/gradle/gradle/blob/HEAD/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/. @@ -80,13 +80,11 @@ do esac done -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -APP_NAME="Gradle" +# This is normally unused +# shellcheck disable=SC2034 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"' +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -133,22 +131,29 @@ 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. + if ! command -v java >/dev/null 2>&1 + then + 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 fi # Increase the maximum file descriptors if we can. if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac case $MAX_FD in #( '' | soft) :;; #( *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -193,11 +198,15 @@ if "$cygwin" || "$msys" ; then 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. + +# 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"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ @@ -205,6 +214,12 @@ set -- \ org.gradle.wrapper.GradleWrapperMain \ "$@" +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + # Use "xargs" to parse quoted args. # # With -n1 it outputs one arg per line, with the quotes and backslashes removed. diff --git a/gradlew.bat b/gradlew.bat index ac1b06f93..7101f8e46 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -14,7 +14,7 @@ @rem limitations under the License. @rem -@if "%DEBUG%" == "" @echo off +@if "%DEBUG%"=="" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows @@ -25,7 +25,8 @@ if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% @@ -40,13 +41,13 @@ if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute +if %ERRORLEVEL% equ 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. +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail @@ -56,11 +57,11 @@ 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. +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail @@ -75,13 +76,15 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar :end @rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd +if %ERRORLEVEL% equ 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 +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% :mainEnd if "%OS%"=="Windows_NT" endlocal diff --git a/pcbridge-core/build.gradle.kts b/pcbridge-core/build.gradle.kts deleted file mode 100644 index 0d8682c14..000000000 --- a/pcbridge-core/build.gradle.kts +++ /dev/null @@ -1,7 +0,0 @@ -repositories { - mavenCentral() -} - -dependencies { - implementation("com.google.code.gson:gson:2.10.1") -} \ No newline at end of file diff --git a/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/contracts/PlatformLogger.kt b/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/contracts/PlatformLogger.kt deleted file mode 100644 index 558f08f56..000000000 --- a/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/contracts/PlatformLogger.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.projectcitybuild.pcbridge.core.contracts - -interface PlatformLogger { - fun verbose(message: String) - fun debug(message: String) - fun info(message: String) - fun warning(message: String) - fun severe(message: String) -} diff --git a/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/contracts/PlatformScheduler.kt b/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/contracts/PlatformScheduler.kt deleted file mode 100644 index 225b18d23..000000000 --- a/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/contracts/PlatformScheduler.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.projectcitybuild.pcbridge.core.contracts - -import com.projectcitybuild.pcbridge.core.utils.AsyncTask - -interface PlatformScheduler { - - fun async(task: ((T) -> Unit) -> Unit): AsyncTask - fun sync(task: () -> Unit) -} diff --git a/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/contracts/PlatformTimer.kt b/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/contracts/PlatformTimer.kt deleted file mode 100644 index 0824d7718..000000000 --- a/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/contracts/PlatformTimer.kt +++ /dev/null @@ -1,26 +0,0 @@ -package com.projectcitybuild.pcbridge.core.contracts - -import com.projectcitybuild.pcbridge.core.utils.Cancellable -import java.util.concurrent.TimeUnit - -interface PlatformTimer { - - fun scheduleOnce( - identifier: String, - delay: Long, - unit: TimeUnit, - work: () -> Unit - ): Cancellable - - fun scheduleRepeating( - identifier: String, - delay: Long, - repeatingInterval: Long, - unit: TimeUnit, - work: () -> Unit - ): Cancellable - - fun cancel(identifier: String) - - fun cancelAll() -} diff --git a/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/modules/config/Config.kt b/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/modules/config/Config.kt deleted file mode 100644 index 8d5943d88..000000000 --- a/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/modules/config/Config.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.projectcitybuild.pcbridge.core.modules.config - -import com.projectcitybuild.pcbridge.core.storage.JsonStorage - -class Config( - private val default: T, - private val jsonStorage: JsonStorage, -) { - private var cache: T? = null - - fun get(): T { - val cache = cache - if (cache != null) { - return cache - } - return (jsonStorage.read() ?: default) - .also { this.cache = it } - } - - fun flush() { - cache = null - get() - } -} diff --git a/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/modules/datetime/formatter/DateTimeFormatter.kt b/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/modules/datetime/formatter/DateTimeFormatter.kt deleted file mode 100644 index ac2e6c022..000000000 --- a/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/modules/datetime/formatter/DateTimeFormatter.kt +++ /dev/null @@ -1,10 +0,0 @@ -package com.projectcitybuild.pcbridge.core.modules.datetime.formatter - -import java.time.format.FormatStyle - -interface DateTimeFormatter { - fun convert( - timestampInSeconds: Long, - formatStyle: FormatStyle = FormatStyle.MEDIUM, - ): String -} diff --git a/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/modules/datetime/formatter/DateTimeFormatterImpl.kt b/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/modules/datetime/formatter/DateTimeFormatterImpl.kt deleted file mode 100644 index 6c39b1d35..000000000 --- a/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/modules/datetime/formatter/DateTimeFormatterImpl.kt +++ /dev/null @@ -1,36 +0,0 @@ -package com.projectcitybuild.pcbridge.core.modules.datetime.formatter - -import org.jetbrains.annotations.TestOnly -import java.time.Instant -import java.time.ZoneId -import java.time.format.FormatStyle -import java.util.Locale -import java.util.concurrent.TimeUnit - -class DateTimeFormatterImpl( - private val locale: Locale, - private val timezone: ZoneId, -) : DateTimeFormatter { - - override fun convert( - timestampInSeconds: Long, - formatStyle: FormatStyle, - ): String { - val formatter = java.time.format.DateTimeFormatter - .ofLocalizedDateTime(formatStyle) - .withLocale(locale) - - val secondsSince1970 = TimeUnit.SECONDS.toSeconds(timestampInSeconds) - val dateTime = Instant.ofEpochSecond(secondsSince1970).atZone(timezone) - - return dateTime.format(formatter) - } - - companion object { - @TestOnly - fun mock() = DateTimeFormatterImpl( - Locale.forLanguageTag("en-us"), - ZoneId.of("UTC"), - ) - } -} diff --git a/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/modules/datetime/time/LocalizedTime.kt b/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/modules/datetime/time/LocalizedTime.kt deleted file mode 100644 index 3f9ce0161..000000000 --- a/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/modules/datetime/time/LocalizedTime.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.projectcitybuild.pcbridge.core.modules.datetime.time - -import java.time.Clock -import java.time.LocalDateTime - -class LocalizedTime( - private val clock: Clock, -): Time { - override fun now(): LocalDateTime { - return LocalDateTime.now(clock) - } -} diff --git a/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/modules/datetime/time/Time.kt b/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/modules/datetime/time/Time.kt deleted file mode 100644 index 3fed0f189..000000000 --- a/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/modules/datetime/time/Time.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.projectcitybuild.pcbridge.core.modules.datetime.time - -import java.time.LocalDateTime - -interface Time { - fun now(): LocalDateTime -} diff --git a/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/modules/filecache/FileCache.kt b/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/modules/filecache/FileCache.kt deleted file mode 100644 index 9540daebf..000000000 --- a/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/modules/filecache/FileCache.kt +++ /dev/null @@ -1,19 +0,0 @@ -package com.projectcitybuild.pcbridge.core.modules.filecache - -import com.projectcitybuild.pcbridge.core.storage.JsonStorage - -class FileCache( - private val jsonStorage: JsonStorage, -) { - private var cache: T? = null - - fun get(): T? { - return cache - ?: jsonStorage.read().also { cache = it } - } - - fun put(value: T) { - cache = value - jsonStorage.write(value) - } -} \ No newline at end of file diff --git a/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/utils/AsyncTask.kt b/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/utils/AsyncTask.kt deleted file mode 100644 index f36fa8c1b..000000000 --- a/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/utils/AsyncTask.kt +++ /dev/null @@ -1,43 +0,0 @@ -package com.projectcitybuild.pcbridge.core.utils - -import java.util.concurrent.locks.ReentrantLock - -private typealias Resolver = (T) -> Unit -private typealias CompletionHandler = (T) -> Unit - -/** - * Wraps a unit of work to be performed in the future that can be cancelled - */ -class AsyncTask(private val task: (Resolver) -> Cancellable) { - private val lock = ReentrantLock() - - var isExecuting: Boolean = false - private set - - var isCompleted: Boolean = false - private set - - /** - * Listens for the completion of the async task - */ - fun startAndSubscribe(completion: CompletionHandler): Cancellable { - lock.lock() - try { - if (isExecuting) throw Exception("Task has already been started") - - isExecuting = true - return task { taskResult -> - if (isCompleted) throw Exception("Attempted to complete twice") - - isCompleted = true - completion(taskResult) - } - } finally { - lock.unlock() - } - } - - fun start(): Cancellable { - return startAndSubscribe {} - } -} diff --git a/pcbridge-core/src/test/kotlin/com/projectcitybuild/pcbridge/core/modules/config/ConfigTest.kt b/pcbridge-core/src/test/kotlin/com/projectcitybuild/pcbridge/core/modules/config/ConfigTest.kt deleted file mode 100644 index d4fe0a6fd..000000000 --- a/pcbridge-core/src/test/kotlin/com/projectcitybuild/pcbridge/core/modules/config/ConfigTest.kt +++ /dev/null @@ -1,79 +0,0 @@ -package com.projectcitybuild.pcbridge.core.modules.config - -import com.projectcitybuild.pcbridge.core.storage.JsonStorage -import kotlinx.serialization.Serializable -import org.junit.jupiter.api.Assertions.assertEquals -import org.junit.jupiter.api.BeforeEach -import org.junit.jupiter.api.Test -import org.mockito.Mock -import org.mockito.MockitoAnnotations -import org.mockito.kotlin.whenever - -class ConfigTest { - - @Serializable - data class TestConfig( - private val value: String, - ) - - companion object { - val defaultConfig = TestConfig(value = "default") - } - - @Mock - private lateinit var storage: JsonStorage - private lateinit var config: Config - - @BeforeEach - fun setUp() { - MockitoAnnotations.openMocks(this) - - config = Config( - default = defaultConfig, - jsonStorage = storage, - ) - } - - @Test - fun `get() returns value from storage on first call`() { - val expected = TestConfig(value = "uncached") - whenever(storage.read()).thenReturn(expected) - - assertEquals(expected, config.get()) - } - - @Test - fun `get() returns cached value on subsequent calls`() { - val expected = TestConfig(value = "uncached") - whenever(storage.read()).thenReturn(expected) - assertEquals(expected, config.get()) - - val updated = TestConfig(value = "updated") - whenever(storage.read()).thenReturn(updated) - assertEquals(expected, config.get()) - - whenever(storage.read()).thenThrow(Error()) - assertEquals(expected, config.get()) - } - - @Test - fun `get() returns default value if storage returns null`() { - whenever(storage.read()).thenReturn(null) - - assertEquals(defaultConfig, config.get()) - } - - @Test - fun `flush() clears the cache`() { - val expected = TestConfig(value = "uncached") - whenever(storage.read()).thenReturn(expected) - assertEquals(expected, config.get()) - - val updated = TestConfig(value = "updated") - whenever(storage.read()).thenReturn(updated) - assertEquals(expected, config.get()) - - config.flush() - assertEquals(updated, config.get()) - } -} diff --git a/pcbridge-core/src/test/kotlin/com/projectcitybuild/pcbridge/core/storage/JsonStorageTest.kt b/pcbridge-core/src/test/kotlin/com/projectcitybuild/pcbridge/core/storage/JsonStorageTest.kt deleted file mode 100644 index ff60aaf41..000000000 --- a/pcbridge-core/src/test/kotlin/com/projectcitybuild/pcbridge/core/storage/JsonStorageTest.kt +++ /dev/null @@ -1,106 +0,0 @@ -package com.projectcitybuild.pcbridge.core.storage - -import com.google.gson.reflect.TypeToken -import com.projectcitybuild.pcbridge.core.contracts.PlatformLogger -import com.projectcitybuild.pcbridge.core.storage.JsonStorage -import kotlinx.serialization.Serializable -import org.junit.jupiter.api.Assertions.assertEquals -import org.junit.jupiter.api.BeforeEach -import org.junit.jupiter.api.Test -import org.mockito.Mockito.mock -import java.io.File - -class JsonStorageTest { - - @Serializable - data class TestConfig( - private val testString: String, - private val testInt: Int, - private val testFloat: Float, - private val testBoolean: Boolean, - private val testList: List, - private val testObject: NestedObject, - ) - - @Serializable - data class NestedObject( - private val value: String, - ) - - @Serializable - data class StringConfig( - private val string: String, - ) - - companion object { - val testData = TestConfig( - testString = "string", - testInt = 123, - testFloat = 1F, - testBoolean = true, - testList = listOf("1", "2", "3"), - testObject = NestedObject(value = "test") - ) - - val jsonString = "{\"test_string\":\"string\",\"test_int\":123,\"test_float\":1.0,\"test_boolean\":true,\"test_list\":[\"1\",\"2\",\"3\"],\"test_object\":{\"value\":\"test\"}}" - } - - private lateinit var logger: PlatformLogger - - @BeforeEach - fun setUp() { - logger = mock(PlatformLogger::class.java) - } - - @Test - fun `loads json data from a given file`() { - val file = File.createTempFile("test_config", ".json") - file.writeText(jsonString) - - val storage = JsonStorage( - file = file, - logger = logger, - typeToken = object : TypeToken() {} - ) - assertEquals(testData, storage.read()) - } - - @Test - fun `load returns null if error is thrown`() { - val file = File.createTempFile("test_config", ".json") - file.delete() - - val storage = JsonStorage( - file = file, - logger = logger, - typeToken = object : TypeToken() {} - ) - assertEquals(null, storage.read()) - } - - @Test - fun `writes json data to a given file`() { - val file = File.createTempFile("test_config", ".json") - val storage = JsonStorage( - file = file, - logger = logger, - typeToken = object : TypeToken() {} - ) - storage.write(testData) - assertEquals(jsonString, file.readText()) - } - - @Test - fun `can read ASCII characters`() { - val file = File.createTempFile("test_config", ".json") - file.writeText("{\"string\": \"§6test★\"}") - - val storage = JsonStorage( - file = file, - logger = logger, - typeToken = object : TypeToken() {} - ) - val expected = StringConfig(string = "§6test★") - assertEquals(expected, storage.read()) - } -} diff --git a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/HttpService.kt b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/HttpService.kt index 11e589569..a7fe1a203 100644 --- a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/HttpService.kt +++ b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/HttpService.kt @@ -6,25 +6,22 @@ import com.projectcitybuild.pcbridge.http.parsing.ResponseParser import com.projectcitybuild.pcbridge.http.services.mojang.PlayerUUIDHttpService import com.projectcitybuild.pcbridge.http.services.pcb.AccountLinkHTTPService import com.projectcitybuild.pcbridge.http.services.pcb.AggregateHttpService -import com.projectcitybuild.pcbridge.http.services.pcb.CurrencyHttpService import com.projectcitybuild.pcbridge.http.services.pcb.IPBanHttpService import com.projectcitybuild.pcbridge.http.services.pcb.PlayerGroupHttpService import com.projectcitybuild.pcbridge.http.services.pcb.PlayerWarningHttpService import com.projectcitybuild.pcbridge.http.services.pcb.TelemetryHttpService import com.projectcitybuild.pcbridge.http.services.pcb.UUIDBanHttpService -import kotlin.coroutines.CoroutineContext class HttpService( private val authToken: String, private val baseURL: String, private val withLogging: Boolean, - private val contextBuilder: () -> CoroutineContext, ) { private val pcbClient by lazy { PCBClientFactory( authToken = authToken, baseUrl = baseURL, - withLogging = withLogging + withLogging = withLogging, ).build() } @@ -34,9 +31,8 @@ class HttpService( ).build() } - private val responseParser: ResponseParser by lazy { - ResponseParser(contextBuilder) - } + private val responseParser: ResponseParser + get() = ResponseParser() val playerUuid get() = PlayerUUIDHttpService(mojangClient, responseParser) @@ -59,9 +55,6 @@ class HttpService( val telemetry get() = TelemetryHttpService(pcbClient, responseParser) - val currency - get() = CurrencyHttpService(pcbClient, responseParser) - val verificationURL get() = AccountLinkHTTPService(pcbClient, responseParser) -} \ No newline at end of file +} diff --git a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/RetrofitExtensions.kt b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/RetrofitExtensions.kt index 2aad66067..8f9f7181f 100644 --- a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/RetrofitExtensions.kt +++ b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/RetrofitExtensions.kt @@ -6,4 +6,4 @@ import retrofit2.Retrofit internal fun Retrofit.pcb() = create(PCBRequest::class.java) -internal fun Retrofit.mojang() = create(MojangRequest::class.java) \ No newline at end of file +internal fun Retrofit.mojang() = create(MojangRequest::class.java) diff --git a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/clients/PCBClientFactory.kt b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/clients/PCBClientFactory.kt index 68ad200fb..810e9c27c 100644 --- a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/clients/PCBClientFactory.kt +++ b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/clients/PCBClientFactory.kt @@ -8,7 +8,7 @@ import retrofit2.converter.gson.GsonConverterFactory internal class PCBClientFactory( private val authToken: String, private val baseUrl: String, - private val withLogging: Boolean + private val withLogging: Boolean, ) { fun build(): Retrofit { val authenticatedClient = makeAuthenticatedClient() @@ -20,15 +20,16 @@ internal class PCBClientFactory( } private fun makeAuthenticatedClient(): OkHttpClient { - var clientFactory = OkHttpClient().newBuilder() - .addInterceptor { chain -> - // Add access token as header to each API request - val request = chain.request() - val requestBuilder = request.newBuilder().header("Authorization", "Bearer $authToken") - val nextRequest = requestBuilder.build() + var clientFactory = + OkHttpClient().newBuilder() + .addInterceptor { chain -> + // Add access token as header to each API request + val request = chain.request() + val requestBuilder = request.newBuilder().header("Authorization", "Bearer $authToken") + val nextRequest = requestBuilder.build() - chain.proceed(nextRequest) - } + chain.proceed(nextRequest) + } if (withLogging) { val loggingInterceptor = HttpLoggingInterceptor() diff --git a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/parsing/ApiError.kt b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/parsing/ApiError.kt index f74940bbc..a3e2206ed 100644 --- a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/parsing/ApiError.kt +++ b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/parsing/ApiError.kt @@ -4,5 +4,5 @@ data class ApiError( val id: String, val title: String, val detail: String, - var status: Int + var status: Int, ) diff --git a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/parsing/ApiResponse.kt b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/parsing/ApiResponse.kt index 6f95988f9..db72b8530 100644 --- a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/parsing/ApiResponse.kt +++ b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/parsing/ApiResponse.kt @@ -2,5 +2,5 @@ package com.projectcitybuild.pcbridge.http.parsing data class ApiResponse( val data: T?, - val error: ApiError? + val error: ApiError?, ) diff --git a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/parsing/ResponseParser.kt b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/parsing/ResponseParser.kt index b8a9797c8..e7a4874f1 100644 --- a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/parsing/ResponseParser.kt +++ b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/parsing/ResponseParser.kt @@ -1,27 +1,28 @@ package com.projectcitybuild.pcbridge.http.parsing import com.google.gson.Gson +import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import retrofit2.HttpException import java.io.IOException -import kotlin.coroutines.CoroutineContext -class ResponseParser( - private val getCoroutineContext: () -> CoroutineContext -) { +class ResponseParser { data class ErrorBody(val error: ApiError) class HTTPError(val errorBody: ApiError?) : Exception( - if (errorBody != null) "Bad response received from the server: ${errorBody.detail}" - else "Bad response received from the server (no error given)" + if (errorBody != null) { + "Bad response received from the server: ${errorBody.detail}" + } else { + "Bad response received from the server (no error given)" + }, ) class NetworkError : Exception( - "Failed to contact PCB auth server" + "Failed to contact PCB auth server", ) - suspend fun parse(apiCall: suspend () -> T): T { - return withContext(getCoroutineContext()) { + suspend fun parse(apiCall: suspend () -> T): T = + withContext(Dispatchers.IO) { try { apiCall.invoke() } catch (_: IOException) { @@ -33,9 +34,11 @@ class ResponseParser( throw e } } - } - private fun convertErrorBody(e: HttpException, code: Int): ApiError? { + private fun convertErrorBody( + e: HttpException, + code: Int, + ): ApiError? { e.response()?.errorBody()?.string().let { val errorBody = Gson().fromJson(it, ErrorBody::class.java).error errorBody.status = code diff --git a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/requests/MojangRequest.kt b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/requests/MojangRequest.kt index df92b20be..7c8d7e416 100644 --- a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/requests/MojangRequest.kt +++ b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/requests/MojangRequest.kt @@ -6,10 +6,9 @@ import retrofit2.http.Path import retrofit2.http.Query internal interface MojangRequest { - @GET("users/profiles/minecraft/{username}") suspend fun getMojangPlayer( @Path("username") playerName: String, - @Query("at") timestamp: Long? = null + @Query("at") timestamp: Long? = null, ): MojangPlayer? } diff --git a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/requests/PCBRequest.kt b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/requests/PCBRequest.kt index 383a4ad46..6d8cd9d84 100644 --- a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/requests/PCBRequest.kt +++ b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/requests/PCBRequest.kt @@ -1,9 +1,8 @@ package com.projectcitybuild.pcbridge.http.requests +import com.projectcitybuild.pcbridge.http.parsing.ApiResponse import com.projectcitybuild.pcbridge.http.responses.Account -import com.projectcitybuild.pcbridge.http.responses.AccountBalance import com.projectcitybuild.pcbridge.http.responses.Aggregate -import com.projectcitybuild.pcbridge.http.parsing.ApiResponse import com.projectcitybuild.pcbridge.http.responses.AuthURL import com.projectcitybuild.pcbridge.http.responses.DonationPerk import com.projectcitybuild.pcbridge.http.responses.IPBan @@ -24,7 +23,7 @@ internal interface PCBRequest { @POST("auth/minecraft") @FormUrlEncoded suspend fun getVerificationUrl( - @Field("minecraft_uuid") uuid: String + @Field("minecraft_uuid") uuid: String, ): ApiResponse /** @@ -32,7 +31,7 @@ internal interface PCBRequest { */ @GET("auth/minecraft/{uuid}") suspend fun getUserGroups( - @Path(value = "uuid") uuid: String + @Path(value = "uuid") uuid: String, ): ApiResponse /** @@ -46,26 +45,10 @@ internal interface PCBRequest { @Query("ip") ip: String, ): ApiResponse - @GET("v2/minecraft/{uuid}/donation-tiers") suspend fun getDonationTier( - @Path(value = "uuid") uuid: String - ): ApiResponse> - - - @GET("v2/minecraft/{uuid}/balance") - suspend fun getBalance( - @Path(value = "uuid") uuid: String, - ): ApiResponse - - @POST("v2/minecraft/{uuid}/balance/deduct") - @FormUrlEncoded - suspend fun deductFromBalance( @Path(value = "uuid") uuid: String, - @Field("amount") amount: Int, - @Field("reason") reason: String, - ): ApiResponse - + ): ApiResponse> @POST("v2/bans/ip/ban") @FormUrlEncoded @@ -92,7 +75,6 @@ internal interface PCBRequest { @Field("ip_address") ip: String, ): ApiResponse - @POST("v2/bans/player/ban") @FormUrlEncoded suspend fun banUUID( @@ -106,28 +88,27 @@ internal interface PCBRequest { @Field("expires_at") expiresAt: Long?, ): ApiResponse - @POST("v2/bans/player/unban") @FormUrlEncoded suspend fun unbanUUID( @Field("banned_player_id") bannedPlayerId: String, @Field("banned_player_type") bannedPlayerType: String = "minecraft_uuid", @Field("unbanner_player_id") unbannerPlayerId: String?, - @Field("unbanner_player_type") unbannerPlayerType: String = "minecraft_uuid" + @Field("unbanner_player_type") unbannerPlayerType: String = "minecraft_uuid", ): ApiResponse @POST("v2/bans/player/status") @FormUrlEncoded suspend fun getUuidBanStatus( @Field("player_id") playerId: String, - @Field("player_type") playerType: String = "minecraft_uuid" + @Field("player_type") playerType: String = "minecraft_uuid", ): ApiResponse @POST("v2/bans/player/all") @FormUrlEncoded suspend fun getUUIDBans( @Field("player_id") playerId: String, - @Field("player_id_type") playerType: String = "minecraft_uuid" + @Field("player_id_type") playerType: String = "minecraft_uuid", ): ApiResponse> @POST("v2/bans/player/ban") @@ -140,7 +121,6 @@ internal interface PCBRequest { @Field("reason") reason: String? = null, ): ApiResponse - @GET("v2/warnings") suspend fun getWarnings( @Query("player_id") playerId: String, @@ -167,7 +147,6 @@ internal interface PCBRequest { @Field("warning_id") warningId: Int, ): ApiResponse - @POST("v2/minecraft/telemetry/seen") @FormUrlEncoded suspend fun telemetrySeen( diff --git a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/Account.kt b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/Account.kt index 56e75d29c..2803f4723 100644 --- a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/Account.kt +++ b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/Account.kt @@ -4,7 +4,10 @@ import com.google.gson.annotations.SerializedName import java.util.UUID data class Account( - @SerializedName("account_id") val id: String = UUID.randomUUID().toString(), - @SerializedName("username") val username: String = "username", - @SerializedName("groups") val groups: List = listOf(), + @SerializedName("account_id") + val id: String = UUID.randomUUID().toString(), + @SerializedName("username") + val username: String = "username", + @SerializedName("groups") + val groups: List = listOf(), ) diff --git a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/AccountBalance.kt b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/AccountBalance.kt deleted file mode 100644 index 328d42290..000000000 --- a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/AccountBalance.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.projectcitybuild.pcbridge.http.responses - -import com.google.gson.annotations.SerializedName - -data class AccountBalance( - @SerializedName("balance") val balance: Int, -) diff --git a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/Aggregate.kt b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/Aggregate.kt index 86256a178..5e760bca3 100644 --- a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/Aggregate.kt +++ b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/Aggregate.kt @@ -3,9 +3,14 @@ package com.projectcitybuild.pcbridge.http.responses import com.google.gson.annotations.SerializedName data class Aggregate( - @SerializedName("account") val account: Account? = null, - @SerializedName("ban") val playerBan: PlayerBan? = null, - @SerializedName("ip_ban") val ipBan: IPBan? = null, - @SerializedName("badges") val badges: List = emptyList(), - @SerializedName("donation_tiers") val donationPerks: List = emptyList(), + @SerializedName("account") + val account: Account? = null, + @SerializedName("ban") + val playerBan: PlayerBan? = null, + @SerializedName("ip_ban") + val ipBan: IPBan? = null, + @SerializedName("badges") + val badges: List = emptyList(), + @SerializedName("donation_tiers") + val donationPerks: List = emptyList(), ) diff --git a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/AuthURL.kt b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/AuthURL.kt index 08772bb6d..ee517202f 100644 --- a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/AuthURL.kt +++ b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/AuthURL.kt @@ -3,5 +3,6 @@ package com.projectcitybuild.pcbridge.http.responses import com.google.gson.annotations.SerializedName data class AuthURL( - @SerializedName("url") val url: String + @SerializedName("url") + val url: String, ) diff --git a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/Badge.kt b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/Badge.kt index 037c0be57..ba5d0db6d 100644 --- a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/Badge.kt +++ b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/Badge.kt @@ -1,8 +1,12 @@ package com.projectcitybuild.pcbridge.http.responses import com.google.gson.annotations.SerializedName +import kotlinx.serialization.Serializable +@Serializable data class Badge( - @SerializedName("display_name") val displayName: String = "display_name", - @SerializedName("unicode_icon") val unicodeIcon: String = "✦", + @SerializedName("display_name") + val displayName: String = "display_name", + @SerializedName("unicode_icon") + val unicodeIcon: String = "✦", ) diff --git a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/DonationPerk.kt b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/DonationPerk.kt index a3063ba52..616f8261e 100644 --- a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/DonationPerk.kt +++ b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/DonationPerk.kt @@ -5,11 +5,16 @@ import java.time.LocalDate import java.time.ZoneId data class DonationPerk( - @SerializedName("donation_perks_id") val id: Int = Math.random().toInt(), - @SerializedName("is_active") val isActive: Boolean = true, - @SerializedName("expires_at") val expiresAt: Long = LocalDate.now() - .plusMonths(1) - .atStartOfDay(ZoneId.systemDefault()) - .toEpochSecond(), - @SerializedName("donation_tier") val donationTier: DonationTier + @SerializedName("donation_perks_id") + val id: Int = Math.random().toInt(), + @SerializedName("is_active") + val isActive: Boolean = true, + @SerializedName("expires_at") + val expiresAt: Long = + LocalDate.now() + .plusMonths(1) + .atStartOfDay(ZoneId.systemDefault()) + .toEpochSecond(), + @SerializedName("donation_tier") + val donationTier: DonationTier, ) diff --git a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/DonationTier.kt b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/DonationTier.kt index cf4ac708b..83383d430 100644 --- a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/DonationTier.kt +++ b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/DonationTier.kt @@ -3,6 +3,8 @@ package com.projectcitybuild.pcbridge.http.responses import com.google.gson.annotations.SerializedName data class DonationTier( - @SerializedName("donation_tier_id") val id: Int = Math.random().toInt(), - @SerializedName("name") val name: String = "name" + @SerializedName("donation_tier_id") + val id: Int = Math.random().toInt(), + @SerializedName("name") + val name: String = "name", ) diff --git a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/Group.kt b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/Group.kt index caacfaee7..5092ffba8 100644 --- a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/Group.kt +++ b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/Group.kt @@ -3,11 +3,18 @@ package com.projectcitybuild.pcbridge.http.responses import com.google.gson.annotations.SerializedName data class Group( - @SerializedName("group_id") val id: Int = Math.random().toInt(), - @SerializedName("name") val name: String = "name", - @SerializedName("alias") val alias: String? = null, - @SerializedName("minecraft_name") val minecraftName: String?, - @SerializedName("is_default") private val _isDefault: Boolean = false, - @SerializedName("is_staff") private val _isStaff: Boolean = false, - @SerializedName("is_admin") private val _isAdmin: Boolean = false + @SerializedName("group_id") + val id: Int = Math.random().toInt(), + @SerializedName("name") + val name: String = "name", + @SerializedName("alias") + val alias: String? = null, + @SerializedName("minecraft_name") + val minecraftName: String?, + @SerializedName("is_default") + private val _isDefault: Boolean = false, + @SerializedName("is_staff") + private val _isStaff: Boolean = false, + @SerializedName("is_admin") + private val _isAdmin: Boolean = false, ) diff --git a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/IPBan.kt b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/IPBan.kt index 19384c6eb..d21137d57 100644 --- a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/IPBan.kt +++ b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/IPBan.kt @@ -6,14 +6,28 @@ import java.time.ZoneId import java.util.UUID data class IPBan( - @SerializedName("id") val id: Int = Math.random().toInt(), - @SerializedName("banner_player_id") val bannerPlayerId: String = UUID.randomUUID().toString(), - @SerializedName("reason") val reason: String = "reason", - @SerializedName("created_at") val createdAt: Long = LocalDate.now().atStartOfDay(ZoneId.systemDefault()).toEpochSecond(), - @SerializedName("updated_at") val updatedAt: Long = LocalDate.now().atStartOfDay(ZoneId.systemDefault()).toEpochSecond(), - @SerializedName("unbanned_at") val unbannedAt: Long? = null, - @SerializedName("unbanner_player_id") val unbannerPlayerId: String? = null, - @SerializedName("unban_type") val unbanType: String? = null, + @SerializedName("id") + val id: Int = Math.random().toInt(), + @SerializedName("banner_player_id") + val bannerPlayerId: String = UUID.randomUUID().toString(), + @SerializedName("reason") + val reason: String = "reason", + @SerializedName("created_at") + val createdAt: Long = + LocalDate.now() + .atStartOfDay(ZoneId.systemDefault()) + .toEpochSecond(), + @SerializedName("updated_at") + val updatedAt: Long = + LocalDate.now() + .atStartOfDay(ZoneId.systemDefault()) + .toEpochSecond(), + @SerializedName("unbanned_at") + val unbannedAt: Long? = null, + @SerializedName("unbanner_player_id") + val unbannerPlayerId: String? = null, + @SerializedName("unban_type") + val unbanType: String? = null, ) { val isActive: Boolean get() = unbannedAt == null diff --git a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/MojangPlayer.kt b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/MojangPlayer.kt index 3f3e6d058..2980df9af 100644 --- a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/MojangPlayer.kt +++ b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/MojangPlayer.kt @@ -3,6 +3,8 @@ package com.projectcitybuild.pcbridge.http.responses import com.google.gson.annotations.SerializedName data class MojangPlayer( - @SerializedName("id") val uuid: String, - @SerializedName("name") val alias: String + @SerializedName("id") + val uuid: String, + @SerializedName("name") + val alias: String, ) diff --git a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/PlayerBan.kt b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/PlayerBan.kt index d4beec2f7..dea63e627 100644 --- a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/PlayerBan.kt +++ b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/PlayerBan.kt @@ -6,18 +6,36 @@ import java.time.ZoneId import java.util.UUID data class PlayerBan( - @SerializedName("id") val id: Int = Math.random().toInt(), - @SerializedName("server_id") val serverId: Int = Math.random().toInt(), - @SerializedName("banned_player_id") val bannedPlayerId: String = UUID.randomUUID().toString(), - @SerializedName("banned_player_alias") val bannedPlayerAlias: String = "name", - @SerializedName("banner_player_id") val bannerPlayerId: String? = UUID.randomUUID().toString(), - @SerializedName("reason") val reason: String? = "reason", - @SerializedName("created_at") val createdAt: Long = LocalDate.now().atStartOfDay(ZoneId.systemDefault()).toEpochSecond(), - @SerializedName("updated_at") val updatedAt: Long = LocalDate.now().atStartOfDay(ZoneId.systemDefault()).toEpochSecond(), - @SerializedName("expires_at") val expiresAt: Long? = null, - @SerializedName("unbanned_at") var unbannedAt: Long? = null, - @SerializedName("unbanner_player_id") var unbannerPlayerId: String? = null, - @SerializedName("unban_type") var unbanType: String? = null, + @SerializedName("id") + val id: Int = Math.random().toInt(), + @SerializedName("server_id") + val serverId: Int = Math.random().toInt(), + @SerializedName("banned_player_id") + val bannedPlayerId: String = UUID.randomUUID().toString(), + @SerializedName("banned_player_alias") + val bannedPlayerAlias: String = "name", + @SerializedName("banner_player_id") + val bannerPlayerId: String? = UUID.randomUUID().toString(), + @SerializedName("reason") + val reason: String? = "reason", + @SerializedName("created_at") + val createdAt: Long = + LocalDate.now() + .atStartOfDay(ZoneId.systemDefault()) + .toEpochSecond(), + @SerializedName("updated_at") + val updatedAt: Long = + LocalDate.now() + .atStartOfDay(ZoneId.systemDefault()) + .toEpochSecond(), + @SerializedName("expires_at") + val expiresAt: Long? = null, + @SerializedName("unbanned_at") + var unbannedAt: Long? = null, + @SerializedName("unbanner_player_id") + var unbannerPlayerId: String? = null, + @SerializedName("unban_type") + var unbanType: String? = null, ) { val isActive: Boolean get() = unbannedAt == null diff --git a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/PlayerWarning.kt b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/PlayerWarning.kt index 61527232a..8c04d50ca 100644 --- a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/PlayerWarning.kt +++ b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/PlayerWarning.kt @@ -3,14 +3,24 @@ package com.projectcitybuild.pcbridge.http.responses import com.google.gson.annotations.SerializedName data class PlayerWarning( - @SerializedName("id") val id: Int, - @SerializedName("warned_player_id") val warnedPlayerId: String, - @SerializedName("warner_player_id") val warnerPlayerId: String, - @SerializedName("reason") val reason: String, - @SerializedName("additional_info") val additionalInfo: String?, - @SerializedName("weight") val weight: Int, - @SerializedName("is_acknowledged") val isAcknowledged: Boolean, - @SerializedName("created_at") val createdAt: Long, - @SerializedName("updated_at") val updatedAt: Long, - @SerializedName("acknowledged_at") val acknowledgedAt: Long?, + @SerializedName("id") + val id: Int, + @SerializedName("warned_player_id") + val warnedPlayerId: String, + @SerializedName("warner_player_id") + val warnerPlayerId: String, + @SerializedName("reason") + val reason: String, + @SerializedName("additional_info") + val additionalInfo: String?, + @SerializedName("weight") + val weight: Int, + @SerializedName("is_acknowledged") + val isAcknowledged: Boolean, + @SerializedName("created_at") + val createdAt: Long, + @SerializedName("updated_at") + val updatedAt: Long, + @SerializedName("acknowledged_at") + val acknowledgedAt: Long?, ) diff --git a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/services/mojang/PlayerUUIDHttpService.kt b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/services/mojang/PlayerUUIDHttpService.kt index 3876e78f9..665552065 100644 --- a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/services/mojang/PlayerUUIDHttpService.kt +++ b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/services/mojang/PlayerUUIDHttpService.kt @@ -3,6 +3,8 @@ package com.projectcitybuild.pcbridge.http.services.mojang import com.projectcitybuild.pcbridge.http.mojang import com.projectcitybuild.pcbridge.http.parsing.ResponseParser import com.projectcitybuild.pcbridge.http.responses.MojangPlayer +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext import retrofit2.Retrofit class PlayerUUIDHttpService( @@ -11,14 +13,18 @@ class PlayerUUIDHttpService( ) { class PlayerNotFoundException : Exception() - suspend fun get(playerName: String, at: Long? = null): MojangPlayer? { - return responseParser.parse { - try { - retrofit.mojang().getMojangPlayer(playerName) - } catch (e: KotlinNullPointerException) { - // Hacky workaround to catch 204 HTTP errors (username not found) - throw PlayerNotFoundException() + suspend fun get( + playerName: String, + at: Long? = null, + ): MojangPlayer? = + withContext(Dispatchers.IO) { + responseParser.parse { + try { + retrofit.mojang().getMojangPlayer(playerName) + } catch (e: KotlinNullPointerException) { + // Hacky workaround to catch 204 HTTP errors (username not found) + throw PlayerNotFoundException() + } } } - } -} \ No newline at end of file +} diff --git a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/services/pcb/AccountLinkHTTPService.kt b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/services/pcb/AccountLinkHTTPService.kt index bc385026f..59d3d52c8 100644 --- a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/services/pcb/AccountLinkHTTPService.kt +++ b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/services/pcb/AccountLinkHTTPService.kt @@ -2,6 +2,8 @@ package com.projectcitybuild.pcbridge.http.services.pcb import com.projectcitybuild.pcbridge.http.parsing.ResponseParser import com.projectcitybuild.pcbridge.http.pcb +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext import retrofit2.Retrofit import java.util.UUID import kotlin.jvm.Throws @@ -10,26 +12,28 @@ class AccountLinkHTTPService( private val retrofit: Retrofit, private val responseParser: ResponseParser, ) { - class AlreadyLinkedException: Exception() + class AlreadyLinkedException : Exception() @Throws(AlreadyLinkedException::class) - suspend fun generateVerificationURL(playerUUID: UUID): String? { - try { - val response = responseParser.parse { - retrofit.pcb().getVerificationUrl(uuid = playerUUID.toString()) - } - val data = response.data + suspend fun generateVerificationURL(playerUUID: UUID): String? = + withContext(Dispatchers.IO) { + try { + val response = + responseParser.parse { + retrofit.pcb().getVerificationUrl(uuid = playerUUID.toString()) + } + val data = response.data - return if (data == null || data.url.isEmpty()) { - null - } else { - data.url - } - } catch (e: ResponseParser.HTTPError) { - if (e.errorBody?.id == "already_authenticated") { - throw AlreadyLinkedException() + if (data == null || data.url.isEmpty()) { + null + } else { + data.url + } + } catch (e: ResponseParser.HTTPError) { + if (e.errorBody?.id == "already_authenticated") { + throw AlreadyLinkedException() + } + throw e } - throw e } - } -} \ No newline at end of file +} diff --git a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/services/pcb/AggregateHttpService.kt b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/services/pcb/AggregateHttpService.kt index c7f3944ff..59928f48b 100644 --- a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/services/pcb/AggregateHttpService.kt +++ b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/services/pcb/AggregateHttpService.kt @@ -3,6 +3,8 @@ package com.projectcitybuild.pcbridge.http.services.pcb import com.projectcitybuild.pcbridge.http.parsing.ResponseParser import com.projectcitybuild.pcbridge.http.pcb import com.projectcitybuild.pcbridge.http.responses.Aggregate +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext import retrofit2.Retrofit import java.util.UUID @@ -10,13 +12,18 @@ class AggregateHttpService( private val retrofit: Retrofit, private val responseParser: ResponseParser, ) { - suspend fun get(playerUUID: UUID, ip: String): Aggregate? { - val response = responseParser.parse { - retrofit.pcb().getAggregate( - uuid = playerUUID.toString(), - ip = ip, - ) + suspend fun get( + playerUUID: UUID, + ip: String, + ): Aggregate? = + withContext(Dispatchers.IO) { + val response = + responseParser.parse { + retrofit.pcb().getAggregate( + uuid = playerUUID.toString(), + ip = ip, + ) + } + response.data } - return response.data - } -} \ No newline at end of file +} diff --git a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/services/pcb/CurrencyHttpService.kt b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/services/pcb/CurrencyHttpService.kt deleted file mode 100644 index 13b024136..000000000 --- a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/services/pcb/CurrencyHttpService.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.projectcitybuild.pcbridge.http.services.pcb - -import com.projectcitybuild.pcbridge.http.parsing.ResponseParser -import com.projectcitybuild.pcbridge.http.pcb -import com.projectcitybuild.pcbridge.http.responses.AccountBalance -import retrofit2.Retrofit -import java.util.UUID - -class CurrencyHttpService( - private val retrofit: Retrofit, - private val responseParser: ResponseParser, -) { - suspend fun get(playerUUID: UUID): AccountBalance? { - val response = responseParser.parse { - retrofit.pcb().getBalance( - uuid = playerUUID.toString(), - ) - } - return response.data - } - - suspend fun deduct(playerUUID: UUID, amount: Int, reason: String) { - responseParser.parse { - retrofit.pcb().deductFromBalance( - uuid = playerUUID.toString(), - amount = amount, - reason = reason, - ) - } - } -} \ No newline at end of file diff --git a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/services/pcb/IPBanHttpService.kt b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/services/pcb/IPBanHttpService.kt index dadd426c2..e820fd3fc 100644 --- a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/services/pcb/IPBanHttpService.kt +++ b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/services/pcb/IPBanHttpService.kt @@ -3,6 +3,8 @@ package com.projectcitybuild.pcbridge.http.services.pcb import com.projectcitybuild.pcbridge.http.parsing.ResponseParser import com.projectcitybuild.pcbridge.http.pcb import com.projectcitybuild.pcbridge.http.responses.IPBan +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext import retrofit2.Retrofit import java.util.UUID @@ -11,22 +13,24 @@ class IPBanHttpService( private val responseParser: ResponseParser, ) { class IPAlreadyBannedException : Exception() + class IPNotBannedException : Exception() suspend fun get(ip: String): IPBan? { - val response = responseParser.parse { - retrofit.pcb().getIPStatus(ip = ip) - } + val response = + responseParser.parse { + retrofit.pcb().getIPStatus(ip = ip) + } return response.data } @Throws(IPAlreadyBannedException::class) suspend fun ban( ip: String, - bannerUUID: UUID, + bannerUUID: UUID?, bannerName: String, reason: String, - ) { + ) = withContext(Dispatchers.IO) { try { responseParser.parse { retrofit.pcb().banIP( @@ -47,9 +51,9 @@ class IPBanHttpService( @Throws(IPNotBannedException::class) suspend fun unban( ip: String, - unbannerUUID: UUID, + unbannerUUID: UUID?, unbannerName: String, - ) { + ) = withContext(Dispatchers.IO) { try { responseParser.parse { retrofit.pcb().unbanIP( @@ -65,4 +69,4 @@ class IPBanHttpService( throw e } } -} \ No newline at end of file +} diff --git a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/services/pcb/PlayerGroupHttpService.kt b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/services/pcb/PlayerGroupHttpService.kt index 27224b3b0..637c30287 100644 --- a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/services/pcb/PlayerGroupHttpService.kt +++ b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/services/pcb/PlayerGroupHttpService.kt @@ -4,6 +4,8 @@ import com.projectcitybuild.pcbridge.http.parsing.ResponseParser import com.projectcitybuild.pcbridge.http.pcb import com.projectcitybuild.pcbridge.http.responses.DonationPerk import com.projectcitybuild.pcbridge.http.responses.Group +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext import retrofit2.Retrofit import java.util.UUID @@ -14,37 +16,40 @@ class PlayerGroupHttpService( class NoLinkedAccountException : Exception() @Throws(NoLinkedAccountException::class) - suspend fun getGroups(playerUUID: UUID): List { - val response = try { - responseParser.parse { - retrofit.pcb().getUserGroups( - uuid = playerUUID.toString(), - ) - } - } catch (e: ResponseParser.HTTPError) { - if (e.errorBody?.id == "account_not_linked") { - throw NoLinkedAccountException() - } - throw e + suspend fun getGroups(playerUUID: UUID): List = + withContext(Dispatchers.IO) { + val response = + try { + responseParser.parse { + retrofit.pcb().getUserGroups( + uuid = playerUUID.toString(), + ) + } + } catch (e: ResponseParser.HTTPError) { + if (e.errorBody?.id == "account_not_linked") { + throw NoLinkedAccountException() + } + throw e + } + response.data?.groups ?: listOf() } - return response.data?.groups ?: listOf() - } - @Throws(NoLinkedAccountException::class) - suspend fun getDonorPerks(playerUUID: UUID): List { - val response = try { - responseParser.parse { - retrofit.pcb().getDonationTier( - uuid = playerUUID.toString(), - ) - } - } catch (e: ResponseParser.HTTPError) { - if (e.errorBody?.id == "account_not_linked") { - throw NoLinkedAccountException() - } - throw e + suspend fun getDonorPerks(playerUUID: UUID): List = + withContext(Dispatchers.IO) { + val response = + try { + responseParser.parse { + retrofit.pcb().getDonationTier( + uuid = playerUUID.toString(), + ) + } + } catch (e: ResponseParser.HTTPError) { + if (e.errorBody?.id == "account_not_linked") { + throw NoLinkedAccountException() + } + throw e + } + response.data?.toList() ?: listOf() } - return response.data?.toList() ?: listOf() - } -} \ No newline at end of file +} diff --git a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/services/pcb/PlayerWarningHttpService.kt b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/services/pcb/PlayerWarningHttpService.kt index 0b32e4192..13e6f3cfc 100644 --- a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/services/pcb/PlayerWarningHttpService.kt +++ b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/services/pcb/PlayerWarningHttpService.kt @@ -3,6 +3,8 @@ package com.projectcitybuild.pcbridge.http.services.pcb import com.projectcitybuild.pcbridge.http.parsing.ResponseParser import com.projectcitybuild.pcbridge.http.pcb import com.projectcitybuild.pcbridge.http.responses.PlayerWarning +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext import retrofit2.Retrofit import java.util.UUID @@ -12,16 +14,18 @@ class PlayerWarningHttpService( ) { suspend fun get( playerUUID: UUID, - playerName: String - ): List { - val response = responseParser.parse { - retrofit.pcb().getWarnings( - playerId = playerUUID.toString(), - playerAlias = playerName, - ) + playerName: String, + ): List = + withContext(Dispatchers.IO) { + val response = + responseParser.parse { + retrofit.pcb().getWarnings( + playerId = playerUUID.toString(), + playerAlias = playerName, + ) + } + response.data ?: listOf() } - return response.data ?: listOf() - } suspend fun create( warnedPlayerUUID: UUID, @@ -29,25 +33,29 @@ class PlayerWarningHttpService( warnerPlayerUUID: UUID, warnerPlayerName: String, reason: String, - ): PlayerWarning? { - val response = responseParser.parse { - retrofit.pcb().createWarning( - warnedPlayerId = warnedPlayerUUID.toString(), - warnedPlayerAlias = warnedPlayerName, - warnerPlayerId = warnerPlayerUUID.toString(), - warnerPlayerAlias = warnerPlayerName, - reason = reason, - ) + ): PlayerWarning? = + withContext(Dispatchers.IO) { + val response = + responseParser.parse { + retrofit.pcb().createWarning( + warnedPlayerId = warnedPlayerUUID.toString(), + warnedPlayerAlias = warnedPlayerName, + warnerPlayerId = warnerPlayerUUID.toString(), + warnerPlayerAlias = warnerPlayerName, + reason = reason, + ) + } + response.data } - return response.data - } - suspend fun acknowledge(warningId: Int): PlayerWarning? { - val response = responseParser.parse { - retrofit.pcb().acknowledgeWarning( - warningId = warningId, - ) + suspend fun acknowledge(warningId: Int): PlayerWarning? = + withContext(Dispatchers.IO) { + val response = + responseParser.parse { + retrofit.pcb().acknowledgeWarning( + warningId = warningId, + ) + } + response.data } - return response.data - } -} \ No newline at end of file +} diff --git a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/services/pcb/TelemetryHttpService.kt b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/services/pcb/TelemetryHttpService.kt index 15f59701e..94ef720f5 100644 --- a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/services/pcb/TelemetryHttpService.kt +++ b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/services/pcb/TelemetryHttpService.kt @@ -2,6 +2,8 @@ package com.projectcitybuild.pcbridge.http.services.pcb import com.projectcitybuild.pcbridge.http.parsing.ResponseParser import com.projectcitybuild.pcbridge.http.pcb +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext import retrofit2.Retrofit import java.util.UUID @@ -9,7 +11,10 @@ class TelemetryHttpService( private val retrofit: Retrofit, private val responseParser: ResponseParser, ) { - suspend fun playerSeen(playerUUID: UUID, playerName: String) { + suspend fun playerSeen( + playerUUID: UUID, + playerName: String, + ) = withContext(Dispatchers.IO) { responseParser.parse { retrofit.pcb().telemetrySeen( playerUUID = playerUUID.toString(), @@ -17,4 +22,4 @@ class TelemetryHttpService( ) } } -} \ No newline at end of file +} diff --git a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/services/pcb/UUIDBanHttpService.kt b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/services/pcb/UUIDBanHttpService.kt index e7aa0f96c..e27c745c7 100644 --- a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/services/pcb/UUIDBanHttpService.kt +++ b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/services/pcb/UUIDBanHttpService.kt @@ -3,6 +3,8 @@ package com.projectcitybuild.pcbridge.http.services.pcb import com.projectcitybuild.pcbridge.http.parsing.ResponseParser import com.projectcitybuild.pcbridge.http.pcb import com.projectcitybuild.pcbridge.http.responses.PlayerBan +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext import retrofit2.Retrofit import java.util.UUID @@ -11,20 +13,23 @@ class UUIDBanHttpService( private val responseParser: ResponseParser, ) { class UUIDAlreadyBannedException : Exception() + class UUIDNotBannedException : Exception() - suspend fun get(targetPlayerUUID: UUID): PlayerBan? { - val response = responseParser.parse { - retrofit.pcb().getUuidBanStatus( - playerId = targetPlayerUUID.toString(), - ) - } - val ban = response.data - if (ban?.unbannedAt != null) { - return null + suspend fun get(targetPlayerUUID: UUID): PlayerBan? = + withContext(Dispatchers.IO) { + val response = + responseParser.parse { + retrofit.pcb().getUuidBanStatus( + playerId = targetPlayerUUID.toString(), + ) + } + val ban = response.data + if (ban?.unbannedAt != null) { + null + } + ban } - return ban - } @Throws(UUIDAlreadyBannedException::class) suspend fun ban( @@ -34,7 +39,7 @@ class UUIDBanHttpService( bannerPlayerName: String, reason: String?, expiryDate: Long? = null, - ) { + ) = withContext(Dispatchers.IO) { try { responseParser.parse { retrofit.pcb().banUUID( @@ -58,7 +63,7 @@ class UUIDBanHttpService( suspend fun unban( targetPlayerUUID: UUID, unbannerUUID: UUID?, - ) { + ) = withContext(Dispatchers.IO) { try { responseParser.parse { retrofit.pcb().unbanUUID( @@ -73,4 +78,4 @@ class UUIDBanHttpService( throw e } } -} \ No newline at end of file +} diff --git a/pcbridge-spigot/build.gradle.kts b/pcbridge-spigot/build.gradle.kts index 87d074560..c7d313e83 100644 --- a/pcbridge-spigot/build.gradle.kts +++ b/pcbridge-spigot/build.gradle.kts @@ -1,16 +1,9 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar -import java.io.ByteArrayOutputStream -import java.io.FileOutputStream -import java.util.Properties - -val generatedResourcesDir = "$buildDir/generated-resources" plugins { - id("com.github.johnrengelman.shadow") version "7.0.0" + id("com.github.johnrengelman.shadow") version "8.1.1" } -apply(plugin = "com.github.johnrengelman.shadow") - repositories { mavenCentral() gradlePluginPortal() @@ -27,41 +20,42 @@ repositories { name = "papermc" url = uri("https://papermc.io/repo/repository/maven-public/") } - - maven { url = uri("https://hub.spigotmc.org/nexus/content/repositories/snapshots/") } - maven { url = uri("https://oss.sonatype.org/content/repositories/snapshots") } - maven { url = uri("https://nexus.hc.to/content/repositories/pub_releases") } - maven { url = uri("https://repo.aikar.co/content/groups/aikar/") } // idb-core } dependencies { - implementation(project(":pcbridge-core")) implementation(project(":pcbridge-http")) - implementation(project(":pcbridge-web-server")) - compileOnly("org.spigotmc:spigot-api:1.20.4-R0.1-SNAPSHOT") - compileOnly("net.md-5:bungeecord-api:1.20-R0.1") + // Paper + compileOnly("io.papermc.paper:paper-api:1.20.2-R0.1-SNAPSHOT") + + // Integrations compileOnly("net.luckperms:api:5.4") - compileOnly("net.essentialsx:EssentialsX:2.19.0") + compileOnly("net.essentialsx:EssentialsX:2.20.1") compileOnly("us.dynmap:dynmap-api:3.3") compileOnly("us.dynmap:DynmapCoreAPI:3.3") - compileOnly(files("$projectDir/libs/GadgetsMenu.jar")) - implementation("com.github.shynixn.mccoroutine:mccoroutine-bukkit-api:2.11.0") - implementation("com.github.shynixn.mccoroutine:mccoroutine-bukkit-core:2.12.1") + + // Libraries + implementation(kotlin("reflect")) + implementation("com.github.shynixn.mccoroutine:mccoroutine-bukkit-api:2.15.0") + implementation("com.github.shynixn.mccoroutine:mccoroutine-bukkit-core:2.15.0") implementation("com.zaxxer:HikariCP:5.0.1") - implementation("co.aikar:idb-core:1.0.0-SNAPSHOT") implementation("io.sentry:sentry:5.7.4") - implementation("dev.jorel:commandapi-bukkit-shade:9.3.0") - - testImplementation("net.md-5:bungeecord-api:1.16-R0.4") - testImplementation("org.spigotmc:spigot-api:1.20.1-R0.1-SNAPSHOT") + implementation("io.insert-koin:koin-core:3.5.6") + implementation("io.github.reactivecircus.cache4k:cache4k:0.13.0") + implementation("net.kyori:adventure-platform-bukkit:4.3.2") + implementation("net.kyori:adventure-text-minimessage:4.16.0") + implementation("io.github.oshai:kotlin-logging-jvm:5.1.0") + + // Testing + testImplementation("io.papermc.paper:paper-api:1.20.2-R0.1-SNAPSHOT") } sourceSets { main { kotlin { + // TODO: is this still needed? // Bundle generated resources with the output jar - output.dir(generatedResourcesDir) + output.dir("${layout.buildDirectory}/generated-resources") } } } @@ -73,62 +67,15 @@ tasks { } tasks.withType { - destinationDirectory.set(File("build/release")) + // Outputs the JAR to a location specified in the .env file if present. + // + // For faster testing with a Minecraft server, since we can output directly + // to the "plugins" folder + destinationDirectory.set( + File( + env.fetchOrNull("BUILD_OUTPUT_DIR") ?: "build/release", + ), + ) archiveVersion.set(project.version.toString()) - - // Prevent clashes with other Spigot plugins that may be shadowing CommandAPI - relocate("dev.jorel.commandapi", "com.projectcitybuild.pcbridge.commandapi") -} - -tasks.create("generateVersionResource") { - group = "automation" - description = "Generates a file containing the version that the plugin can access during runtime" - - val gitDescribe: String by lazy { - val stdout = ByteArrayOutputStream() - rootProject.exec { - commandLine("git", "describe", "--tags") - standardOutput = stdout - } - stdout.toString().trim() - .replace("-g", "-") // Remove `g` for `git` in the commit id - } - doLast { - val propertiesFile = file("$generatedResourcesDir/version.properties") - propertiesFile.parentFile.mkdirs() - val properties = Properties().apply { - setProperty("version", version.toString()) - setProperty("commit", gitDescribe) - } - val output = FileOutputStream(propertiesFile) - properties.store(output, null) - } -} - -tasks.named("processResources") { - dependsOn("generateVersionResource") -} - -tasks.create("incrementVersion") { - group = "automation" - description = "Increments the output plugin version" - - fun generateVersion(): String { - val updateMode = properties["mode"] ?: "minor" - val currentVersion = version.toString() - val (oldMajor, oldMinor, oldPatch) = currentVersion.split(".").map(String::toInt) - var (newMajor, newMinor, newPatch) = arrayOf(oldMajor, oldMinor, 0) - when (updateMode) { - "major" -> newMajor = (oldMajor + 1).also { newMinor = 0 } - "minor" -> newMinor = oldMinor + 1 - else -> newPatch = oldPatch + 1 - } - return "$newMajor.$newMinor.$newPatch" - } - doLast { - val newVersion = properties["overrideVersion"] as String? ?: generateVersion() - val oldContent = buildFile.readText() - val newContent = oldContent.replace("""= "$version"""", """= "$newVersion"""") - buildFile.writeText(newContent) - } + this.dependsOn } diff --git a/pcbridge-spigot/libs/GadgetsMenu.jar b/pcbridge-spigot/libs/GadgetsMenu.jar deleted file mode 100644 index 63d72d4e2f4c79df9f03093e20ee7581f57e8db1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1929138 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

ZQclxk)Tm+GL_2Q7f~9V8ydqdW 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%0A4crQoS`XFfaOyAI6z8Z?1PlE)Gc&tUC7 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

d9-LDM>vp4ua%RIr2P*NjLwydI6F-} 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

>4kV_;|dlvZ_? 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℘_E*V$MQtZy2&~l+3tz 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

YNovcCk4CkWVwO`DWLQYVG)l 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 z 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
    cJble2@b;2 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®XC8W5#ZxfS}_*cmW&K!P~Nv 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

    s^@B2#iUz`&+g?3>G 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

    {>LGLMW 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�jV= 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

    o!t|Up)me`79 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%0D$HkszPJ9tXjsQo+HQ<{QO z&<@d=R3#4!&sib=t~b@{xe^`|fT}%+)8_lwY;UO3;(^|7CX!D^tS4}SzWP0 zk@dF1u@8u#-MCI8X2~~)!)okgoRC1qC@5#wGEnOC?@EsGy1U<`+*t z!#2*&g4efuOjMo8 zU1dO(s>6Mhm3o5IpElPx>r6$yPRO$BrR8mr2Pz)p4&Z!xcF<3X{c(Cm%_a z*P3~~Yhaaf#TFg8G0`jL>{D+gJ|u$wm}Bs$efkp>qBHv0w62Lht5dC-7L!udw;SG` z34BtDLdnT(RwOQx5O_tqz0mG~0xPSxfBn#XXU_csPU~rIHt<|cbxlp0ampa^(F$~I z@_m;YX|c2p(cqiG^OmwPeS+ zlaS1quQ_l(l(xA-Xk@vwpDI~df*5C7!L9&i_KDRqtz|{h5WJi*O>L#^L5Wez{>hq_ z=#hXAtuy{woFrkGT$)WgYwF>!FQ+cI$#8i*eWE`TuqAE`z zdlDhugB&C6Aaf<50i~}#?CpLmvvEf*PzuSGtJqz@xV!YKqXS=0^omMrzCU@$~Ku$til32r%?eiPhMQr;}MC0#NW)?E0X;FdHbxTVTO zn+pWDRDs|Y|9tf|+Hi$2R@{iqf?Ify;FiQ%qo?S9f?EeLbSYCI!L2s0yI&()Jc9pE zaH|Ot+^R3NG1#B@@{*)brtLc3Nkp?OzSXTIgHaKEUAjXG3-%0E?76Y=7wH3{ta*r* zg+vL@iVk&6CPk1E7s7@pZ6?mvh&9f$>-tBtX`c;A2f|2JO-AvSQxa8go}1C1zj;GY zXI{s$^lewPvRwc=&(dL^?rw>b`1$?VIj1O{5*hSf8WMuaYJvSsfhX@g7?8qBJqp zM0wWxgzlY@fcM$2%MzrB#<;uPX*5TCn#eL8Q#uTi?tB<<4)7}Pa6UFJce~E|Y3K0x zF*e`aGfb%yvpshxad4E*jF~ArGhZC`m2y7a;x^7HD>lN!)j?amWK|>C=nAVj^7b?) z<`U3t3ny$Uy{qh76p70gbJ0&Znd=yv!Sl!D#qBi_x|HqDKAF82Fvq*OvY%bZ_Xt}B zhOSlNuzeM#y$9*WyP-E&f_F_RC(lVHtkT_^<~VcejMD8ZVb(0^{YquUgo<;@lVSra zQ-=7Ip-VRRmkQc%Fx|V`e=xJ9T9zq0#_%fj;1i#Om^QhvEqBB`&x9H5M3 zrJag!_D%M=sAM2*D)u45Pf;`^v)F4`g<36LFheY0B{@Z z*|e*!H+2OLnSa*tYL+)zCp<@8N(Z~K+&9b#@Ar_Q?iiX^%ZxU?q0y0Xnf(>5mur3NGT6~_l-jJU zH!VDTv2D%uvhMZUV@d2ePtcX`M>~bWbo^%Tn0-vwgao%FKM{Qs+$!Qq0fJkp3gvu~ zsd#rdmFKH81XrTbG>J;i$-dBnA$TGmEX8Cihi(ciqlfc;eLUWJ6qZS0pG zXqnUN-vzhiXpMg*xYbzOvfOiQM&YS?bU6HVeC(JSD<|{VweY*JPZ_Zy3krM;E(U#N zk;A<>#^*Uncm<_A3Q8oihA6sttyzvAJ-u#$p}vvSPII}pd0!fA;3+rb^9vHQVp@{u#I%Czlgac$g*zWg`YPskM~ZK50xn@rED z#gZGEFmI^X%nSZhzB{=ipkBre(hQZ{GBzu=_=sOw8xH zqs-ir(Vsv6b0wvRpN2+yoUL&Z8%j{8XBMAv ziikI!93o^U%ZjUSS?Rg%?0Qrrzf@s}Q{--)HsKrG`u(RLc;rcGKfS-snEs!sQf&MsYPE}_w^?P)7~_(oR!rB>gFRCGqgUi6qjZlrWnQQ# z!A^f)9U${8=$>hc?|gD)t*HcV!thNYGVi_{bUKE^A;A6^xYI0{fC!BE- zzUysS6E{@F=M{!=(R1AzNLhj#b!J$b)oV>V$UVOo^m5$xSksVer+Q_$v#0tsteo0( z@?P75_+}lGB^<;nn(?USG2J6cABS0^T?J96kGOV5@Nk^I4_mikzJDBV^_Iz^WtznS zobZsbNM>~f%8v?uACw$zjXuLa;s!rw<-|H6H>6lqO{6{{r%lazUzeuWnQUr_vvmp{ z*fu~ClF3GCLZot8jx9TlH=4v|RM0@BMJ}UeLkSH0dilC)E`Gb6JPsYk%3vRz8#z87! z87}_>9=RMu+K2MKW8BFU+^GR`a~Xlph0caW&4&*2mFb3B$v+*T#N$6D(Wn(Z)_k@w zD9wR_Y#0s1AH7{5abGKQ^kQU$!jop|*0UT*^^ZM9=#H4JTzTd78GWR9=<_+`t%J7j zYm>j%+X7pM|Dm^a*%@yi-n|-sSr4CgC-okYN)y2tQfJ@qzg8bgX~`-ZlP12%%{$de zY_k6R$f6|gg3d|hhdycDGR3Y=)xCn%uC8m#D?nglEf6 zi+;#9z#nFGtTYckf9j?0#mCqTLIY&?ZWt(3=FdKb^tPrC0KF}C1|+?$(Gur$i>|hD zMsq(HYPDQG6W8nk-PZCO9%+13_uR3)bIK^Le`*zLg`u{T(RSuktuNiPVqjcJm=l^0 zYAt@jzu=i6$6shxZs4bSF&8gpDWAqpFak@!?120g9$1rpT%k|yq-)@)^3VaZeR#gL zkB<4sB%R5H`A{&0@`m*kRuiyr1(A(p8^sO=*7NOaSXm3MKc#y_clyAU4gPw<_Y<(z zM8y-%3E0n_a3$k-_QuB#pOKSHkyB$Q9}Tp*PkEg`3$422Ax#FQ;h2Ng|t zuuV}*%2%~3l0$l1Z#(9NW^Q@$o|ae)*l*ZIeV<35kS&|;^HT#t-d4;r-}JV;V_#C; z0eV|x_jr0=*PLGFX6_=M`=+;*C4(t(H>bn*>^HrwTR?AX;6J^sH@DwUNR52g+j;}( zZ8-qFt;XV@u!(PaTRe)dWk27v*rKs{rC7x{GM<1L5G&1)Ua)1N-n#>oo75%u_n2toosAm_77hrlR=+4!h}i z-erChw;v zSy5~47)2*Ny3=hjACHk+hAwtk_b+e~i=hZ(Q&Av!x7ZzaXAHNBE6=fmn_gPmz#<2iuURyW~bH7L-T zL1LDkyGZh>0}|XKO)sugR>?NvTt1@p?r6PN;Eaw>fBU|J{o3ftJURNBnhAy#Pvf+h zdaN@G3@gid5VuOjX%50`?KoYjI{Ec`BUKn ziXUs=TZ`YMiY}=c?4FHLt@0VH&77)wcw5OySyJQ`rH?hH6n43Tm(5M8PX$c|F(KsS zL!E=XHC9BGCQ%fI_xQED)CHsC-la_!-O*P(_+_8yyK}1seJANZiI?9Xl$UPP8BLun zelOpNer_a1Miu8GEWB8qLb>0IUH7dh1aK{r?l(s!~-2@2B54yQRuO_L!8J zGPXNVwLCs0?MWznHB#SjdLz|UOUuK9OQe(v5*AT6m<~?SmGcmFv#myV zpz*CGV=-OIi+a~M_S_}T*oOlaF~Yl`sk9*TU2uzU83=CCMCJ2Af?E-g;8sI!TQ@@8 zIbD>XHxyf2+XcX}}WC>u#|%V)FTR?_@?j7Oj0gCR_2=T6^6 zKi-WpRrIXhVCht;Mw(y4Z~@O(!qZwjC6XONZo>0)O#9_R*U)d!P&7#~gc`1f8=roF z&D)?pd~onWBP&-p&s9#!2G5?1b7A+qf?E>LW17m-n=d`j}IwN)X`WL@KiKv^36Qr}aU(Vw_ z;945;U3XQon7Hak8%Bd8i(STAUO6OgcKVdaF>wrfiG7z-KE69cx5V5rcr7ydtbf03 zPsj_^Q&w^dUk+Tf^m-{$v4|-rl`OclggI)$vM7alsYB~niT7x4-+IXNm0FqMLcV8j z?5(-|ScDnN2`_zip5`+OH$l1Y?CkLxN5)|m4ZTICz&9G#=-(l?mC z!IV2II$Zpu`-z3ZI@;I$b!!jo)<^AFHHs*OKBo>=#|<6`xz09YWHNo5-)Z6MLg)I| zHkP`5F>S$tC^zs$4)gUr==&W1*6z^@HN~s(?#%Yl$;%%4qzj@xdW?w?xW+L>2`RA! z3-hG;+5B#8mR&2E<(Y30h@PxQTkMtdvM#QjU$uP>ToUFc^vO@LRkbVuMavoIbr3Th$qrC_Lia?mLsXfl8MF> zPx9g>dOyW3n)b@9<3-eAUU?ru{Hg~OiWiPGGP26FmS$)?cEHMs2`oP!JiN4^aCIpy z@C->LYua;$d^W6jso_W6^ zQMKOBO^Uj98tcI_onR8fGjFZK9| z4WY~xzemY&H~16pX5ScbQ0AuXisy?Uvf|DN3$?zffB&1{mXm{3nrTPRj1k5OD}&WCKF7qvh_(WL8Rf-P>}&ef>!t0I+e6* z=d&`drqC!bT;_d)iow^^?yX7sB3H-3KJ2W(Yiiln41s5?H?V4D$5~J|32wEm;tgZE zyL#SF5E>3R{a*Do>af_YR%VNd)KB`x5BUjC&OKViNF%E%HI?U7YD$+msnUePbc;FHX8fh*isHqh<31Wf0= zf{UKNCD*^}=SXf?>5-57iMsK&820g+6DEy3&3I9=eNNZ>fZ!JTeC89_Cmg*PzBRgo zHitxMoQRSp$$;QiI_0`xk*jZ9nm*yVfzG8ft!|UXexT;t48;#xfAONk1%W3?7@I#^xcao3 zSa+yGHOotR>56XFYc}d^Ix{Y+N8;9`J$zFTB{fEHanTpHlC3&n7qxVJS=WqKz3=82 zYX*y7&KNR0voxITCFS$A^IfA$zOns+2#WH_)U!p(MqR#%@XXQ1N`EUUbarPJNlBR= zyAP|E1R|F%(AoND34{=re8x{y@W_YLb{AGurW&t_A7{f_%U_^y5BI;P(&fh=Xnyc= z9wGbaD837;^K5l?qKd5SbDw^zc{4FG{|zVgo4#UP%N$sYEqz7syHCD&X__taa|aM{ zbVhUStBRY-Xi+r?^vOZP3VF5UyDt@wsDj9@w1+_R)Tju;n*91X zd5#qm=ZQtUuDlu7xT7d(d0K;>zhBis&X~X*g^wT0&Bxv!$49n0@c zueB^bV4L&HnDT@4wvwwKd?xW<5gnVr@=ykPTVH|RR&4V9q2G4-ymS1^}u&P*OD@||h^nxb~9 zt?IC7idv+AGfZAF*;x!x9BnL=~UQSNDQ`d{g7VFu_^R5IR@+iSh8z#n>B?C{S2 zzx1}``S|HW{G9CF(xN94*`tK*AKV>l)-u433BG`FW|Q8Q-}_v?0vNLlrkyUaS=}uf zyLn-K<43uv$I7mV$dD4s+dh!u?MWIGo{-7J5DyXSILboROmUH0xqkr0o~~Q?|3q&q z-GolzCIflM0Fj&wub=1ptSI~d;TX=rz-bxzSH?<>;ZGM7J?s)&(Zk?2rm>#UFe7gxy(nxznMd6z}cid(Y(K8RoA#&wSnQW4qB83b*JfG&Gh;SFCv_7UNh^q1Z0I zMzzo0^o)P1x5b(;m}$?HM1Mczxb?ci(g>Tz_ zZi#q!^wOG!%5z3ki$H0OM*LW6ngxIQV*QsQ^$N6_bP;U~X$K8_O7ZI{E@_ow6sa8c zG@xJRY*p)Z;p|SLcTU%bWwx7#U(8}uwZ`@A?Lil2#!w=;f=S@$7HH0j7Hcdcg&P@l z#OFhBoKv*4iB8KLO_YKLiKdXvf?k#*$NM|CY&_bE>KC79J1QTTdX*c6d$sC-`MmAu ze3TZ|9Cl2k_9(w+A+OLKvSkb_n9-ABSJE+$%jvGS*K<%K~rm&cnV_0 z(u+Rt)7>%Yk%}M+EZ(^)>60#xWfiJ>J(Y74ZeDf4<|Q8T*P*qNQ=GjyNp$4mAlIXx9cmmd^daY~IgdidBEE&MBr?CK%MsU%b5eRKMchC9t(5tR~r9^O}4C^u(v z^*yfN1j?~i;g2MmwxjCq~B z?)-JN<%#H3BEg2w=tXs{2wWQ3mhl#YkX)C91%^7>%Ff~I&n8wlqZI;c*bY4 zCV9SIHfrD{;~^6a5DPv)a`V;3k*eXk{-H&dK_{D8+q`p?nG3zEnD?lPQ%K!gZXUV0 z0e%2rA1WaVAqomQItrw7z4=HI0|lHTB3-iLD#A=sK;QUl2MWs8k2W_>`f7v!-3a^x z2HbQ(hXMchQCVR*DG7096=qq9%_DRJxK<@muIL#QltMog6zol(M?t9u|7B>ZZ)F0r zK$tMwJKJym=)*1F8~Iz)GlGvIELnc{3Gn*Urc3t6CtUQcub9HDT;QP%{x^IG3Gm-8 zwjY0f|6>jK`EML+$GQJW-&7QY6{L2ajL?8T-ADc3=-_X9!oLN8M7GqoGD0dVQ2K8k z5E733?@Il%0WCq+Z5x%2B$%2UNKF%h(j@fXkl=4`{$f;N2YZByzJVyh(%J$BD&x*B z@zEmZ_rXFzkp#;N2=S)N5R|LmOyHj``DOutK>m@{x6(J+i3CMgd!J+82KZ@m$wg(#cXNWnGC^3eAPO)<^_+cONQUb+1C^zM)eP>U`+)k4@17@Pr z;qNbO|7YrJ+g&k5O<{)Ss@6vO_OPAF#rzl8TR=YINN=^)-Dy{3aT^D?^>!wdotgz6 z7~vp0-vF6+@&8N(f6I#474rhjVh1D?RPB~>Q#c5!7g)fMkqObeLdt@ovfWAuS+?4m zE)Oj90G%i@5+1udBxpK!MmqD@e|-Wh)Wk+XkwS9pv6NjSrR-sr+p*9r6<|LmyARYg zSCB^+kg!@=yTZ!pTf!7zJIqsvDnWy#$pYrgJg9MsNYuvCT~QTaww7?v93iY|R9viK zb~_vWAyH)C7zpiE>aAU_UgaL)cLoc!#=n;bwMh-YC6VmTc(5z564;38|Dx1q8QBdg zgF?(qytPbd_U#gC_p1PFibYcef#BBQZOvx9(Oof>VfOZLE0Y}p3(ebC;wS@Hz*JPQ zcSH6s+RNQx?e*;)egTEz_;V=*dzDR>7X4U4f7$eGZ4g0+zUdM}-SL@+_k;gg`QcUwCeQ;ti5=)kL^oN3f)c0p*Y^Cc>H{^kH`^{Kpn-6WfN+5w z^rlPO@UMY?6D{OYci-f%VgFUS?He#F=2C(ruqn|d0S(6{n?MCJ-4*DEONEVoo~=Qr zG25pgRM(|jFNZ9H%n<`8&>BeJfzfU+zQeb2yXj15`?r9qQ2)n`t{~uvHP8Vedm_qp zFTRC>zRPdF1LO%)v6DOnU=3e6ih^<7BP1n`G8CDdr2_g%#vjaypzwKR$zc!E>0efh`?hSdfSoq>E%=yk$gV{p6mmfeH zw(U`bk|~nAz)J(HYOUae0l7jt&Fm7n9SEh3sq5{R{a_9g(SZYl%Z_QL;(#3*4GIb$5>KE0FL)Agi{HoYc-4#MXi)OW!L}3mz(||t zFF5iRMo32eHeVofex^Syl5OhF|AT2~3A2YAZZGwlhXjYAo38jj9nwJG$_nHj(yW3~ zjXp6^X9-mBb0GTXHw_H-0)IQS$T!30o6?_zwF0hdjM56I{{Go4t8uFb6 zodRr6F$mSg%zEM~XiZT-iXoq(&qVwoN)#N;nILRkwgVu~i5lYu8i8Gu6y??&zL)x! zfM5D-YdHlqVbf((@P`~jaC%^l9D8Ww>43gRJfQc(1bq?m0ekIVjw}iRerW|14zc!! zuBjmMQp_kQ$Ze5g$=_M=jrHreL;m?W{n$4-3+xBM(XrvLZ=o6@eont1?y`qYn2;t6 zWQceY9)kgJnhP{(kj78?r}4j;v(rKV!EgmyMW6`fgMH;iB$#f;zZml!_U+#?aB!a( zl!Wcc4S{7d@p>o$v>6m>^6pLkW4= z_22_)(1DGDEJ2=jk*NFsVOlF2ep{_}PRXgK%S8$x`!9f_9OS}Ci2hG7Q+-SQ9qvUy z2{P*eZ!!WwYX>t8IsNN#{)y#a4YM_c*&=o}EucE$jR3&WgY{kvDMvhy{tHe`-_jaP zIQ5-p0F;#w4WN`?vQxS$R zPin6aH-G|_0=Afvn;Fl(<8^b=M(8zia6B)PU?9 zmZ;?@2CaZ0I8fk5vQrDJL4UMz{s`1J3%5g{o&zzfp4AH+sRRyxkf)Y`@IOF)+jGoO z*~%n=PP0pIYtIoR^AD_@dycIsj@+MnU;RUn$@iz$klGDs=xqO2H^f0644>GV2M_;t z=wgw8(wU?)l#)C3TLAtfDUkUt6YrZ3Y8zg2_LuGR?yMzHz1}W?8Z~YSu zGK@yt%E9tGd}lkMC51wBDse>$1?6eU)*eSH?w`rqvmQc0cKxh@$eWS4mw$<}-?1y* zu&A;c16~va8xrJIWZ~Zc-<`Kpb%N{}&A34g2c;qxbo6paL1TFHPxk!4egETUZQR+H z1uo78AHWKh1-cyMPGDns7wqjYXf9|*%w}_d20RM@k+V~AeHSnheR~;w2P;FcPVeMm zh#bE-7u~TB1?4fIBa;`v<3oQ`jZJ>kl`>^s{`xUY`yG1xixfu#repzS2; zfjuGb%)L{0N}U6AT*TyC*I7OM-Ec(|C2irqx{0K^|B%RGkjbndlaY5=tH*Z%6%|&| zw+2u9(Xjn0zEs$!lvF`zPI~3}1 z1GVfJfs~ML4cyDjD*xVzZ;}232m3&g}u!UBO)t_6`O+HtG;oXzt=d3fK$8fZh_hQTNc^1MGHN zp*S}cok1x8wq}DS4S6Z_h3^6?2G_SlSQ#msBAj+!BOvyzBlCU zzJ}(o6~n2BSm5h3z}FX$3bkbIZn)AS2!y@qPJV`{i-rMx+%&*a;A9D8YW?o1+bxA^ zMr>@3@aT`MLbi1B#cr6k`i2e``a4+)QERNqFre)MCYVLYmeS1bp1R#q$h#}=W0*%k z7Sn|`(mKl9=+Nh~Ol)Zm0q7AdqXANLHtv)!3W z{4LO3gK=OtGP+}9w`e=KBTNM0^ed~+p_|AHfOgsz99|*!@yZ9${(aN(&E-GP+iiyO z%bx>_;v{G?jX|@8yfUof?g9+m#Za-;hyQXVbfg(uR0Xq1V%rLQgJ@5|`y3CeM+7UIEab0UEhpaqI69db`cg(cOib6G5_I zgLD-f@gsLw8m7AdgL{RdwlIB5W&0i9NrM9H`h=5Q56q=m5M<=aaRj{k^Uo(*(hlY@ z@V4_#j)thSEVrL)fEm;P9@9Wx{~!78p1R$~5Yt>}eb5KY9e2Q0KuYDXs9i8G>O1M% z!Y$!)2x$j(D$0rVfpeb@Vf-LSuv>HjsOtxwe)G660}1wltHCfQ|s2H)B4N*!bG zE@1cVZM##qnq8n}VD?h>%2vN_x@cF@gcNt|K?~3QpsTz-~ecX;xbd?t&_-Zvr>ug$_NoW1$A~;ESvr0npD^ZoAiF zIJ_Gyc%{thf8B(*in7AK3cBiEa4S#-$z;rly<+cd^&^5cz8Y|TO9U1SWM^B>?S_mn zkaPfx@=moAa(2;$4GcOE-{x({S zyC@*6!Huq+>Lf&Ny_jB120D%#U=>F8bF%H;khfb5&EN-SLap^+SzrY*Mz)w59MAvz zM1q@`xPT|h&40ZzyxQ*+coO*f9*8os#j>t@L*Ciqhfx#`7r=_74pyWKNK5dL=U#Ak zrfS1J(6Sr{3qPoo$kuuX?1qXkG>6%Xz`$hMnTtzWo1+e_eF~mGKwkFAb9Ti=Sc@Pm z4R%UrD6LAG&wil;!Tkb)D~aUfr{H|x-_r{59lPCDsAd?AhrS8~wfWJu+H6w28>ovd z0z7RB*EihBS_tg*VB$awfL_Pi>SXQvdjj5WFH|$)o~o@50DGZ*De_KSt9ch#C4D0} zVkc7}ru+JgJM?s!IyiGcW`?)zn)!>R?{JZ`nJE2_ON~O$P(N}M^QSwwL6w0*ace|9D$1J+u2*}c(f0#H=?7xMQz{^)&RU) zgS^ZMlk5q2XJ1dokDP*Z0*OJ0kymvDcqQhaD-(E^!WL#|`|ER}<^1z)8sOf#CpdFP zu1^?zd%@k=+K6lxwP=u86krx1*QYkc-B6)-Vt!RBYQ6}IC;|_Qf^vb(Y*g7b^B0wZ z`2l;dHmDLIpkEV1nn6yQyJha|+1hKm^L!wOMnMWAr!Ndw^92uOER8z;=@%wz9n{79UvbWVUU!M4b1Ey`2ozWYJOktu)tz~9OY%tJppgG7rH@(={T)}VBv-;`i3fq9bOlP;_H@3dng!8TuG4DGDwqXIDa=(IhEhtH-O0W?UAcI zU;!Ef1roU^_m%DqdApyX*7&fa7~XA=SLe6om37^2xVGSpFoXr%YRAP70`pi?U*-Z+ z_!`F6gtl$m8}JT=5(4`v+0gF;8_Us?TN4_$ZBM}49SsFoEdxUuI*hGBkHVR)4z~e*F3Uk02mw`A0pDslGk(d*55f1&_XLx`zI0T(C2@1iAvqBDxSj z)KC`X1aO!(r~}BY1H;_keDVJS2>&2m&HR&6! z-^}?{1teFv`~TH;CEzh$U3gHf?YE1y42fN62x6B_gdh=Xt&?Pu43kVcnII@yyDrw^ zNA0^>YOl4_($>CLQ9HG3soMSTnMvZi-*;!`e&6`N=h3vD=Dhcud(L~$J$IYn2i9$j z_+k0Tcd>RbJEZetjHG3xuEwzlq+Tsi*GCmV^6g)(8JN$xk8%%;pNs_L2%NmR1PI&g zH)@8$K|(&-^xNN@r0qxj(1q-n(rdGJG_zqKH=!gB{9sdLK~FK2h{TvfAB}7>8@4TkQa0O{xld?EbY7a8edkRMGxCwn7-ZPk_~4W$ zczo@)T%Ggnx6rNvv}6158151k%D0jnBaMSP?L32hmvknP$8coPLQmJk?1rb_0G+aZ zc>JQLm`W`v9&>H#b}AHzuVB|uCLW($(~KCJ9EZ!ldAFz#WXXsIku{J8bw(n~Le9RW z88R#l8JCF%Nd$f`>W4G6(2rh#Wm&-YFU^qQI93{FF&mS3y-BEvhD#HVgIyca(81Vt z_v3ef>SX48JmGKeBG5G-bY&-V&;NY~sCAraJN)&%#-9WCYj_f?ZQ6@>fvfaivT^L) z&sVL7Bb~xlAr`gAn|FZf&qv+2q-v{L7{zvAlEQLB|NObNazmCsDKRN*yf)ODycK-( z5H@DHAx{a-m?%m(FGw_LGGi|G0qba$iRJgor94CAYgp^fdl#@fQpRkGmPP%*)_G}^+o01hDRMZWeQR7WZE_hR`%b9;^5V)a*w^x z*i%fUWhoyi)+ucRWzTsP9`qtoJ7S6n=>ea1>=SXr7rKcs>sO#1)`LEb_863}=S55L zos>J%djP>qq!jAvA*2$JhOOWB_2~X3h-WtdSt@APOEX|+lg-&)t!{It_&0~U(*7FO zrj2kIQe#wpj9ps%BXQ)dn|(Sih(<*Ig(^O4(?1eDgjCv;{D%4sD%w934kh2D6hXig zgB1&lX4(C9Bs^*6;!-K_kX4Eq-DM5JGhi}mL_Cfm%*&0Argww|Z^42g5_Pb#v7dT{ zSWKk}$t{;ptNoD9A_w@(uck6%1xUzEBqq#26st~EV-&nUNfZvxhcbm$Qsa{zAwRu> zr#DAu)n()cOjae==(HN&`C6T(18~x!E9yaPv3SgMl@Q9VprzGq#T(rG1zpjrp1iUa zwN@p7`)lO>x{~(@aeNJAChQ&G{r9T`b6NMSw!7{I>8MxAlG+w-F-7xel zW^(DsZrEoXXV+1U=hO=+w1!@)lRg*o#q~(s8Zc%(7Ni=9Z$N?}$(e59$H4sDTNR8= zQFG4{jI5{psHQQ0N z_7qGVs$+EoizAY6Qj$g}rMuDKx-0v^_^mKsQ^Zz~1O_L8@qDDvQ0E9*NAHmNf((6~ zm-db<_a1x)crn0h&fv}X)Dt|Vb`(tS$4)D;35h%IPL)kht`66VmX;J_HpUp8miB!E zJ9I(vsymA*3Y)IH9_cA2U&{;qwj3{y5UU2ehBG$ZIbI`Th|yq645Zi8`4bc}?q^-w zjJpcMhC^9)UL7{+9l-K+U3z?6vBikNC5o!)_^BR)Dj_LErgn=PMHiI@BP(ECcKWwk zAx*e6jE{D7%#^>MgUjfRBoMRYJ277)8ePnSS85WuyA(;oghelRwn9%@kY%&Wmwv0Y zVp=Vnf)jyFZ#Q##4uHj>7g@&nZLLNy`z;-2&b5l{ zn?BoGE&{XGM^CZ^=krH3;*{C(eIv+h=6x~quSA^kL7#7*Sym{PnRK8_TUD8N|9^T3#?tI`OA}5(5MDN4d3suXd(~ZS~DH|J8{`L$} zX;bP!OSV~s`XVldf=*ct%f8Tv7oB1>#^Lo7s}hmY#Y*030e@gu#<2?Wy4Ic7nh`B{ zOp?ERNlGR!X;u9$2%rYKF;Fr};cp7&)s{GRNVGUz623Pq`t}aMg}|;XT>rwJz;RrL zvoEu_NM?q8`90dyo9H+E2SKO@J96g4tOA+)`d6SjHO{e7pij`aH`G zJC+2?u>QHcl19AF2CLP??>*A+K*@x9^HAgc6r1E(#A4MvMC5cJA%3oV|G+XNrgbq= zur@6b;29#{rW66$Gr|BtDEZ0QRk z6LhNEEEzOpYcBZuAnf=HkTe|sic!JU6wuLh2b8PF%?M@D>XVgUB57|@QC@=T*>grVz}!59T#40crCs~2i-ruay!r5|mv;lr#8&F9_iJuE~3hSg%Pj~I;8q=B60 z;${EwO(4EF<{)gEXsIeBz9nw(L?tBwCxHyf$W5H6A?@87Oz*x|QwRsoUsLL%+&xfv zp>OA{;MfIxcDmrAKT$TO}J!AR-X>?8qA|CeLV#PBHXP4khu*KA|R0 z%rSJ*T!?=LH>k-pc_3COU2v}BsjyT!HOE`NCD|8yd|CPs=yk~e)TkKQ@z^0FCY#^t zO{d@d*rFuf?GC~4nC*l%8lYTM}@#o$W~y`On5?8%o0s zX^EMg@^=yy8EiGg+gfHI@EiW)xDTrgL@d|Dw4aUV{a*_<+>X-8lxm7GA^k`frb0bq zr@7y_fwS~gWaxfZy4LN7xy(7t#{3y+mqetQ4Y5YpAHxp_PiY=`c(VSubcy@+rdTaD zORU9gHpM8~PR&IC**~`Jk5x)eG0^RItOHTocQ-f`6$=Mi0S9WCf#mqna;dtuXCef~ z;DItjtS!=x$hX*xO(##D0!&3PL>mUR&`NEnp~*J5l>@W0)j;=0@}XZoT)*s7?E8qQ zEZ>6^g}sn2$RiQscr9sXWh#vH#NL4srWhLQ!;@0D*P4*Ea~-jb8jkXQ2q=-&yU~t! z2Cmeb2CSi7X0JYhL2^F^$u5k^s~*t?ondAgE2E88JY(VLgAgMUWGk9fyvhtIA$lNJ=XK@zCC=Kl&IfzDIE$ngDbl;ZTR8JyKh5;iQeN< zwuGW2@ci1z*}x1F@P{34hTc-w5?N^S;Yim^l4XbGi??0EnN3*8OEy}StSS}B&I5h! z2#Sogq$U}$d0Q#`q|d-QtKhtwu__tGbX2N(;el2h>a;(cfg#z1XG2kbaDI54h@^Cv zxpQs;{wCmCGw>50sMamml9YtoCD2c?#?(~jz!W4W(q|7p2H*pVH2=~g^}v+%gxics zt}*}m>ga%4;HzJN8OkVI?5S$Z5UVA{H6+>hue$>${tn0%sE&j&kV{^whK$6)?ld=` z6mq-jln97|j&#E?3wi^m*IbN>Z)4!C!#b*E?ltYdY-+3HV7!gU%-90KtUQ9Cjv>c+ zAChjbx99t|9Q@`dkQ)oLx0E1^V^ZQAhTN07Dw9Uot0@|l6@)?MA3Fom`_W90$puON z?*nrlEeSPRLk%|UztSYXjRVX+?F>Toxvz8e$cj;ui}=&+rwOPJMl)_%tb!Kxr0|he zV?UFzzv~9<>ooS^&v4OlMdfwrzIf|S$VJ7&bL`Cd)>C=m!uK{LZctVIo6P<2*8&$ekjX2q3 z3{384GCQ}PeAbSIb;)-m$~B@TfiW2g%l>`K+ylT80f;1aaV39yx56SU2`C?COr3r3 zUlGQBM$XGEcA$qBKJNwZx_~J=%SIPFr~^_aP1Fx$hD^58OKgJk^4(m@$BB(J#w>Da zl^AJ<1*DNkHccX#?bql7wqWaa0nD}7_$u1neG45jCEG6S6)B}HD3YtpD(*#>+@<=; z*OjZJh$1<5T{r=uAa48hFF)J>D}7K!r>n=9sPqU?kYKaL(ANnDDPnCgtI-}PqKC;? zjE>)kV%Rr!IKiN9IWs88Z~>GTUS6kb&ghY}OccX09A_K@GZ~$rk=0&#W#3gDE9U=V zt&EMgrJK~D*=KK5l~nowskN%m+^Pd$x@PbJwo+3AFOj=ob9+2Eybaq`oTx$wzg*3| z^bZ&=2_(e&^Ap%p41sd8$TVwgBDR${*Cpb_^tJRX@O)&UtQ*w4D~gnP^BJ#(OWGXU z>NWonM)I>Lv$FOo^FS>Izef(WYdv`vy8Z&Xp4GzeUVcG)+3&b<(kB!!G>#6@S}~%abc!-8y}f8|NKP1+EalXfURq-7|la_ zYCY{Mikez}A_tAu#F$u7HpnZh^H6cDcaYo)Lql-KO z1MaUNzs&YrKTYroe|L`kpqI~sIOLs;5r|=o$s6L81TpqyB3;_c&PX!sQkm|vFhSns zEw4W080#^pGN{PLq#B>mvg3tEReCC?u>_F++3qbDk(AbhPSK1ZJ8A=vP9z=q8n!dK z;Ovh!FVCOP3%fx;*x^hA7A@7Jp|k;f2O`2O_{q#&^N=9?fCPc9LX_Ak3Y)pv)QNUP z4f^>bU++N&?!^RyU6(F+LKwzqV{e-hZ~rOmR@We(4L2egmPee|5iBLsr#^m9HlQFOBVC~Xrs*r8gtS|;kJ4Rqn@5rNw%#|2o*d1}J+GqfCYQYlO zZ~b}|I1ho-ToV2$I7X_(Nlq|hRm-Ib&Eun*9RTguL0SM_mVCuKs6pcg)5rau)%yk= zv<|V$j{YAdsgaJAI(nnV83lz6X;7~oD2NU$vM^<=T40hiE{sj_{&p`6 zduWZ;c(AoddegfQakZ`B~aZJX$~N-2Ao5OWs{T~-@8_ig-P5kK0d4bicf z9)#L3AF;{`TcN|yEf|Qb5AWHo4Y4hjFZl-^$USaX56jgQScefeY+m^H4mEh;t)knt zZQ}?RrDlXQ;8u>HDbQ>o{;;#laX+d-!cwf0(;>tG9~M~K^b&L#43}s1vF&n;BGJJo zLl-IsDD@$vIo`DkoCdiyM}d${W>)P{gQS#B*6KGWf36?(@PkPCDVO6%+)9UMJ0(h* zv35xNw#HD5#w#%zvt|2>58Vonw9r{rAIA@V@tQD>9o+t?2F96R!TlK0B;VS91TpxQ zAxY?9`&S|3r{hQE_X@g7B~t85;0&vfr3;N8ylf^4uC4TPOPhq`g*i4NC>u)zvdHgc zP<7M>nw6KkV^krL#E8&5KjA))aX|8`pLqu%a=&z*wp8ASrH@#f|vUeNZj6! zefsp&>E17pO;+k?QeHKP(qa@=)Rmdt3!_QC=R;jW*bJ$C+2N1Gg*DeXgXb+gv< z-rZp!8vxnyy!kj`u#C=j}=>cT9Yc&~H~Le~#4 z4oqzx-g9Bokti#7!o-gq^y5Ut1)1?uHf1mT#&!*A9}tDUjfPd&>Sq020*wu_;AIg* zvUB;3|2yh&BZLI%RkEYAzwHr_kK&j;^-?xop8T@|e(ys9!ryLfjclDQdr@6cyoj4i zCl`#uk>p#UPH>C?H*v^zk`uu3rG@5fgugche+Np$>vXTR0fa>wY?zR7F8m<4Q;moF zmqsuD4!9r&uE;S}hRW0@6OJ=H5nkk|Mgy8+_V*bUp(<6K@b-A`6S-yJ{{vG)8z z8$heHzD5*Jv4YjG;ZrSeIQNzb$Q!lEsGk*oq5BdVCSy*@LN3x3ay2hXvyXId`8UHy zq>!8uoFJR{^$h$3aCC{93NS?;*d)D8?Weh# zV9NTBw>*#Es6o1;(t~P+QWdh@&Hwr>!rckF0mbFZWRd06s}klw<3p9+K4(ek%6Q2v zM(+DZs%wVghZ<=n?Id=}6&|e~&ZfA?oG?y~ZQiK>oIN)t6X6b*%lPLU%@|=VE!I?H zCxaDF!a3=*CT*|fqzU#7(0>>MTda##)xsjoh9pBU4u@O$-50s-hnLR*8UtNf(D%D* z25lE>L>bq4Cq_)W({T|%n}EbxF`62CYX(Iz4d-}WT6pRw1!HnzXqW+7VU@MUX~(r% z;!&D(dIj6F1{==yfwI@pt*kelH)#fq&Uk;yxs9(cI9Q`U=!_OEYcV!nnIr%koEBpV z4{<`w@qX$fr(1GkS{3j{m!W|ePxD(sO4R%pKd$srr<}<;3Y|ZtOO)V65Pg@Px zA;}Mg-p8YB)&*e(fLE}`OY&7u7e-Qwme-xCNd)8A{saNhadb&}TC(y;S=(C?vzoz~ z7opi~ap)gaaxwhd0bJ(3&yy?XNkGoM7Nb~mMu~|t)hI!G*n=&pwoFi^$!NTsx1mOO zN4VG=1u=D+?+Kby6$$juQN>r*1K=MxMaic31(yhbhG0JlPH4pOC&}ap;USN&{sV7* zfWTpM?P+TS02~7`iRVnmXz04Pt5wNnM>9@^-2*HNfM9vBowSRlZprM^1eKVx9?H{;RRJs{QX8G->9{4hD+tM?T-Ur>x zw%>b)D1!6hwC#jG31po$iuSksNl?0dQy{9{C$olp7UhUr;mXF8Oh273LdwF5^^N7&o zw4_K}g>7;&-jabPRS$YH8=SbXnEX01zxARJ_EjjQiAa2Q{n*w0(8K>C%GhzW>`npk zElg%3pB_lK{-+6Rf5%jL2!ylQ?d4rU!mY;s7OTAo$lc{g81vthowx$-iR;K^Ay#0I zS`4L$>@}gFeGM&0vsM9t9Z2*2B7hL)BweM(U+h-0HPsQ`Ks;-peTT(F+pjBVi7N}t zybETi`7IaSxVRhqi8`^2AwrLfV1%UO@*o^{GY zX?qgiIs8>pEx6|(K(Ou^b5TUR+0viyo@ANpI|si$4)>%@xa{)KAD2ahXL5s2SmwXA zG#WV1S`gOzF>T9zKw*q6eJoGsyQT(9X(sX`8X93G`&T*Rr{jm=zJPQS7*tumZ?S^{qW`DgAp+{6NXV{qeOsi6dlq%Ho<@NPi`C9XPO^z> zhc~yKh}AT2bO0M|^Gd41aiR1!@0vK?lM3T;%sgU@+vpf3c zf%r=b@n>qP5zi@7k@(U9UvAk6FFoTW54Vr}RESqPDRpyB|7j~*V7+huV0p6GxUqJ6`FgE`!|C<%^_}XIwPW&iB*T(gnLgsr=-3n|=3VTqO|ut%86R={m2`Q4 z5WJo~=`sq_$``2Dw`LF~X+#JekYci?;~Gbd!C{7bcAzIB|;^OvMJAAR%d{GU!klsrRf%%U$` z?kT!tdmAT4iO%jn3h;UiTjSXl*(%Ahwc605u%QKeIhD#1+~@sAS2~VT#o3DTa>dI{ z+Thxwddowjj-|fLj1!hiYwQ_f-#p<7OxBT3KFJVr_o2;eY(+%egKvg2$VJbqHJ(Jlur{V-lYLi&(nARLi(F;L z^n*jvY>`#C-X%|9Gu+YzveaAHx}Dc`50Gu#<&0iohvK)xx^&|X8}(_PgJtzDF9EYV z@8j_7gFx@=3d&dO=ic&I)hu*=2d9;)GIAlJvKa8YGJZAsp~u+vv4u{MWi`T?32gPe z%$3Tb)*FU3Tc#QFAN?Pi!M8=uh|pR0F=wDBW!e8mA+$2-}Jn{r{mAoY@1##+dLij1+46e`to%7Bp$O_WO&H_h1J+^&qpwlqk;|VKJNH4C!t{gqm@>TKNkl z5h80rnJiyC?fide2HzHEqH0D{g!}?~u#Fhi>)khk6Ch-XH9zeM?ur00AV4}Y0g@W? z&KtqEL;GLft6TyV>xsyj+cQmQHqhfHw6!GT2D^-mOo>l{asS{7zjf$`bc|svN9-T| z4)F1;q&cevJkF*z1m)~$TZdG-cX`zQ7#rLl^{(5Xv;r|@$p#J9+<+(Q5SgqMicIym z1$6FHVgsHPs13X39(+(3VL1h1$yy<4*1K*4-wLZ6Hmgeywr+wY*cSY?;2pPs6Od$s zhHqlM+aVx>5s+*&oL>BHTcET6dE)thgOljd`oi!7cHI7Ehv)cdNlADmATu8M@2yiS zn*R6TbT4?qQg{OEjZgNx`&RHRamiL9o%VP91Z%Ku7Z;I^#Z|Dqf zVEwW0k$2q&r4?wBKYPFr`M-k|ih~`47-p(_Q*8?}Dk+`l@?IVX5Z>`CXI@3Z;-gW+ zV67f_+ao+$*~~nf6Brj~qA7Y;zRuV0<)5(up4Y9Cys(k;p(kxnqR|lCJm;_XhGETz zjt&Gf7A}#kn93YgYGLkU90ZuJ<;_DI5L|PS4Tdp*&$4?0=yc-;fwnvG=a9$H@CS_a zp$uq|yqK8_!FS<;4WuqJyUGIT(!F@^tvEp@PI=cjpA zpgF#1PB*4Gjmy8I=Fm-kxbVwOLrw?hOGj0!dP5{5JYO%ZvI)UE6Y{hhf zZG-?odt*GkwF+;xE8&xQSs8^st~=qc0+4@g@yn4s1DLCe%Et}=F&c15LFZrtW~84S zioyOgvJ940t7E3`w)7@f(yekiQ~Ne8gDJEh>RYU5=b5PSr+238?8*hdI_o1}v z&ve|tWdazEH=r_@NQppQv}4Qu?}}~H>9XOVFdI7oYef*S92@6ISd{WfgKrDwUp@_K z!+EU8u=2l6_Hy4V(YVejIl)QnP;8!A*Xb&4Hu(zfU7xYgh*Saj8MevDBzbcL0%oijw1Md#wokC|g@=j$tV)VD}aFQ%>Mzf-8TdXVKOV>1 z=~x^Y7L?e+5NG6Z7qz$5>;28=!6pe9M%Zl(hvta2m!vC6i)5eqxl;GKXtf0{#FG1# z1>&;#LpsTy)2~2;1#PESgxRgH%@&KvkDy0``Hhb%_FR7njrRvHvW9uFOiVZhtWq{P z{P0Ep8S^n{29LkVcHLKADK0zGWQ$Ey0+3~XDptD^J-pTw2@l)&-QKJXuIdPO;(|(3w zI!GcEg~XjI#Adah%;UKBhOfrmPn-8?2_x0VSj3L1rS_@7i?pQL3xlrUsK3YkS!wwb z^fz6{!B%^A9Z&(+-VkT9xWXb+_B4)+n+iV4M*hW^vdB?YSjh=SS6HN1nR>P%zNmbj z0+nLgEBSIBSApdUhT@UrW;z{9+GDS{gGsY*dz9uAB(X|`f6f>|d)X0y*j*+04hc%6 z`Y@GEtZ7LYo|Rrk=1H9L$LHta)wMCts3XD9>Big?Yd4`pQ6X9Nn7CH#cCII?JqA=L?nPS0Pn7qTDgi(6)jqE3p5~gEW zmz^t(dn$&}HYhs87>hBQGh$HgNga^sMd%R8w(U*&zR^t%HWbUyeBK{Wya zTt@PnIGLsRT|?%2RjNFbB}x8+^A3-L9or%{QM-|R#om{^*s;CyOK*ZMwd3UJ z^v3@b*QJ=Lav}e{VKP&|KPBHcWs2)kL7wbxMEadI%`2MA;(z|DrA~)Ay5!rM^*cdn zNhp-X7>zZPV^XCtCkOSC{5qQMoe63`f*OQPDvk%Km}HA&EE>Pz$_RL3t@7A$&B$o( zR7Qv~3A-zKE!voOV#P*~HUZyT*Fx3CQ0HLm^h@82v(CaPLYEw2H+R~9PShYn9GZtNe?P-plw^XYWxznGZt9u9IEu`=uPN#}W@4``lZt^;i$%*DdY~^)dXUjz)0=F(t|*-Q=g@V~ zIi{UXSDDedw2dzcU2IO*x5T>xsrq0`3Qy>mQUTtDF~By(!(3Gup+yGsga#X|7PHr9{jpi)pKa-8>G5yWufmdo>V%rWefzXzeLFb4J|mN;hkXw!!|`@#&@Bf;TJtEX<~ zp|mulq;S>$DfvvE>!`iO4w83x!+l&qn3J3J!8k<{Z?Ptu47|p9Py5gQ<;WBZVJ(~O z@YvsYGBZZ(AZ~}>%r>Gydj$Axq@5KROQn@&}9xEI)piqXcL8YftOdX1=$yu7B6>L(qdBU(M|)lR!{Q(2)J1K5W46pg0PjOlXSXoHOYT_*MAF(eaky% zQb@Q3*0-431HoFcgdF#H6=7pZ^s*nkaP!sx;m#@EWLkHW7w^G?S~L1itEC0kaS@FG zFkvAa>|f1{pN=2h8w&%Y;vs*sfs_i`U8M!xbubgL3v!lx%T>#EDCDFlL15EwcAK>b z7BpZCXe5C`iK3aXB5&``563f2$|4H^k?c&1u~i)Z2w@=XAxVs<0atb-Edlfiy3pt3}Q5?o}_k>aY!Z&xIpTGz~(<1TdSjVyw_ zC2W;i$yt`;>u~nd2B$}(f5yY*wH=dMsHs&J+ zDzWT!aM#>K0GW=*5_y}RB4`bIwXdy$$ft-4l@Ok^%0nIhvUl$76G7xT(PEa!Z)lP) zO5|Hh#TDce`Nd>mV@dQ9CGz=S4A33Llx8{-6_&^srfI+ivPxbz2oXoa79@K|6SJz;5q*to+PdskN+OW*4dF4jMPuTf2Ag?lx#7PvvVpe>!?w5PilF&@)T_N8 zLx6Ir>~QWkPh6^mDWnWY0MiDZn>-&3*bNNGGQtRL03sAfz-!0PSk)W7QwO;$3q1aN zO`3^tAORn{v!P>!3@Tz1m@b<&0Sl2JA#b^su*wMJFF}HAnsIH9II=qyBqZrz?9Vvk zf@9)H&S;Pj{`l$jzG0w2U(jG12H{_=2qHWvSI(D#zH&;1a&jUh(dSF2CHx0OI0{6_ z?o+CDTCHdoOh`}%f@A6s6HZc0Kc@Yz7Rn_R64>jjO}o@Uu$2cDqAnx(23}AL<`Ea> zye0(ar;ZETsF3P{3)dISIc_z$(5T?Tx!M3kxv)aE$t(C=xcRZTy(F56a$(4DxzOA6_3(Hu7asqhq(I%r&+a0gap9z*;z+Kzuz$}{^Y~nNLo0&k zTzIU63gviQIKS_gpHNb$0$=6_R)&xMzJtJT6S7jFFNP#T{LedE-Ex#7a! zkcLv;37WTm>>PP>A0fCp@*<&JDmzEk^%a*YVGJo362LM4NrCyWF5J7Ce5x9)4M3C& zZ%wc~sf@H8`z&O0Mf5x4T@6w7OLc4P1*y;Gn#VVAO(=Lf_`=I7}KJ7kNE!qX` z+M!CnXn&uZg7#jaRtuN3OJE(|n|cHnCqcl$W}qES`j>_-CzGwp&XBPcT}FSm|k_GV#>$)9wMPrK$P zYN6cH?%^K8n+=9efkot1&`rfCJi zKOt(tJfhuct%Ts}siWPCDx^wSQBJ#+%b8d21PL`!&~EM4;?0%-h|+GY-bd&0Y4_ug zH35s#?iaN?8|OjeJkXe3e7e(H6RnxXcpIF3^MQFEzfBC=pv|Dws3M9{H zcm7auC|9(5_?!1<(KbnCw);dYLKaVHrrkCpR4B)z-KA@{o#NB(4Ar8u)Zx=^nbh3# zPoc>0T(Rc=aEw|l+|up`=}iuO1lp~P5M$T;D}1RI%nj|H#iUtUmh z-2f_=$`%=(sgNpRMJeqPz`=>@`|@cwVzPL%B>*C{OTdRu&#lU*UE6$3z#_Cuz&(PN z=Hb(B&Sjc_g=m+Mx3wwJ{Tyhwnj+gRxLF+89qkg*&Fy=}_<*T?0~$Mn4c(&x$sO$y zl+^Fp+U}nH;!w_Lmk_?MQnXA-Fvdwmwp-$7jR;vh<$`wQ%CXt*tb;0`<+MwpyH@>k zGQY@hOSR}Mb(FMAP;+-){F6_+O^>P7!X@nz*xlUO7V>E~<)m6Lk7)PJ@1k(*0V;XF zv$Pv_PF$*l73H+M{ML!teA=C%4M3E3Cx(oV;@5U}-`1p=DD6H-dR2>0yY2td1T0Lu z$veg^qHI@5yFGAT*2QI&8At5=Fd?c_ON4eO6)hjkr`-wpR3Ldqy9El0L%E{eFJ7-L zUI4VaT|v9CS`o5%N;BEq<+F;P?N%$MR&2m8Dv&&*-Gg1kp?ja#B(M2iHik*;{=EI})7&CMrx>+bxTW1SPjj`Hf+HY% z3(AWOV~uLT+|cfMB-hf(RuzW71}6!@;kp3!kd<62o9*sVAyq<7(rlLidY9{ZqYp^P zS3$eQlf|1Y0T7{G0>0L%c31$Hc5e^X1S~?k1e|R|lkt(z_Q<3_#tAtk%D%I%~pZrj&=!3>i2As;pseaC}*@w2&Lca zT8OgUsS4VSn6D8bi>F-Bu3R~`$gpp*3TQd)l4vjM_LWp*P||LZC2B=ysiUM_f=XCf z?B8pk-BOA(42dh$Lb;?}0xKC=WXflt-N_2tUA9Usm>b%?063}pv9vpOqbM9(+m%aY zY4?~4sS;L{(k=n4Nm=c+6K5DkRgx#2KAXgwEddarT>>5vH?azzb|dy{0v4fN0$$br zuM$0>aZYH=X1n(eX#y6aT|!>?;Kx8d?QXarj_i(h390*-+X;NyeRxX+k~`WZD5>AG zw3~QO9LgE(62gLCT1_m-rQK~>5wdv71?|d}V`;bk-zt=o(=Lf#o8p^?PrD;ji_TI< zNxKBqJfd;XRW9wGeWF$im$XY@KL>yIhEKaCpQ{Dq(k{K5q0=SiNX)SyDVy$DHoCp{ Ee`m_s@&Et; diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/DependencyContainer.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/DependencyContainer.kt deleted file mode 100644 index 7f1779cb8..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/DependencyContainer.kt +++ /dev/null @@ -1,313 +0,0 @@ -package com.projectcitybuild - -import com.google.gson.reflect.TypeToken -import com.projectcitybuild.entities.ConfigData -import com.projectcitybuild.modules.chat.ChatBadgeFormatter -import com.projectcitybuild.modules.chat.ChatGroupFormatter -import com.projectcitybuild.modules.ranksync.actions.UpdatePlayerGroups -import com.projectcitybuild.integrations.dynmap.DynmapMarkerIntegration -import com.projectcitybuild.integrations.essentials.EssentialsIntegration -import com.projectcitybuild.integrations.gadgetsmenu.GadgetsMenuIntegration -import com.projectcitybuild.integrations.luckperms.LuckPermsIntegration -import com.projectcitybuild.pcbridge.core.modules.config.Config -import com.projectcitybuild.libs.database.DataSource -import com.projectcitybuild.pcbridge.core.modules.datetime.formatter.DateTimeFormatter -import com.projectcitybuild.pcbridge.core.modules.datetime.formatter.DateTimeFormatterImpl -import com.projectcitybuild.pcbridge.core.modules.datetime.time.LocalizedTime -import com.projectcitybuild.pcbridge.core.modules.datetime.time.Time -import com.projectcitybuild.libs.errorreporting.ErrorReporter -import com.projectcitybuild.libs.errorreporting.outputs.PrintStackTraceOutput -import com.projectcitybuild.libs.errorreporting.outputs.SentryErrorOutput -import com.projectcitybuild.libs.nameguesser.NameGuesser -import com.projectcitybuild.libs.permissions.Permissions -import com.projectcitybuild.libs.permissions.adapters.LuckPermsPermissions -import com.projectcitybuild.libs.playercache.PlayerConfigCache -import com.projectcitybuild.pcbridge.core.storage.JsonStorage -import com.projectcitybuild.modules.joinmessages.PlayerJoinTimeCache -import com.projectcitybuild.pcbridge.core.contracts.PlatformLogger -import com.projectcitybuild.pcbridge.core.contracts.PlatformScheduler -import com.projectcitybuild.pcbridge.core.contracts.PlatformTimer -import com.projectcitybuild.pcbridge.core.modules.filecache.FileCache -import com.projectcitybuild.pcbridge.http.HttpService -import com.projectcitybuild.pcbridge.webserver.HttpServer -import com.projectcitybuild.pcbridge.webserver.HttpServerConfig -import com.projectcitybuild.repositories.* -import com.projectcitybuild.support.spigot.SpigotLogger -import com.projectcitybuild.support.spigot.SpigotNamespace -import com.projectcitybuild.support.spigot.SpigotScheduler -import com.projectcitybuild.support.spigot.eventbroadcast.LocalEventBroadcaster -import com.projectcitybuild.support.spigot.eventbroadcast.SpigotLocalEventBroadcaster -import com.projectcitybuild.support.spigot.listeners.SpigotListenerRegistry -import com.projectcitybuild.support.spigot.SpigotServer -import com.projectcitybuild.support.spigot.SpigotTimer -import org.bukkit.Server -import org.bukkit.plugin.java.JavaPlugin -import java.time.Clock -import java.time.ZoneId -import java.util.Locale -import kotlin.coroutines.CoroutineContext -import java.util.logging.Logger as JavaLogger - -class DependencyContainer( - val plugin: JavaPlugin, - val server: Server, - val spigotLogger: JavaLogger, - val minecraftDispatcher: CoroutineContext, -) { - val config: Config by lazy { - Config( - default = ConfigData.default, - jsonStorage = JsonStorage( - file = plugin.dataFolder.resolve("config.json"), - logger = logger, - typeToken = object : TypeToken(){}, - ), - ) - } - - // TODO: inject config instead of the config keys, otherwise flushing the cache - // will never do anything - val dateTimeFormatter: DateTimeFormatter - get() = DateTimeFormatterImpl( - locale = Locale.forLanguageTag( - config.get().localization.locale, - ), - timezone = ZoneId.of( - config.get().localization.timeZone - ), - ) - - val time: Time - get() = LocalizedTime( - clock = Clock.system( - ZoneId.of(config.get().localization.timeZone), - ), - ) - - val logger: PlatformLogger - get() = SpigotLogger(spigotLogger) - - val scheduler: PlatformScheduler - get() = SpigotScheduler(plugin) - - val timer: PlatformTimer by lazy { - SpigotTimer(plugin) - } - - val errorReporter: ErrorReporter by lazy { - ErrorReporter( - outputs = listOf( - SentryErrorOutput(config, logger), - PrintStackTraceOutput(), - ) - ) - } - - val dataSource by lazy { - DataSource( - logger = logger, - hostName = config.get().database.hostName, - port = config.get().database.port, - databaseName = config.get().database.name, - username = config.get().database.username, - password = config.get().database.password, - shouldRunMigrations = true, - ) - } - - val listenerRegistry by lazy { - SpigotListenerRegistry( - plugin, - logger, - ) - } - - val localEventBroadcaster: LocalEventBroadcaster - get() = SpigotLocalEventBroadcaster(scheduler) - - val spigotServer: SpigotServer - get() = SpigotServer(server) - - val nameGuesser - get() = NameGuesser() - - val permissions: Permissions by lazy { - LuckPermsPermissions(logger) - } - - val chatGroupFormatter by lazy { - ChatGroupFormatter( - permissions, - config, - ) - } - - val chatBadgeFormatter by lazy { - ChatBadgeFormatter( - playerConfigRepository, - chatBadgeRepository, - config, - ) - } - - private val httpService by lazy { - HttpService( - authToken = config.get().api.token, - baseURL = config.get().api.baseUrl, - withLogging = config.get().api.isLoggingEnabled, - contextBuilder = { minecraftDispatcher }, - ) - } - - val webServer by lazy { - HttpServer( - config = HttpServerConfig( - authToken = config.get().webServer.token, - port = config.get().webServer.port, - ), - delegate = WebServerDelegate( - scheduler, - server, - logger, - UpdatePlayerGroups( - permissions, - playerGroupRepository, - ), - ), - logger = logger, - ) - } - - val spigotNamespace get() = SpigotNamespace(plugin) - - val playerJoinTimeCache by lazy { - PlayerJoinTimeCache(time) - } - - /** - * Repositories - */ - - val chatBadgeRepository by lazy { - ChatBadgeRepository() - } - - val playerConfigCache by lazy { - PlayerConfigCache() - } - - val playerConfigRepository by lazy { - PlayerConfigRepository( - cache = playerConfigCache, - dataSource, - ) - } - - val playerBanRepository by lazy { - PlayerBanRepository(httpService.uuidBan) - } - - val playerUUIDRepository by lazy { - PlayerUUIDRepository( - server, - httpService.playerUuid, - ) - } - - val playerGroupRepository by lazy { - PlayerGroupRepository( - httpService.playerGroup, - config, - logger, - ) - } - - val playerWarningRepository by lazy { - PlayerWarningRepository( - httpService.playerWarning, - ) - } - - val ipBanRepository by lazy { - IPBanRepository( - httpService.ipBan, - ) - } - - val warpRepository by lazy { - WarpRepository(dataSource) - } - - val aggregateRepository by lazy { - AggregateRepository( - httpService.aggregate, - ) - } - - val telemetryRepository by lazy { - TelemetryRepository( - httpService.telemetry, - ) - } - - private val currencyRepository by lazy { - CurrencyRepository( - httpService.currency, - ) - } - - val verificationURLRepository by lazy { - VerificationURLRepository( - httpService.verificationURL, - ) - } - - val scheduledAnnouncementsRepository by lazy { - ScheduledAnnouncementsRepository( - config, - FileCache( - JsonStorage( - file = plugin.dataFolder.resolve("cache/scheduled_announcements.json"), - logger = logger, - typeToken = object : TypeToken(){}, - ), - ), - ) - } - - /** - * Integrations - */ - - val dynmapIntegration by lazy { - DynmapMarkerIntegration( - plugin, - warpRepository, - config, - logger, - ) - } - - val essentialsIntegration by lazy { - EssentialsIntegration( - plugin, - logger, - ) - } - - val gadgetsMenuIntegration by lazy { - GadgetsMenuIntegration( - plugin, - logger, - currencyRepository, - ) - } - - val luckPermsIntegration by lazy { - LuckPermsIntegration( - plugin, - logger, - chatGroupFormatter, - ) - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/PCBridge.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/PCBridge.kt deleted file mode 100644 index 9ef623cac..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/PCBridge.kt +++ /dev/null @@ -1,153 +0,0 @@ -package com.projectcitybuild - -import com.github.shynixn.mccoroutine.bukkit.minecraftDispatcher -import com.projectcitybuild.integrations.SpigotIntegration -import com.projectcitybuild.modules.buildtools.bin.BinModule -import com.projectcitybuild.modules.announcements.AnnouncementsModule -import com.projectcitybuild.modules.buildtools.invisframes.InvisFramesModule -import com.projectcitybuild.modules.buildtools.nightvision.NightVisionModule -import com.projectcitybuild.modules.chat.ChatModule -import com.projectcitybuild.modules.joinmessages.JoinMessagesModule -import com.projectcitybuild.modules.moderation.bans.BansModule -import com.projectcitybuild.modules.moderation.mutes.MutesModule -import com.projectcitybuild.modules.moderation.staffchat.StaffChatModule -import com.projectcitybuild.modules.moderation.warnings.WarningsModule -import com.projectcitybuild.modules.pluginutils.PluginUtilsModule -import com.projectcitybuild.modules.ranksync.RankSyncModule -import com.projectcitybuild.modules.telemetry.TelemetryModule -import com.projectcitybuild.modules.warps.WarpsModule -import com.projectcitybuild.support.modules.ModuleRegisterDSL -import com.projectcitybuild.support.modules.PluginModule -import dev.jorel.commandapi.CommandAPI -import dev.jorel.commandapi.CommandAPIBukkit -import dev.jorel.commandapi.CommandAPIBukkitConfig -import org.bukkit.plugin.java.JavaPlugin - -class PCBridge : JavaPlugin() { - private var container: DependencyContainer? = null - private var containerLifecycle: ContainerLifecycle? = null - - override fun onLoad() { - CommandAPI.onLoad( - CommandAPIBukkitConfig(this) - .verboseOutput(true) - ) - } - - override fun onEnable() { - printLogo() - - // Since CommandAPIBukkit doesn't support namespaces (yet?), we need to force - // unregister Essentials commands that name clash with ours - CommandAPIBukkit.unregister("ban", false, true) - CommandAPIBukkit.unregister("banip", false, true) - CommandAPIBukkit.unregister("unban", false, true) - CommandAPIBukkit.unregister("unbanip", false, true) - CommandAPIBukkit.unregister("mute", false, true) - CommandAPIBukkit.unregister("unmute", false, true) - - container = DependencyContainer( - plugin = this, - server = server, - spigotLogger = logger, - minecraftDispatcher = minecraftDispatcher - ) - containerLifecycle = ContainerLifecycle(container!!) - - container?.errorReporter?.start() - - runCatching { - containerLifecycle?.onEnable() - }.onFailure { - container?.errorReporter?.report(it) - server.pluginManager.disablePlugin(this) - } - } - - override fun onDisable() { - runCatching { - containerLifecycle?.onDisable() - }.onFailure { - container?.errorReporter?.report(it) - server.pluginManager.disablePlugin(this) - } - containerLifecycle = null - container = null - } - - private fun printLogo() { - val enableMessage = """ - - ██████╗ ██████╗██████╗ ██████╗ ██╗██████╗ ██████╗ ███████╗ - ██╔══██╗██╔════╝██╔══██╗██╔══██╗██║██╔══██╗██╔════╝ ██╔════╝ - ██████╔╝██║ ██████╔╝██████╔╝██║██║ ██║██║ ███╗█████╗ - ██╔═══╝ ██║ ██╔══██╗██╔══██╗██║██║ ██║██║ ██║██╔══╝ - ██║ ╚██████╗██████╔╝██║ ██║██║██████╔╝╚██████╔╝███████╗ - ╚═╝ ╚═════╝╚═════╝ ╚═╝ ╚═╝╚═╝╚═════╝ ╚═════╝ ╚══════╝ - - """.trimIndent() - - enableMessage.split("\n").forEach(logger::info) - } -} - -private class ContainerLifecycle( - private val container: DependencyContainer, -) { - private var modules: List = emptyList() - private var integrations: List = emptyList() - - fun onEnable() = container.apply { - CommandAPI.onEnable() - - dataSource.connect() - permissions.connect() - webServer.start() - - modules = listOf( - AnnouncementsModule(), - BansModule(), - ChatModule(), - BinModule(), - InvisFramesModule(), - JoinMessagesModule(), - MutesModule(), - NightVisionModule(), - PluginUtilsModule(), - RankSyncModule(), - StaffChatModule(), - TelemetryModule(), - WarningsModule(), - WarpsModule(), - ) - modules.forEach { module -> - val builder = ModuleRegisterDSL(listenerRegistry, container) - module.register(builder::apply) - } - - integrations = listOf( - dynmapIntegration, - essentialsIntegration, - gadgetsMenuIntegration, - luckPermsIntegration, - ) - integrations.forEach { it.onEnable() } - } - - fun onDisable() = container.apply { - integrations.forEach { it.onDisable() } - integrations = emptyList() - - modules.forEach { it.unregister() } - modules = emptyList() - - listenerRegistry.unregisterAll() - dataSource.disconnect() - webServer.stop() - - CommandAPI.onDisable() - CommandAPI.getRegisteredCommands().forEach { - CommandAPI.unregister(it.commandName) - } - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/WebServerDelegate.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/WebServerDelegate.kt deleted file mode 100644 index 20543a70e..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/WebServerDelegate.kt +++ /dev/null @@ -1,56 +0,0 @@ -package com.projectcitybuild - -import com.projectcitybuild.modules.ranksync.actions.UpdatePlayerGroups -import com.projectcitybuild.pcbridge.core.contracts.PlatformLogger -import com.projectcitybuild.pcbridge.core.contracts.PlatformScheduler -import com.projectcitybuild.pcbridge.core.utils.Failure -import com.projectcitybuild.pcbridge.core.utils.Result -import com.projectcitybuild.pcbridge.core.utils.Success -import com.projectcitybuild.pcbridge.webserver.HttpServerDelegate -import com.projectcitybuild.support.textcomponent.send -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch -import org.bukkit.Server - -class WebServerDelegate( - private val scheduler: PlatformScheduler, - private val minecraftServer: Server, - private val logger: PlatformLogger, - private val updatePlayerGroups: UpdatePlayerGroups, -) : HttpServerDelegate { - - override fun syncPlayer(uuid: String) { - val player = minecraftServer.onlinePlayers.firstOrNull { - it.uniqueId.toString().unformatted() == uuid.unformatted() - } - if (player == null) { - logger.info("No matching player found for sync request UUID: $uuid") - return - } - - logger.info("Syncing player: $uuid") - - scheduler.async> { resolver -> - CoroutineScope(Dispatchers.IO).launch { - val result = updatePlayerGroups.execute(playerUUID = player.uniqueId) - resolver(result) - } - }.startAndSubscribe { result -> - when (result) { - is Failure -> when (result.reason) { - UpdatePlayerGroups.FailureReason.ACCOUNT_NOT_LINKED - -> player.send().error("Your rank failed to be updated. Please contact a staff member") - } - - is Success -> { - player.send().success("Your rank has been updated") - } - } - } - } -} - -private fun String.unformatted(): String { - return lowercase().replace(oldValue = "-", newValue = "") -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/ConfigData.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/ConfigData.kt deleted file mode 100644 index 74a3957cc..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/ConfigData.kt +++ /dev/null @@ -1,196 +0,0 @@ -package com.projectcitybuild.entities - -import kotlinx.serialization.Serializable - -@Serializable -data class ConfigData( - val api: Api, - val database: Database, - val webServer: WebServer, - val errorReporting: ErrorReporting, - val localization: Localization, - val chatBadge: ChatBadge, - val warps: Warps, - val integrations: Integrations, - val announcements: Announcements, - val groups: Groups, - val messages: Messages, -) { - companion object { - val default = ConfigData( - api = Api( - token = "FILL_THIS_IN", - baseUrl = "https://projectcitybuild.com/api/", - isLoggingEnabled = false, - ), - database = Database( - hostName = "127.0.0.1", - port = 3306, - name = "pcbridge", - username = "FILL_THIS_IN", - password = "FILL_THIS_IN", - ), - webServer = WebServer( - token = "FILL_THIS_IN", - port = 8080, - ), - errorReporting = ErrorReporting( - isSentryEnabled = false, - sentryDsn = "https://@sentry.io/", - ), - localization = Localization( - timeZone = "UTC", - locale = "en-us", - ), - chatBadge = ChatBadge( - icon = "§6★" - ), - warps = Warps( - itemsPerPage = 15, - ), - integrations = Integrations( - dynmap = Integrations.Dynmap( - warpIconName = "portal", - ) - ), - announcements = Announcements( - intervalInMins = 30, - messages = listOf( - "§bJoin the Project City Build Discord server! Type /discord in game!", - "§bDonations are the only way to keep PCB running! If you would like to donate to the server, you can do so by typing /donate in game!", - "§bVote for us to help keep PCB active! Type /vote in game!", - "§bPost screenshots of your builds to the #showcase channel on our Discord to be featured on the PCB Instagram! Type /discord to join!", - "§bMake sure to follow the Project City Build Instagram for features of YOUR builds! Type /instagram in game!", - ), - ), - groups = Groups( - displayPriority = Groups.DisplayPriority( - builder = listOf( - "architect", - "engineer", - "planner", - "builder", - "intern", - ), - trust = listOf( - "developer", - "moderator", - "trusted+", - "trusted", - "member", - ), - donor = listOf( - "donator", - "legacy-donator", - ), - ), - donorTierGroupNames = Groups.DonorTierGroupNames( - copper = "copper_tier", - iron = "iron_tier", - diamond = "diamond_tier", - ), - ), - messages = Messages( - join = "§a§l+ §r§f%name% §7joined the server", - leave = "§c§l- §r§f%name% §7left the server (online for %time_online%)", - firstTimeJoin = "§d✦ Welcome §f%name%§d to the server!", - welcome = """ - #§3Welcome to §f§lPROJECT §6§lCITY §9§lBUILD - # - #§3Type §c/register §3to become a member. - #§3Type §c/list§6 §3to see who else is online. - # - #§f§lAsk our staff if you have any questions. - """.trimMargin("#"), - ) - ) - } - - @Serializable - data class Api( - val token: String, - val baseUrl: String, - val isLoggingEnabled: Boolean - ) - - @Serializable - data class Database( - val hostName: String, - val port: Int, - val name: String, - val username: String, - val password: String, - ) - - @Serializable - data class WebServer( - val token: String, - val port: Int, - ) - - @Serializable - data class ErrorReporting( - val isSentryEnabled: Boolean, - val sentryDsn: String, - ) - - @Serializable - data class Localization( - val timeZone: String, - val locale: String, - ) - - @Serializable - data class ChatBadge( - val icon: String, - ) - - @Serializable - data class Warps( - val itemsPerPage: Int, - ) - - @Serializable - data class Integrations( - val dynmap: Dynmap, - ) { - @Serializable - data class Dynmap( - val warpIconName: String, - ) - } - - @Serializable - data class Announcements( - val intervalInMins: Int, - val messages: List, - ) - - @Serializable - data class Groups( - val displayPriority: DisplayPriority, - val donorTierGroupNames: DonorTierGroupNames, - ) { - @Serializable - data class DisplayPriority( - val builder: List, - val trust: List, - val donor: List, - ) - - @Serializable - data class DonorTierGroupNames( - val copper: String, - val iron: String, - val diamond: String, - ) - } - - @Serializable - data class Messages( - val join: String, - val leave: String, - val firstTimeJoin: String, - val welcome: String, - ) -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/PluginVersion.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/PluginVersion.kt deleted file mode 100644 index 3a86d7792..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/PluginVersion.kt +++ /dev/null @@ -1,6 +0,0 @@ -package com.projectcitybuild.entities - -data class PluginVersion( - val version: String, - val commitHash: String, -) \ No newline at end of file diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/Warp.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/Warp.kt deleted file mode 100644 index cc78027d5..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/Warp.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.projectcitybuild.entities - -import java.time.LocalDateTime - -data class Warp( - val name: String = "warp_name", - val location: SerializableLocation = SerializableLocation(), - val createdAt: LocalDateTime = LocalDateTime.now(), -) diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/events/FirstTimeJoinEvent.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/events/FirstTimeJoinEvent.kt deleted file mode 100644 index 165782230..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/events/FirstTimeJoinEvent.kt +++ /dev/null @@ -1,22 +0,0 @@ -package com.projectcitybuild.entities.events - -import com.projectcitybuild.support.spigot.eventbroadcast.BroadcastableEvent -import org.bukkit.entity.Player -import org.bukkit.event.Event -import org.bukkit.event.HandlerList - -class FirstTimeJoinEvent(val player: Player) : Event(), BroadcastableEvent { - - companion object { - private val HANDLERS = HandlerList() - - @JvmStatic - fun getHandlerList(): HandlerList { - return HANDLERS - } - } - - override fun getHandlers(): HandlerList { - return HANDLERS - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/events/WarpCreateEvent.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/events/WarpCreateEvent.kt deleted file mode 100644 index 3e8136b0c..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/events/WarpCreateEvent.kt +++ /dev/null @@ -1,21 +0,0 @@ -package com.projectcitybuild.entities.events - -import com.projectcitybuild.support.spigot.eventbroadcast.BroadcastableEvent -import org.bukkit.event.HandlerList -import org.bukkit.event.Event as SpigotEvent - -class WarpCreateEvent : SpigotEvent(), BroadcastableEvent { - - companion object { - private val HANDLERS = HandlerList() - - @JvmStatic - fun getHandlerList(): HandlerList { - return HANDLERS - } - } - - override fun getHandlers(): HandlerList { - return HANDLERS - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/events/WarpDeleteEvent.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/events/WarpDeleteEvent.kt deleted file mode 100644 index 0ac8bb271..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/events/WarpDeleteEvent.kt +++ /dev/null @@ -1,21 +0,0 @@ -package com.projectcitybuild.entities.events - -import com.projectcitybuild.support.spigot.eventbroadcast.BroadcastableEvent -import org.bukkit.event.HandlerList -import org.bukkit.event.Event as SpigotEvent - -class WarpDeleteEvent : SpigotEvent(), BroadcastableEvent { - - companion object { - private val HANDLERS = HandlerList() - - @JvmStatic - fun getHandlerList(): HandlerList { - return HANDLERS - } - } - - override fun getHandlers(): HandlerList { - return HANDLERS - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/migrations/202200821_add_badge_toggle.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/migrations/202200821_add_badge_toggle.kt deleted file mode 100644 index 2347ce7ce..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/migrations/202200821_add_badge_toggle.kt +++ /dev/null @@ -1,19 +0,0 @@ -package com.projectcitybuild.entities.migrations - -import co.aikar.idb.HikariPooledDatabase -import com.projectcitybuild.libs.database.DatabaseMigration - -class `202200821_add_badge_toggle` : DatabaseMigration { - override val description = "Add a column to toggle the chat badge on/off" - - override fun execute(database: HikariPooledDatabase) { - database.executeUpdate( - """ - |ALTER TABLE players - | ADD `is_badge_disabled` TINYINT(1) DEFAULT 0 NOT NULL AFTER `is_muted`; - """ - .trimMargin("|") - .replace("\n", "") - ) - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/migrations/20220114_first_time_run.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/migrations/20220114_first_time_run.kt deleted file mode 100644 index 06a106296..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/migrations/20220114_first_time_run.kt +++ /dev/null @@ -1,13 +0,0 @@ -package com.projectcitybuild.entities.migrations - -import co.aikar.idb.HikariPooledDatabase -import com.projectcitybuild.libs.database.DatabaseMigration - -class `20220114_first_time_run` : DatabaseMigration { - override val description = "First-time run" - - override fun execute(database: HikariPooledDatabase) { - database.executeUpdate("CREATE TABLE IF NOT EXISTS meta(version INT(64));") - database.executeInsert("INSERT INTO meta VALUES(1);") - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/migrations/20220115_player_configs_warps.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/migrations/20220115_player_configs_warps.kt deleted file mode 100644 index 07228cf9f..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/migrations/20220115_player_configs_warps.kt +++ /dev/null @@ -1,96 +0,0 @@ -package com.projectcitybuild.entities.migrations - -import co.aikar.idb.HikariPooledDatabase -import com.projectcitybuild.libs.database.DatabaseMigration - -class `20220115_player_configs_warps` : DatabaseMigration { - override val description = "Add player configs and warps" - - override fun execute(database: HikariPooledDatabase) { - database.executeUpdate( - """ - |CREATE TABLE players ( - | `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, - | `uuid` VARCHAR(50) NOT NULL, - | `is_muted` TINYINT(1) NOT NULL DEFAULT '0', - | `is_allowing_tp` TINYINT(1) NOT NULL DEFAULT '1', - | `first_seen` DATETIME NOT NULL, - | PRIMARY KEY `id` (`id`), - | INDEX (`uuid`) - |); - """ - .trimMargin("|") - .replace("\n", "") - ) - - database.executeUpdate( - """ - |CREATE TABLE warps ( - | `name` VARCHAR(50) NOT NULL, - | `server_name` VARCHAR(50) NOT NULL, - | `world_name` VARCHAR(50) NOT NULL, - | `x` DOUBLE NOT NULL DEFAULT 0, - | `y` DOUBLE NOT NULL DEFAULT 0, - | `z` DOUBLE NOT NULL DEFAULT 0, - | `pitch` FLOAT NOT NULL DEFAULT 0, - | `yaw` FLOAT NOT NULL DEFAULT 0, - | `created_at` DATETIME NOT NULL, - | PRIMARY KEY (`name`) USING BTREE - |); - """ - .trimMargin("|") - .replace("\n", "") - ) - - database.executeUpdate( - """ - |CREATE TABLE chat_ignores ( - | `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, - | `player_id` BIGINT UNSIGNED NOT NULL, - | `ignored_player_id` BIGINT UNSIGNED NOT NULL, - | `created_at` DATETIME NOT NULL, - | PRIMARY KEY (`id`), - | CONSTRAINT `chat_ignores_player_id` FOREIGN KEY (`player_id`) REFERENCES `players` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION, - | CONSTRAINT `chat_ignores_ignored_player_id` FOREIGN KEY (`ignored_player_id`) REFERENCES `players` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION - |); - """ - .trimMargin("|") - .replace("\n", "") - ) - - database.executeUpdate( - """ - |CREATE TABLE queued_warps ( - | `player_uuid` VARCHAR(50) NOT NULL, - | `warp_name` VARCHAR(50) NOT NULL, - | `server_name` VARCHAR(50) NOT NULL, - | `world_name` VARCHAR(50) NOT NULL, - | `x` DOUBLE NOT NULL DEFAULT 0, - | `y` DOUBLE NOT NULL DEFAULT 0, - | `z` DOUBLE NOT NULL DEFAULT 0, - | `pitch` FLOAT NOT NULL DEFAULT 0, - | `yaw` FLOAT NOT NULL DEFAULT 0, - | `created_at` DATETIME NOT NULL, - | PRIMARY KEY (`player_uuid`) - |); - """ - .trimMargin("|") - .replace("\n", "") - ) - - database.executeUpdate( - """ - |CREATE TABLE queued_teleports ( - | `player_uuid` VARCHAR(50) NOT NULL, - | `target_player_uuid` VARCHAR(50) NOT NULL, - | `target_server_name` VARCHAR(50) NOT NULL, - | `teleport_type` VARCHAR(10) NOT NULL, - | `created_at` DATETIME NOT NULL, - | PRIMARY KEY (`player_uuid`) - |); - """ - .trimMargin("|") - .replace("\n", "") - ) - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/migrations/20220120_teleport_history.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/migrations/20220120_teleport_history.kt deleted file mode 100644 index 2cc178f82..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/migrations/20220120_teleport_history.kt +++ /dev/null @@ -1,29 +0,0 @@ -package com.projectcitybuild.entities.migrations - -import co.aikar.idb.HikariPooledDatabase -import com.projectcitybuild.libs.database.DatabaseMigration - -class `20220120_teleport_history` : DatabaseMigration { - override val description = "Add last_known_locations" - - override fun execute(database: HikariPooledDatabase) { - database.executeUpdate( - """ - |CREATE TABLE last_known_locations ( - | `player_uuid` varchar(50) NOT NULL, - | `server_name` VARCHAR(50) NOT NULL, - | `world_name` VARCHAR(50) NOT NULL, - | `x` DOUBLE NOT NULL DEFAULT 0, - | `y` DOUBLE NOT NULL DEFAULT 0, - | `z` DOUBLE NOT NULL DEFAULT 0, - | `pitch` FLOAT NOT NULL DEFAULT 0, - | `yaw` FLOAT NOT NULL DEFAULT 0, - | `created_at` DATETIME NOT NULL, - | PRIMARY KEY (`player_uuid`) - |); - """ - .trimMargin("|") - .replace("\n", "") - ) - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/migrations/20220201_add_hub.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/migrations/20220201_add_hub.kt deleted file mode 100644 index 6d4432351..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/migrations/20220201_add_hub.kt +++ /dev/null @@ -1,27 +0,0 @@ -package com.projectcitybuild.entities.migrations - -import co.aikar.idb.HikariPooledDatabase -import com.projectcitybuild.libs.database.DatabaseMigration - -class `20220201_add_hub` : DatabaseMigration { - override val description = "Add hub location" - - override fun execute(database: HikariPooledDatabase) { - database.executeUpdate( - """ - |CREATE TABLE hub ( - | `server_name` VARCHAR(50) NOT NULL, - | `world_name` VARCHAR(50) NOT NULL, - | `x` DOUBLE NOT NULL DEFAULT 0, - | `y` DOUBLE NOT NULL DEFAULT 0, - | `z` DOUBLE NOT NULL DEFAULT 0, - | `pitch` FLOAT NOT NULL DEFAULT 0, - | `yaw` FLOAT NOT NULL DEFAULT 0, - | `created_at` DATETIME NOT NULL - |); - """ - .trimMargin("|") - .replace("\n", "") - ) - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/migrations/20220201_add_ip_bans.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/migrations/20220201_add_ip_bans.kt deleted file mode 100644 index 588440cf8..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/migrations/20220201_add_ip_bans.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.projectcitybuild.entities.migrations - -import co.aikar.idb.HikariPooledDatabase -import com.projectcitybuild.libs.database.DatabaseMigration - -class `20220201_add_ip_bans` : DatabaseMigration { - override val description = "Add IP bans table" - - override fun execute(database: HikariPooledDatabase) { - database.executeUpdate( - """ - |CREATE TABLE ip_bans ( - | `ip` VARCHAR(50) NOT NULL, - | `banner_name` VARCHAR(50) NULL, - | `reason` TEXT NULL, - | `created_at` DATETIME NOT NULL, - | PRIMARY KEY (`ip`) - |); - """ - .trimMargin("|") - .replace("\n", "") - ) - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/migrations/20220207_add_teleport_message_silencing.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/migrations/20220207_add_teleport_message_silencing.kt deleted file mode 100644 index 7118dd367..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/migrations/20220207_add_teleport_message_silencing.kt +++ /dev/null @@ -1,19 +0,0 @@ -package com.projectcitybuild.entities.migrations - -import co.aikar.idb.HikariPooledDatabase -import com.projectcitybuild.libs.database.DatabaseMigration - -class `20220207_add_teleport_message_silencing` : DatabaseMigration { - override val description = "Add a column to silence teleport messages" - - override fun execute(database: HikariPooledDatabase) { - database.executeUpdate( - """ - |ALTER TABLE queued_teleports - | ADD `is_silent_tp` TINYINT(1) DEFAULT 0 NOT NULL AFTER `is_allowing_tp`; - """ - .trimMargin("|") - .replace("\n", "") - ) - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/migrations/20220320_rename_queued_warps.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/migrations/20220320_rename_queued_warps.kt deleted file mode 100644 index 17e507d95..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/migrations/20220320_rename_queued_warps.kt +++ /dev/null @@ -1,19 +0,0 @@ -package com.projectcitybuild.entities.migrations - -import co.aikar.idb.HikariPooledDatabase -import com.projectcitybuild.libs.database.DatabaseMigration - -class `20220320_rename_queued_warps` : DatabaseMigration { - override val description = "Add a column to silence teleport messages" - - override fun execute(database: HikariPooledDatabase) { - database.executeUpdate( - """ - |ALTER TABLE queued_warps - | RENAME TO queued_location_teleports; - """ - .trimMargin("|") - .replace("\n", "") - ) - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/migrations/20220505_delete_queues.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/migrations/20220505_delete_queues.kt deleted file mode 100644 index 6eee075e8..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/migrations/20220505_delete_queues.kt +++ /dev/null @@ -1,26 +0,0 @@ -package com.projectcitybuild.entities.migrations - -import co.aikar.idb.HikariPooledDatabase -import com.projectcitybuild.libs.database.DatabaseMigration - -class `20220505_delete_queues` : DatabaseMigration { - override val description = "Delete queued teleport tables" - - override fun execute(database: HikariPooledDatabase) { - database.executeUpdate( - """ - |DROP TABLE queued_location_teleports; - """ - .trimMargin("|") - .replace("\n", "") - ) - - database.executeUpdate( - """ - |DROP TABLE queued_teleports; - """ - .trimMargin("|") - .replace("\n", "") - ) - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/migrations/20220530_delete_bungeecord_cols.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/migrations/20220530_delete_bungeecord_cols.kt deleted file mode 100644 index 7c1989ed1..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/migrations/20220530_delete_bungeecord_cols.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.projectcitybuild.entities.migrations - -import co.aikar.idb.HikariPooledDatabase -import com.projectcitybuild.libs.database.DatabaseMigration - -class `20220530_delete_bungeecord_cols` : DatabaseMigration { - override val description = "Delete columns that were previously needed for Bungeecord" - - override fun execute(database: HikariPooledDatabase) { - database.executeUpdate( - """ - |DROP TABLE chat_ignores; - """ - .trimMargin("|") - .replace("\n", "") - ) - - database.executeUpdate( - """ - |DROP TABLE last_known_locations; - """ - .trimMargin("|") - .replace("\n", "") - ) - - database.executeUpdate( - """ - |DROP TABLE hub; - """ - .trimMargin("|") - .replace("\n", "") - ) - - database.executeUpdate( - """ - |ALTER TABLE players DROP COLUMN is_allowing_tp; - """ - .trimMargin("|") - .replace("\n", "") - ) - - database.executeUpdate( - """ - |ALTER TABLE warps DROP COLUMN server_name; - """ - .trimMargin("|") - .replace("\n", "") - ) - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/integrations/SpigotIntegration.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/integrations/SpigotIntegration.kt deleted file mode 100644 index 6523f0aca..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/integrations/SpigotIntegration.kt +++ /dev/null @@ -1,6 +0,0 @@ -package com.projectcitybuild.integrations - -interface SpigotIntegration { - fun onEnable() = run { } - fun onDisable() = run { } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/integrations/dynmap/DynmapMarkerIntegration.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/integrations/dynmap/DynmapMarkerIntegration.kt deleted file mode 100644 index fedd6a60a..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/integrations/dynmap/DynmapMarkerIntegration.kt +++ /dev/null @@ -1,108 +0,0 @@ -package com.projectcitybuild.integrations.dynmap - -import com.projectcitybuild.entities.ConfigData -import com.projectcitybuild.entities.events.WarpCreateEvent -import com.projectcitybuild.entities.events.WarpDeleteEvent -import com.projectcitybuild.integrations.SpigotIntegration -import com.projectcitybuild.pcbridge.core.modules.config.Config -import com.projectcitybuild.pcbridge.core.contracts.PlatformLogger -import com.projectcitybuild.repositories.WarpRepository -import org.bukkit.event.EventHandler -import org.bukkit.event.Listener -import org.bukkit.plugin.Plugin -import org.dynmap.DynmapAPI - -class DynmapMarkerIntegration( - private val plugin: Plugin, - private val warpRepository: WarpRepository, - private val config: Config, - private val logger: PlatformLogger, -) : Listener, SpigotIntegration { - - class DynmapAPINotFoundException : Exception("Dynmap plugin not found") - class DynmapMarkerIconNotFoundException : Exception() - - companion object { - private const val MARKER_SET_NAME = "pcbridge" - } - - private var dynmap: DynmapAPI? = null - - override fun onEnable() { - try { - val anyPlugin = plugin.server.pluginManager.getPlugin("dynmap") - if (anyPlugin == null) { - logger.warning("Cannot find dynmap plugin. Disabling marker integration") - return - } - if (anyPlugin !is DynmapAPI) { - logger.severe("Found dynmap plugin but cannot access dynmap-api") - throw DynmapAPINotFoundException() - } - - logger.info("dynmap integration enabled") - - dynmap = anyPlugin - plugin.server.pluginManager.registerEvents(this, plugin) - - updateWarpMarkers() - } catch (e: NoClassDefFoundError) { - logger.warning("dynmap either missing or failed to load. Disabling marker integration") - } - } - - override fun onDisable() { - if (dynmap != null) { - dynmap = null - } - } - - @EventHandler fun onWarpCreate(event: WarpCreateEvent) = updateWarpMarkers() - @EventHandler fun onWarpDelete(event: WarpDeleteEvent) = updateWarpMarkers() - - private fun updateWarpMarkers() { - val dynmap = dynmap - - if (dynmap == null) { - logger.verbose("Dynmap integration disabled. Skipping warp marker update") - return - } - - logger.verbose("Redrawing warp markers...") - - val markerAPI = dynmap.markerAPI - val markerLabel = "Warps" // This name shows up in the Dynmap web interface - - val warpMarkerSet = markerAPI.getMarkerSet(MARKER_SET_NAME) - ?: markerAPI.createMarkerSet( - MARKER_SET_NAME, - markerLabel, - null, // TODO: what is this? - false, // TODO: what is this? - ) - - warpMarkerSet.layerPriority = 1 - warpMarkerSet.hideByDefault = false - - warpMarkerSet.markers.forEach { - it.deleteMarker() - } - - val iconName = config.get().integrations.dynmap.warpIconName - val icon = markerAPI.getMarkerIcon(iconName) - ?: throw DynmapMarkerIconNotFoundException() - - warpRepository.all().forEach { warp -> - warpMarkerSet.createMarker( - "warp.${warp.name}", - warp.name, - warp.location.worldName, - warp.location.x, - warp.location.y, - warp.location.z, - icon, - false, // TODO: what is this? - ) - } - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/integrations/essentials/EssentialsIntegration.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/integrations/essentials/EssentialsIntegration.kt deleted file mode 100644 index 76e5ae8bc..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/integrations/essentials/EssentialsIntegration.kt +++ /dev/null @@ -1,57 +0,0 @@ -package com.projectcitybuild.integrations.essentials - -import com.earth2me.essentials.Essentials -import com.projectcitybuild.entities.events.PlayerPreWarpEvent -import com.projectcitybuild.integrations.SpigotIntegration -import com.projectcitybuild.pcbridge.core.contracts.PlatformLogger -import org.bukkit.event.EventHandler -import org.bukkit.event.Listener -import org.bukkit.plugin.Plugin - -class EssentialsIntegration( - private val plugin: Plugin, - private val logger: PlatformLogger, -) : Listener, SpigotIntegration { - - class EssentialsAPINotFoundException : Exception("Essentials plugin not found") - - private var essentials: Essentials? = null - - override fun onEnable() { - val anyPlugin = plugin.server.pluginManager.getPlugin("Essentials") - if (anyPlugin == null) { - logger.severe("Cannot find EssentialsX plugin. Disabling integration") - return - } - if (anyPlugin !is Essentials) { - logger.severe("Found EssentialsX plugin but cannot access API") - throw EssentialsAPINotFoundException() - } - - logger.info("Essentials integration enabled") - - essentials = anyPlugin - } - - override fun onDisable() { - if (essentials != null) { - essentials = null - } - } - - /** - * Sets the player's current position as their last known location - * in Essentials - */ - @EventHandler - fun onPlayerPreWarp(event: PlayerPreWarpEvent) { - val essentials = essentials - ?: return - - essentials - .getUser(event.player) - .setLastLocation() - - logger.verbose("Registered last location for ${event.player.name} with Essentials") - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/integrations/gadgetsmenu/GadgetsMenuIntegration.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/integrations/gadgetsmenu/GadgetsMenuIntegration.kt deleted file mode 100644 index da9e70343..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/integrations/gadgetsmenu/GadgetsMenuIntegration.kt +++ /dev/null @@ -1,79 +0,0 @@ -package com.projectcitybuild.integrations.gadgetsmenu - -import com.projectcitybuild.integrations.SpigotIntegration -import com.projectcitybuild.pcbridge.core.contracts.PlatformLogger -import com.projectcitybuild.repositories.CurrencyRepository -import com.yapzhenyie.GadgetsMenu.economy.GEconomyProvider -import com.yapzhenyie.GadgetsMenu.player.OfflinePlayerManager -import org.bukkit.event.Listener -import org.bukkit.plugin.Plugin - -class GadgetsMenuIntegration( - private val plugin: Plugin, - private val logger: PlatformLogger, - private val currencyRepository: CurrencyRepository, -) : Listener, SpigotIntegration { - - private var isEnabled = false - - override fun onEnable() { - if (plugin.server.pluginManager.isPluginEnabled("GadgetsMenu")) { - GEconomyProvider.setMysteryDustStorage( - CurrencyProvider(plugin, logger, currencyRepository) - ) - } else { - logger.warning("Cannot find GadgetsMenu plugin. Disabling integration") - return - } - logger.info("GadgetsMenu integration enabled") - - isEnabled = true - } - - override fun onDisable() { - isEnabled = false - } - - /** - * Hooks into GadgetsMenu's economy API to point at our own - * player currency repository. - * - * Note: all functions are called by GadgetsMenu on a background thread - */ - class CurrencyProvider constructor( - plugin: Plugin, - private val logger: PlatformLogger, - private val repository: CurrencyRepository, - ) : GEconomyProvider(plugin, "pcbridge") { - - override fun getMysteryDust(p0: OfflinePlayerManager?): Int { - if (p0 == null) { - logger.warning("Attempted to call getMysteryDust with a null OfflinePlayerManager") - return 0 - } - return repository.getBalance(playerUUID = p0.uuid) - } - - override fun setMysteryDust(p0: OfflinePlayerManager?, p1: Int): Boolean { - // Not permitted - return false - } - - override fun addMysteryDust(p0: OfflinePlayerManager?, p1: Int): Boolean { - // Not permitted - return false - } - - override fun removeMysteryDust(p0: OfflinePlayerManager?, p1: Int): Boolean { - if (p0 == null) { - logger.warning("Attempted to call removeMysteryDust with a null OfflinePlayerManager") - return false - } - return repository.deduct( - playerUUID = p0.uuid, - amount = p1, - reason = "Minecraft cosmetic purchase" - ) - } - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/integrations/luckperms/LuckPermsIntegration.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/integrations/luckperms/LuckPermsIntegration.kt deleted file mode 100644 index 7bae24994..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/integrations/luckperms/LuckPermsIntegration.kt +++ /dev/null @@ -1,57 +0,0 @@ -package com.projectcitybuild.integrations.luckperms - -import com.projectcitybuild.modules.chat.ChatGroupFormatter -import com.projectcitybuild.integrations.SpigotIntegration -import com.projectcitybuild.pcbridge.core.contracts.PlatformLogger -import net.luckperms.api.LuckPerms -import net.luckperms.api.LuckPermsProvider -import net.luckperms.api.event.EventSubscription -import net.luckperms.api.event.node.NodeMutateEvent -import net.luckperms.api.event.user.UserDataRecalculateEvent -import org.bukkit.event.Listener -import org.bukkit.plugin.Plugin - -class LuckPermsIntegration( - private val plugin: Plugin, - private val logger: PlatformLogger, - private val chatGroupFormatter: ChatGroupFormatter, -) : Listener, SpigotIntegration { - - private var isEnabled = false - private val eventSubscriptions: MutableList> = mutableListOf() - - private lateinit var luckPerms: LuckPerms - - override fun onEnable() { - try { - luckPerms = LuckPermsProvider.get() - } catch (e: Exception) { - logger.severe("Failed to hook into LuckPerms plugin") - return - } - logger.info("LuckPerms integration enabled") - - isEnabled = true - - listenForCacheInvalidation() - } - - override fun onDisable() { - isEnabled = false - } - - private fun listenForCacheInvalidation() { - eventSubscriptions.add( - luckPerms.eventBus.subscribe(plugin, UserDataRecalculateEvent::class.java) { event -> - chatGroupFormatter.flush(playerUUID = event.user.uniqueId) - } - ) - eventSubscriptions.add( - luckPerms.eventBus.subscribe(plugin, NodeMutateEvent::class.java) { event -> - if (event.isGroup) { - chatGroupFormatter.flushAllCaches() - } - } - ) - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/database/DataSource.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/database/DataSource.kt deleted file mode 100644 index e4b602acc..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/database/DataSource.kt +++ /dev/null @@ -1,84 +0,0 @@ -package com.projectcitybuild.libs.database - -import co.aikar.idb.DatabaseOptions -import co.aikar.idb.HikariPooledDatabase -import co.aikar.idb.PooledDatabaseOptions -import com.projectcitybuild.pcbridge.core.contracts.PlatformLogger - -class DataSource( - private val logger: PlatformLogger, - private val hostName: String, - private val port: Int = 3306, - private val databaseName: String, - private val username: String, - private val password: String, - private val shouldRunMigrations: Boolean, -) { - class DatabaseNotFoundException : Exception() - class UndeterminedMigrationVersion : Exception() - - private var database: HikariPooledDatabase? = null - - fun connect() { - val options = DatabaseOptions.builder() - .mysql(username, password, databaseName, "$hostName:$port") - .build() - - database = PooledDatabaseOptions.builder().options(options).createHikariDatabase() - - if (!hasDatabase(databaseName)) { - throw DatabaseNotFoundException() - } - if (shouldRunMigrations) { - val version = getVersion() - Migration.executeIfNecessary(database!!, logger, currentVersion = version) - } - } - - fun disconnect() { - database?.close() - } - - fun database(): HikariPooledDatabase { - return database ?: throw Exception("Not connected to a database yet") - } - - private fun getVersion(): Int { - if (!hasTable("meta")) { - return 0 - } - - val version = database!!.getFirstColumn("SELECT `version` FROM `meta` LIMIT 1") - return version ?: throw UndeterminedMigrationVersion() - } - - private fun hasDatabase(expectedName: String): Boolean { - var doesExist = false - val resultSet = database!!.connection.metaData.catalogs - while (resultSet.next()) { - val databaseName = resultSet.getString(1) - if (databaseName == expectedName) { - doesExist = true - break - } - } - resultSet.close() - - return doesExist - } - - private fun hasTable(expectedName: String): Boolean { - var doesExist = false - val resultSet = database!!.connection.metaData.getTables(null, null, null, arrayOf("TABLE")) - while (resultSet.next()) { - val tableName = resultSet.getString("TABLE_NAME") - if (tableName == expectedName) { - doesExist = true - break - } - } - resultSet.close() - - return doesExist - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/database/DatabaseMigration.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/database/DatabaseMigration.kt deleted file mode 100644 index b71ffa5bd..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/database/DatabaseMigration.kt +++ /dev/null @@ -1,8 +0,0 @@ -package com.projectcitybuild.libs.database - -import co.aikar.idb.HikariPooledDatabase - -interface DatabaseMigration { - val description: String - fun execute(database: HikariPooledDatabase) -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/database/Migration.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/database/Migration.kt deleted file mode 100644 index 02ce76faa..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/database/Migration.kt +++ /dev/null @@ -1,47 +0,0 @@ -package com.projectcitybuild.libs.database - -import co.aikar.idb.HikariPooledDatabase -import com.projectcitybuild.entities.migrations.* // ktlint-disable no-wildcard-imports -import com.projectcitybuild.pcbridge.core.contracts.PlatformLogger - -object Migration { - - private val migrations = arrayOf( - `20220114_first_time_run`(), - `20220115_player_configs_warps`(), - `20220120_teleport_history`(), - `20220201_add_hub`(), - `20220201_add_ip_bans`(), - `20220207_add_teleport_message_silencing`(), - `20220320_rename_queued_warps`(), - `20220505_delete_queues`(), - `20220530_delete_bungeecord_cols`(), - `202200821_add_badge_toggle`(), - ) - - fun executeIfNecessary( - database: HikariPooledDatabase, - logger: PlatformLogger, - currentVersion: Int - ) { - var version = currentVersion - val totalMigrations = migrations.size - - if (version >= totalMigrations) return - - while (version < totalMigrations) { - val migration = migrations[version] - logger.info("Running migration ${version + 1}: ${migration.description}") - migration.execute(database) - version++ - } - - if (currentVersion != totalMigrations) { - updateVersion(database, version) - } - } - - private fun updateVersion(database: HikariPooledDatabase, newVersion: Int) { - database.executeUpdate("UPDATE meta SET `version`=?", newVersion) - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/errorreporting/ErrorOutput.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/errorreporting/ErrorOutput.kt deleted file mode 100644 index 312951131..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/errorreporting/ErrorOutput.kt +++ /dev/null @@ -1,6 +0,0 @@ -package com.projectcitybuild.libs.errorreporting - -interface ErrorOutput { - fun start() - fun report(throwable: Throwable) -} \ No newline at end of file diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/errorreporting/ErrorReporter.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/errorreporting/ErrorReporter.kt deleted file mode 100644 index ed89fa537..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/errorreporting/ErrorReporter.kt +++ /dev/null @@ -1,13 +0,0 @@ -package com.projectcitybuild.libs.errorreporting - -class ErrorReporter( - private val outputs: List, -) { - fun start() { - outputs.forEach { it.start() } - } - - fun report(throwable: Throwable) { - outputs.forEach { it.report(throwable) } - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/errorreporting/outputs/PrintStackTraceOutput.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/errorreporting/outputs/PrintStackTraceOutput.kt deleted file mode 100644 index da59a8b33..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/errorreporting/outputs/PrintStackTraceOutput.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.projectcitybuild.libs.errorreporting.outputs - -import com.projectcitybuild.libs.errorreporting.ErrorOutput - -class PrintStackTraceOutput : ErrorOutput { - override fun start() {} - - override fun report(throwable: Throwable) { - throwable.printStackTrace() - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/errorreporting/outputs/SentryErrorOutput.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/errorreporting/outputs/SentryErrorOutput.kt deleted file mode 100644 index eb6926303..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/errorreporting/outputs/SentryErrorOutput.kt +++ /dev/null @@ -1,28 +0,0 @@ -package com.projectcitybuild.libs.errorreporting.outputs - -import com.projectcitybuild.pcbridge.core.modules.config.Config -import com.projectcitybuild.entities.ConfigData -import com.projectcitybuild.libs.errorreporting.ErrorOutput -import com.projectcitybuild.pcbridge.core.contracts.PlatformLogger -import io.sentry.Sentry - -class SentryErrorOutput( - private val config: Config, - private val logger: PlatformLogger, -) : ErrorOutput { - - override fun start() { - val isEnabled = config.get().errorReporting.isSentryEnabled - if (!isEnabled) return - - logger.info("Enabling error reporting") - - Sentry.init { options -> - options.dsn = config.get().errorReporting.sentryDsn - } - } - - override fun report(throwable: Throwable) { - Sentry.captureException(throwable) - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/nameguesser/NameGuesser.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/nameguesser/NameGuesser.kt deleted file mode 100644 index a704895a5..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/nameguesser/NameGuesser.kt +++ /dev/null @@ -1,58 +0,0 @@ -package com.projectcitybuild.libs.nameguesser - -class NameGuesser { - - /** - * Returns the closest matching String inside a collection. - * - * A String is considered to closely match if it matches exactly case-insensitive, - * or it begins with the given string (also case-insensitive). If multiple strings - * closely match, the nearest (alphabetically sorted) will be selected. For example, - * given "a" and ["ab", "abc"], "ab" will be returned. - * - * @param string The string to match against - * @param collection The collection to compare the string against - * @return The closest matching string, if found - */ - fun guessClosest(string: String, collection: Collection): String? { - return guessClosest(string, collection) { it } - } - - /** - * Returns the closest matching String inside a collection. - * - * A String is considered to closely match if it matches exactly case-insensitive, - * or it begins with the given string (also case-insensitive). If multiple strings - * closely match, the nearest (alphabetically sorted) will be selected. For example, - * given "a" and ["ab", "abc"], "ab" will be returned. - * - * @param string The string to match against - * @param collection The collection to compare the string against - * @param comparison A closure to transform each item into a String. For example, - * useful for converting Player objects into their display name - * @return The closest matching string, if found - */ - fun guessClosest(string: String, collection: Collection, comparison: (T) -> String): T? { - val searchString = string.lowercase() - - val partialMatches: MutableList = mutableListOf() - - collection.forEach { element -> - val elementString = comparison(element).lowercase() - if (elementString == searchString) { - return element - } - if (elementString.startsWith(searchString)) { - partialMatches.add(elementString) - } - } - - val closestMatchingString = partialMatches - .sorted() - .firstOrNull() - ?: return null - - return collection - .first { comparison(it).lowercase() == closestMatchingString } - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/playercache/PlayerConfigCache.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/playercache/PlayerConfigCache.kt deleted file mode 100644 index 98dde2517..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/playercache/PlayerConfigCache.kt +++ /dev/null @@ -1,28 +0,0 @@ -package com.projectcitybuild.libs.playercache - -import com.projectcitybuild.entities.PlayerConfig -import java.util.UUID - -/** - * A PlayerConfig memory cache for players currently online - * on any of the connected servers - */ -class PlayerConfigCache { - private val cache = HashMap() - - fun get(uuid: UUID): PlayerConfig? { - return cache[uuid] - } - - fun put(uuid: UUID, player: PlayerConfig) { - cache[uuid] = player - } - - fun remove(uuid: UUID) { - cache.remove(uuid) - } - - fun flush() { - cache.clear() - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/announcements/AnnouncementsModule.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/announcements/AnnouncementsModule.kt deleted file mode 100644 index 75cc5c9e0..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/announcements/AnnouncementsModule.kt +++ /dev/null @@ -1,25 +0,0 @@ -package com.projectcitybuild.modules.announcements - -import com.projectcitybuild.modules.announcements.actions.StartAnnouncementTimer -import com.projectcitybuild.support.modules.ModuleDeclaration -import com.projectcitybuild.support.modules.PluginModule - -class AnnouncementsModule: PluginModule { - private var action: StartAnnouncementTimer? = null - - override fun register(module: ModuleDeclaration) { - module { - action = StartAnnouncementTimer( - container.scheduledAnnouncementsRepository, - container.config, - container.timer, - container.spigotServer, - ) - action?.start() - } - } - - override fun unregister() { - action?.stop() - } -} \ No newline at end of file diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/announcements/actions/StartAnnouncementTimer.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/announcements/actions/StartAnnouncementTimer.kt deleted file mode 100644 index 033ffdd8f..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/announcements/actions/StartAnnouncementTimer.kt +++ /dev/null @@ -1,41 +0,0 @@ -package com.projectcitybuild.modules.announcements.actions - -import com.projectcitybuild.entities.ConfigData -import com.projectcitybuild.pcbridge.core.contracts.PlatformTimer -import com.projectcitybuild.pcbridge.core.modules.config.Config -import com.projectcitybuild.repositories.ScheduledAnnouncementsRepository -import com.projectcitybuild.support.spigot.SpigotServer -import net.md_5.bungee.api.chat.TextComponent -import java.util.concurrent.TimeUnit - -class StartAnnouncementTimer( - private val repository: ScheduledAnnouncementsRepository, - private val config: Config, - private val timer: PlatformTimer, - private val server: SpigotServer, -) { - private val timerId = "scheduled_announcements" - - fun start() { - val config = config.get() - val intervalInMins = config.announcements.intervalInMins - - timer.cancel(timerId) - timer.scheduleRepeating( - identifier = timerId, - delay = 0, - repeatingInterval = intervalInMins.toLong(), - unit = TimeUnit.MINUTES, - work = { - val message = repository.getNextAnnouncement() - server.broadcastMessage( - TextComponent(message) - ) - } - ) - } - - fun stop() { - timer.cancel(timerId) - } -} \ No newline at end of file diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/bin/BinModule.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/bin/BinModule.kt deleted file mode 100644 index 358d82de9..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/bin/BinModule.kt +++ /dev/null @@ -1,26 +0,0 @@ -package com.projectcitybuild.modules.buildtools.bin - -import com.projectcitybuild.entities.Permissions -import com.projectcitybuild.modules.buildtools.bin.commands.BinCommand -import com.projectcitybuild.modules.buildtools.bin.listeners.BinCloseListener -import com.projectcitybuild.support.modules.ModuleDeclaration -import com.projectcitybuild.support.modules.PluginModule -import dev.jorel.commandapi.executors.PlayerCommandExecutor - -class BinModule: PluginModule { - - override fun register(module: ModuleDeclaration) = module { - command("bin") { - withAliases("trash") - withPermission(Permissions.COMMAND_BUILD_BIN) - withShortDescription("Opens a temporary menu to dispose of items and blocks") - executesPlayer(PlayerCommandExecutor { player, _ -> - BinCommand(container.spigotServer).execute(player) - }) - } - - listener( - BinCloseListener() - ) - } -} \ No newline at end of file diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/bin/commands/BinCommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/bin/commands/BinCommand.kt deleted file mode 100644 index bf8872b96..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/bin/commands/BinCommand.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.projectcitybuild.modules.buildtools.bin.commands - -import com.projectcitybuild.support.spigot.SpigotServer -import org.bukkit.entity.Player - -class BinCommand( - private val spigotServer: SpigotServer, -) { - fun execute(player: Player) { - val inventory = spigotServer.createInventory( - owner = player, - size = 36, - title = "Garbage Bin", - ) - player.openInventory(inventory) - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/bin/listeners/BinCloseListener.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/bin/listeners/BinCloseListener.kt deleted file mode 100644 index 4b143110b..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/bin/listeners/BinCloseListener.kt +++ /dev/null @@ -1,32 +0,0 @@ -package com.projectcitybuild.modules.buildtools.bin.listeners - -import com.projectcitybuild.support.spigot.listeners.SpigotListener -import net.md_5.bungee.api.ChatColor -import net.md_5.bungee.api.chat.TextComponent -import org.bukkit.event.EventHandler -import org.bukkit.event.inventory.InventoryCloseEvent -import org.bukkit.event.inventory.InventoryType - -class BinCloseListener : SpigotListener { - - @EventHandler - override suspend fun handle(event: InventoryCloseEvent) { - if (event.inventory.type != InventoryType.CHEST) return - - val inventoryTitle = event.view.title - if (inventoryTitle != "Garbage Bin") return - - val disposedCount = event.inventory.contents - .filterNotNull() - .sumOf { it.amount } - - if (disposedCount == 0) return - - event.player.spigot().sendMessage( - TextComponent("Disposed of \uD83D\uDD25 $disposedCount items").apply { - color = ChatColor.GRAY - isItalic = true - } - ) - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/invisframes/InvisFramesModule.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/invisframes/InvisFramesModule.kt deleted file mode 100644 index d4b5f601b..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/invisframes/InvisFramesModule.kt +++ /dev/null @@ -1,41 +0,0 @@ -package com.projectcitybuild.modules.buildtools.invisframes - -import com.projectcitybuild.entities.Permissions -import com.projectcitybuild.modules.buildtools.invisframes.commands.InvisFrameCommand -import com.projectcitybuild.modules.buildtools.invisframes.listeners.FramePlaceListener -import com.projectcitybuild.modules.buildtools.invisframes.listeners.ItemInsertListener -import com.projectcitybuild.modules.buildtools.invisframes.listeners.ItemRemoveListener -import com.projectcitybuild.support.modules.ModuleDeclaration -import com.projectcitybuild.support.modules.PluginModule -import dev.jorel.commandapi.arguments.MultiLiteralArgument -import dev.jorel.commandapi.executors.PlayerCommandExecutor - -class InvisFramesModule: PluginModule { - - override fun register(module: ModuleDeclaration) = module { - command("invisframe") { - withPermission(Permissions.COMMAND_BUILD_INVIS_FRAME) - withShortDescription("Gives you an invisible item frame") - withOptionalArguments( - MultiLiteralArgument("type", listOf("glowing")) - ) - executesPlayer(PlayerCommandExecutor { player, args -> - val isGlowingFrame = args.get("type") == "glowing" - - InvisFrameCommand( - container.spigotNamespace - ).execute(player, isGlowingFrame) - }) - } - - listener( - FramePlaceListener(container.spigotNamespace), - ) - listener( - ItemInsertListener(container.spigotNamespace), - ) - listener( - ItemRemoveListener(container.spigotNamespace), - ) - } -} \ No newline at end of file diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/invisframes/commands/InvisFrameCommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/invisframes/commands/InvisFrameCommand.kt deleted file mode 100644 index 2a661cf9d..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/invisframes/commands/InvisFrameCommand.kt +++ /dev/null @@ -1,52 +0,0 @@ -package com.projectcitybuild.modules.buildtools.invisframes.commands - -import com.projectcitybuild.support.spigot.SpigotNamespace -import com.projectcitybuild.support.textcomponent.send -import org.bukkit.Material -import org.bukkit.entity.Player -import org.bukkit.inventory.ItemStack -import org.bukkit.persistence.PersistentDataType - -class InvisFrameCommand( - private val spigotNamespace: SpigotNamespace, -) { - fun execute(player: Player, isGlowingFrame: Boolean) { - val itemStack = if (isGlowingFrame) { - ItemStack(Material.GLOW_ITEM_FRAME) - } else { - ItemStack(Material.ITEM_FRAME) - } - val itemName = if (isGlowingFrame) { - "Invisible Glowing Frame" - } else { - "Invisible Item Frame" - } - - player.inventory.addItem(itemStack.apply { - /** - * Since we don't have direct access to NMS editing, we track an invisible frame with a tag. - * This tag is saved into the persistentDataContainer so that it persists with the object. - * - * - This command gives the player a tagged ItemStack of item frames - * - When the player hangs the frame (HangingPlaceEvent), we apply the tag to the placed entity - * - When the player places an item in the tagged frame (PlayerInteractEntityEvent), we hide the frame - * - When the player takes an item from the tagged frame (EntityDamageByEntityEvent), we show the frame - */ - if(itemMeta == null) throw Exception("ItemMeta cannot be null") - itemMeta = itemMeta?.apply { - setDisplayName(itemName) - persistentDataContainer.set( - spigotNamespace.invisibleKey, - PersistentDataType.BYTE, - 1, - ) - } - }) - - if (isGlowingFrame) { - player.send().info("You received an invisible glowing frame") - } else { - player.send().info("You received an invisible item frame") - } - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/invisframes/listeners/FramePlaceListener.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/invisframes/listeners/FramePlaceListener.kt deleted file mode 100644 index 047197b8c..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/invisframes/listeners/FramePlaceListener.kt +++ /dev/null @@ -1,36 +0,0 @@ -package com.projectcitybuild.modules.buildtools.invisframes.listeners - -import com.projectcitybuild.support.spigot.SpigotNamespace -import com.projectcitybuild.support.spigot.listeners.SpigotListener -import org.bukkit.entity.ItemFrame -import org.bukkit.event.EventHandler -import org.bukkit.event.hanging.HangingPlaceEvent -import org.bukkit.persistence.PersistentDataType - -class FramePlaceListener( - private val spigotNamespace: SpigotNamespace, -) : SpigotListener { - - @EventHandler - override suspend fun handle(event: HangingPlaceEvent) { - val entity = event.entity - - val isItemFrame = entity is ItemFrame - if (!isItemFrame) return - - val invisibleValue = event.itemStack?.itemMeta?.persistentDataContainer?.getOrDefault( - spigotNamespace.invisibleKey, - PersistentDataType.BYTE, - 0, - ) ?: 0.toByte() - val isInvisibleFrame = invisibleValue == 1.toByte() - - if (isInvisibleFrame) { - event.entity.persistentDataContainer.set( - spigotNamespace.invisibleKey, - PersistentDataType.BYTE, - 1, - ) - } - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/nightvision/NightVisionModule.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/nightvision/NightVisionModule.kt deleted file mode 100644 index 61f20a2e7..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/nightvision/NightVisionModule.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.projectcitybuild.modules.buildtools.nightvision - -import com.projectcitybuild.entities.Permissions -import com.projectcitybuild.modules.buildtools.nightvision.commands.NightVisionCommand -import com.projectcitybuild.support.commandapi.ToggleOption -import com.projectcitybuild.support.modules.ModuleDeclaration -import com.projectcitybuild.support.modules.PluginModule -import dev.jorel.commandapi.arguments.MultiLiteralArgument -import dev.jorel.commandapi.executors.PlayerCommandExecutor - -class NightVisionModule: PluginModule { - - override fun register(module: ModuleDeclaration) = module { - command("nv") { - withPermission(Permissions.COMMAND_BUILD_NIGHTVISION) - withAliases("nightvision") - withShortDescription("Toggles nightvision mode on or off") - withOptionalArguments( - MultiLiteralArgument("toggle", listOf("on", "off")) - ) - executesPlayer(PlayerCommandExecutor { player, args -> - val desiredState = when(args.get("toggle")) { - "on" -> ToggleOption.ON - "off" -> ToggleOption.OFF - else -> ToggleOption.UNSPECIFIED - } - NightVisionCommand().execute(player, desiredState) - }) - } - } -} \ No newline at end of file diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/nightvision/commands/NightVisionCommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/nightvision/commands/NightVisionCommand.kt deleted file mode 100644 index 8c81fdd44..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/nightvision/commands/NightVisionCommand.kt +++ /dev/null @@ -1,34 +0,0 @@ -package com.projectcitybuild.modules.buildtools.nightvision.commands - -import com.projectcitybuild.support.commandapi.ToggleOption -import com.projectcitybuild.support.textcomponent.send -import org.bukkit.entity.Player -import org.bukkit.potion.PotionEffect -import org.bukkit.potion.PotionEffectType - -class NightVisionCommand { - fun execute( - player: Player, - desiredState: ToggleOption, - ) { - val duration = Integer.MAX_VALUE - val amplifier = 1 - val potionEffectType = PotionEffectType.NIGHT_VISION - val potionEffect = PotionEffect(potionEffectType, duration, amplifier) - - val toggleOn = if (desiredState == ToggleOption.UNSPECIFIED) { - !player.hasPotionEffect(potionEffectType) - } else { - desiredState == ToggleOption.ON - } - - player.removePotionEffect(potionEffectType) - - if (toggleOn) { - player.addPotionEffect(potionEffect) - player.send().info("NightVision toggled on. Type /nv to turn it off") - } else { - player.send().info("NightVision toggled off") - } - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/chat/ChatBadgeFormatter.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/chat/ChatBadgeFormatter.kt deleted file mode 100644 index 0e131659c..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/chat/ChatBadgeFormatter.kt +++ /dev/null @@ -1,57 +0,0 @@ -package com.projectcitybuild.modules.chat - -import com.projectcitybuild.entities.ConfigData -import com.projectcitybuild.pcbridge.core.modules.config.Config -import com.projectcitybuild.repositories.ChatBadgeRepository -import com.projectcitybuild.repositories.PlayerConfigRepository -import com.projectcitybuild.support.textcomponent.add -import com.projectcitybuild.support.textcomponent.addIf -import net.md_5.bungee.api.ChatColor -import net.md_5.bungee.api.chat.HoverEvent -import net.md_5.bungee.api.chat.TextComponent -import net.md_5.bungee.api.chat.hover.content.Text -import java.util.UUID - -class ChatBadgeFormatter( - private val playerConfigRepository: PlayerConfigRepository, - private val chatBadgeRepository: ChatBadgeRepository, - private val config: Config, -) { - fun get(playerUUID: UUID): TextComponent? { - val playerConfig = playerConfigRepository.get(playerUUID) - if (playerConfig != null && playerConfig.isChatBadgeDisabled) { - return null - } - - val badges = chatBadgeRepository.get(playerUUID) - if (badges.isEmpty()) { - return null - } - - val formattedBadges = badges.withIndex().map { (index, badge) -> - TextComponent() - .add(badge.unicodeIcon) - .add(" ") { it.color = ChatColor.WHITE } - .add(badge.displayName) - .addIf(index < badges.size - 1, "\n") - .toLegacyText() - } - - val tc = TextComponent() - TextComponent - .fromLegacyText(config.get().chatBadge.icon) - .forEach { c -> - tc.add(c) { - it.hoverEvent = HoverEvent( - HoverEvent.Action.SHOW_TEXT, - Text(formattedBadges.joinToString(separator = "")) - ) - } - } - - tc.add(" ") { - it.color = ChatColor.WHITE - } - return tc - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/chat/ChatGroupFormatter.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/chat/ChatGroupFormatter.kt deleted file mode 100644 index aac5b369b..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/chat/ChatGroupFormatter.kt +++ /dev/null @@ -1,131 +0,0 @@ -package com.projectcitybuild.modules.chat - -import com.projectcitybuild.entities.ConfigData -import com.projectcitybuild.pcbridge.core.modules.config.Config -import com.projectcitybuild.libs.permissions.Permissions -import net.md_5.bungee.api.chat.BaseComponent -import net.md_5.bungee.api.chat.HoverEvent -import net.md_5.bungee.api.chat.TextComponent -import net.md_5.bungee.api.chat.hover.content.Text -import java.util.UUID - -class ChatGroupFormatter( - private val permissions: Permissions, - private val config: Config, -) { - data class Aggregate( - val prefix: List, - val suffix: List, - val groups: TextComponent, - ) - - enum class GroupType { - TRUST, - BUILD, - DONOR, - } - - private val groupPriorities: MutableMap> = mutableMapOf() - private val cache: MutableMap = mutableMapOf() - - fun get(playerUUID: UUID): Aggregate { - val cached = cache[playerUUID] - if (cached != null) { - return cached - } - return buildAggregate(playerUUID = playerUUID) - .also { cache[playerUUID] = it } - } - - fun flushAllCaches() { - cache.clear() - groupPriorities.clear() - } - - fun flush(playerUUID: UUID) { - cache.remove(playerUUID) - } - - private fun buildAggregate(playerUUID: UUID): Aggregate { - if (groupPriorities.isEmpty()) { - buildGroupList() - } - - val groupNames = permissions.getUserGroups(playerUUID) - - var highestTrust: Pair? = null - var highestBuild: Pair? = null - var highestDonor: Pair? = null - - for (groupName in groupNames) { - val lowercaseGroupName = groupName.lowercase() - val (groupType, priorityIndex) = groupPriorities[lowercaseGroupName] - ?: continue - - when (groupType) { - GroupType.TRUST -> if (highestTrust == null || priorityIndex < highestTrust.first) { - highestTrust = Pair(priorityIndex, groupName) - } - GroupType.BUILD -> if (highestBuild == null || priorityIndex < highestBuild.first) { - highestBuild = Pair(priorityIndex, groupName) - } - GroupType.DONOR -> if (highestDonor == null || priorityIndex < highestDonor.first) { - highestDonor = Pair(priorityIndex, groupName) - } - } - } - - val groupTC = TextComponent() - - if (highestDonor != null) { - groupTextComponent(highestDonor).forEach { groupTC.addExtra(it) } - } - if (highestTrust != null) { - groupTextComponent(highestTrust).forEach { groupTC.addExtra(it) } - } - if (highestBuild != null) { - groupTextComponent(highestBuild).forEach { groupTC.addExtra(it) } - } - - val prefix = TextComponent.fromLegacyText(permissions.getUserPrefix(playerUUID)).toList() - val suffix = TextComponent.fromLegacyText(permissions.getUserSuffix(playerUUID)).toList() - - return Aggregate( - prefix = prefix, - suffix = suffix, - groups = groupTC, - ) - } - - private fun groupTextComponent(group: Pair): Array { - val groupName = group.second - val hoverName = permissions.getGroupMetaData(groupName = groupName, key = "chat_hover_name") - val displayName = permissions.getGroupMetaData(groupName = groupName, key = "chat_display_name") - ?: permissions.getGroupDisplayName(groupName) - ?: group.second - - return TextComponent - .fromLegacyText(displayName) - .also { tc -> - if (!hoverName.isNullOrEmpty()) { - tc.forEach { it.hoverEvent = HoverEvent(HoverEvent.Action.SHOW_TEXT, Text(hoverName)) } - } - } - } - - private fun buildGroupList() { - val trustedGroupPriority = config.get().groups.displayPriority.trust - val builderGroupPriority = config.get().groups.displayPriority.builder - val donorGroupPriority = config.get().groups.displayPriority.donor - - trustedGroupPriority.withIndex().forEach { - groupPriorities[it.value.lowercase()] = Pair(GroupType.TRUST, it.index) - } - builderGroupPriority.withIndex().forEach { - groupPriorities[it.value.lowercase()] = Pair(GroupType.BUILD, it.index) - } - donorGroupPriority.withIndex().forEach { - groupPriorities[it.value.lowercase()] = Pair(GroupType.DONOR, it.index) - } - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/chat/ChatModule.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/chat/ChatModule.kt deleted file mode 100644 index 2ae30ca73..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/chat/ChatModule.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.projectcitybuild.modules.chat - -import com.projectcitybuild.entities.Permissions -import com.projectcitybuild.modules.chat.commands.BadgeCommand -import com.projectcitybuild.modules.chat.listeners.AsyncPlayerChatListener -import com.projectcitybuild.modules.chat.listeners.EmojiChatListener -import com.projectcitybuild.modules.chat.listeners.SyncBadgesOnJoinListener -import com.projectcitybuild.support.commandapi.ToggleOption -import com.projectcitybuild.support.modules.ModuleDeclaration -import com.projectcitybuild.support.modules.PluginModule -import dev.jorel.commandapi.arguments.MultiLiteralArgument -import dev.jorel.commandapi.executors.PlayerCommandExecutor - -class ChatModule: PluginModule { - - override fun register(module: ModuleDeclaration) = module { - command("badge") { - withPermission(Permissions.COMMAND_CHAT_TOGGLE_BADGE) - withShortDescription("Shows or hides your chat badge") - withOptionalArguments( - MultiLiteralArgument("toggle", listOf("on", "off")) - ) - executesPlayer(PlayerCommandExecutor { player, args -> - val desiredState = when(args.get("toggle")) { - "on" -> ToggleOption.ON - "off" -> ToggleOption.OFF - else -> ToggleOption.UNSPECIFIED - } - BadgeCommand( - container.playerConfigRepository, - ).execute(player, desiredState) - }) - } - - listener( - AsyncPlayerChatListener( - container.server, - container.playerConfigRepository, - container.chatGroupFormatter, - container.chatBadgeFormatter, - ), - ) - listener(EmojiChatListener()) - listener( - SyncBadgesOnJoinListener( - container.chatBadgeRepository, - ) - ) - } -} \ No newline at end of file diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/chat/commands/BadgeCommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/chat/commands/BadgeCommand.kt deleted file mode 100644 index 0f3afb7d1..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/chat/commands/BadgeCommand.kt +++ /dev/null @@ -1,28 +0,0 @@ -package com.projectcitybuild.modules.chat.commands - -import com.projectcitybuild.repositories.PlayerConfigRepository -import com.projectcitybuild.support.commandapi.ToggleOption -import com.projectcitybuild.support.textcomponent.send -import org.bukkit.entity.Player - -class BadgeCommand( - private val playerConfigRepository: PlayerConfigRepository, -) { - fun execute(commandSender: Player, desiredState: ToggleOption) { - val playerConfig = playerConfigRepository.get(commandSender.uniqueId)!! - - val shouldHideBadge = if (desiredState == ToggleOption.UNSPECIFIED) { - !playerConfig.isChatBadgeDisabled - } else { - desiredState == ToggleOption.OFF - } - playerConfig.isChatBadgeDisabled = shouldHideBadge - playerConfigRepository.save(playerConfig) - - if (shouldHideBadge) { - commandSender.send().success("Your chat badge has been turned off") - } else { - commandSender.send().success("Your chat badge has been turned on") - } - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/chat/listeners/AsyncPlayerChatListener.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/chat/listeners/AsyncPlayerChatListener.kt deleted file mode 100644 index 312376ebe..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/chat/listeners/AsyncPlayerChatListener.kt +++ /dev/null @@ -1,60 +0,0 @@ -package com.projectcitybuild.modules.chat.listeners - -import com.projectcitybuild.modules.chat.ChatBadgeFormatter -import com.projectcitybuild.modules.chat.ChatGroupFormatter -import com.projectcitybuild.repositories.PlayerConfigRepository -import com.projectcitybuild.support.spigot.listeners.SpigotListener -import com.projectcitybuild.support.textcomponent.add -import com.projectcitybuild.support.textcomponent.send -import net.md_5.bungee.api.ChatColor -import net.md_5.bungee.api.chat.TextComponent -import org.bukkit.Server -import org.bukkit.event.EventHandler -import org.bukkit.event.EventPriority -import org.bukkit.event.player.AsyncPlayerChatEvent - -// TODO: split this up and move it to appropriate modules -class AsyncPlayerChatListener( - private val server: Server, - private val playerConfigRepository: PlayerConfigRepository, - private val chatGroupFormatter: ChatGroupFormatter, - private val chatBadgeFormatter: ChatBadgeFormatter, -) : SpigotListener { - - @EventHandler(priority = EventPriority.HIGHEST) - override suspend fun handle(event: AsyncPlayerChatEvent) { - val senderConfig = playerConfigRepository.get(event.player.uniqueId)!! - if (senderConfig.isMuted) { - event.player.send().error("You cannot talk while muted") - event.isCancelled = true - return - } - - // Semi-dangerous workaround for other plugins not receiving chat. - // - // The typical way to format chat would be to modify the message in the event, - // however that doesn't support HoverText, which we need because all our groups - // are abbreviated and similar-looking. - // - // We can't cancel the chat event either, as that would prevent other plugins - // like DiscordSRV from receiving the message and sending it to Discord. This is a - // hack that lets the original message be sent (and seen by other plugins), but - // will essentially be cancelled for any online players. - event.recipients.clear() - - val format = chatGroupFormatter.get(playerUUID = event.player.uniqueId) - val badges = chatBadgeFormatter.get(playerUUID = event.player.uniqueId) - - val tc = TextComponent() - .add(badges) - .add(format.prefix) - .add(format.groups) - .add(" ") { it.color = ChatColor.WHITE } - .add(TextComponent.fromLegacyText(event.player.displayName)) - .add(format.suffix) - .add(": ") { it.color = ChatColor.WHITE } - .add(TextComponent.fromLegacyText(event.message)) - - server.onlinePlayers.forEach { it.spigot().sendMessage(tc) } - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/chat/listeners/EmojiChatListener.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/chat/listeners/EmojiChatListener.kt deleted file mode 100644 index 3db728cf3..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/chat/listeners/EmojiChatListener.kt +++ /dev/null @@ -1,30 +0,0 @@ -package com.projectcitybuild.modules.chat.listeners - -import com.projectcitybuild.support.spigot.listeners.SpigotListener -import org.bukkit.event.EventHandler -import org.bukkit.event.player.AsyncPlayerChatEvent - -class EmojiChatListener: SpigotListener { - - companion object { - val emojis: Map = mapOf( - Pair(":skull:", "☠"), - Pair(":heart:", "❤"), - Pair(":fire:", "\uD83D\uDD25"), - Pair(":tm:", "™"), - ) - - val regex = emojis.keys - .joinToString(separator = "|") - .let { pattern -> "(?i)($pattern)" } // Add case-insensitivity - .toRegex() - } - - @EventHandler - override suspend fun handle(event: AsyncPlayerChatEvent) { - event.message = event.message.replace( - regex = regex, - transform = { match -> emojis[match.value.lowercase()] ?: match.value }, - ) - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/chat/listeners/SyncBadgesOnJoinListener.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/chat/listeners/SyncBadgesOnJoinListener.kt deleted file mode 100644 index 70542fa8c..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/chat/listeners/SyncBadgesOnJoinListener.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.projectcitybuild.modules.chat.listeners - -import com.projectcitybuild.entities.events.ConnectionPermittedEvent -import com.projectcitybuild.repositories.ChatBadgeRepository -import com.projectcitybuild.support.spigot.listeners.SpigotListener -import org.bukkit.event.EventHandler - -class SyncBadgesOnJoinListener( - private val chatBadgeRepository: ChatBadgeRepository, -): SpigotListener { - - @EventHandler - override suspend fun handle(event: ConnectionPermittedEvent) { - chatBadgeRepository.put(event.playerUUID, event.aggregate.badges) - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/JoinMessagesModule.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/JoinMessagesModule.kt deleted file mode 100644 index bce068899..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/JoinMessagesModule.kt +++ /dev/null @@ -1,42 +0,0 @@ -package com.projectcitybuild.modules.joinmessages - -import com.projectcitybuild.modules.joinmessages.listeners.AnnounceJoinListener -import com.projectcitybuild.modules.joinmessages.listeners.AnnounceQuitListener -import com.projectcitybuild.modules.joinmessages.listeners.FirstTimeJoinListener -import com.projectcitybuild.modules.joinmessages.listeners.ServerOverviewJoinListener -import com.projectcitybuild.support.modules.ModuleDeclaration -import com.projectcitybuild.support.modules.PluginModule - -class JoinMessagesModule: PluginModule { - override fun register(module: ModuleDeclaration) { - module { - listener( - AnnounceJoinListener( - container.spigotServer, - container.config, - container.playerJoinTimeCache, - ), - ) - listener( - AnnounceQuitListener( - container.spigotServer, - container.config, - container.playerJoinTimeCache, - container.time, - ), - ) - listener( - FirstTimeJoinListener( - container.spigotServer, - container.config, - container.logger, - ), - ) - listener( - ServerOverviewJoinListener( - container.config, - ), - ) - } - } -} \ No newline at end of file diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/PlayerJoinTimeCache.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/PlayerJoinTimeCache.kt deleted file mode 100644 index 4e7fa60d8..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/PlayerJoinTimeCache.kt +++ /dev/null @@ -1,23 +0,0 @@ -package com.projectcitybuild.modules.joinmessages - -import com.projectcitybuild.pcbridge.core.modules.datetime.time.Time -import java.time.LocalDateTime -import java.util.UUID - -class PlayerJoinTimeCache( - private val time: Time, -) { - private val joinTimes: MutableMap = mutableMapOf() - - fun get(uuid: UUID): LocalDateTime? { - return joinTimes[uuid] - } - - fun put(uuid: UUID) { - joinTimes[uuid] = time.now() - } - - fun remove(uuid: UUID) { - joinTimes.remove(uuid) - } -} \ No newline at end of file diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/listeners/AnnounceJoinListener.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/listeners/AnnounceJoinListener.kt deleted file mode 100644 index 590a2ad67..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/listeners/AnnounceJoinListener.kt +++ /dev/null @@ -1,29 +0,0 @@ -package com.projectcitybuild.modules.joinmessages.listeners - -import com.projectcitybuild.entities.ConfigData -import com.projectcitybuild.modules.joinmessages.PlayerJoinTimeCache -import com.projectcitybuild.pcbridge.core.modules.config.Config -import com.projectcitybuild.support.spigot.SpigotServer -import com.projectcitybuild.support.spigot.listeners.SpigotListener -import net.md_5.bungee.api.chat.TextComponent -import org.bukkit.event.EventHandler -import org.bukkit.event.player.PlayerJoinEvent - -class AnnounceJoinListener( - private val server: SpigotServer, - private val config: Config, - private val playerJoinTimeCache: PlayerJoinTimeCache, -) : SpigotListener { - - @EventHandler - override suspend fun handle(event: PlayerJoinEvent) { - playerJoinTimeCache.put(event.player.uniqueId) - - val message = config.get().messages.join - .replace("%name%", event.player.name) - - server.broadcastMessage( - TextComponent(message) - ) - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/listeners/AnnounceQuitListener.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/listeners/AnnounceQuitListener.kt deleted file mode 100644 index 9f5441fd1..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/listeners/AnnounceQuitListener.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.projectcitybuild.modules.joinmessages.listeners - -import com.projectcitybuild.entities.ConfigData -import com.projectcitybuild.modules.joinmessages.PlayerJoinTimeCache -import com.projectcitybuild.pcbridge.core.modules.config.Config -import com.projectcitybuild.pcbridge.core.modules.datetime.time.Time -import com.projectcitybuild.support.spigot.SpigotServer -import com.projectcitybuild.support.spigot.listeners.SpigotListener -import net.md_5.bungee.api.chat.TextComponent -import org.bukkit.event.EventHandler -import org.bukkit.event.player.PlayerQuitEvent -import java.time.Duration - -class AnnounceQuitListener( - private val server: SpigotServer, - private val config: Config, - private val playerJoinTimeCache: PlayerJoinTimeCache, - private val time: Time, -) : SpigotListener { - - @EventHandler - override suspend fun handle(event: PlayerQuitEvent) { - val joinTime = playerJoinTimeCache - .get(event.player.uniqueId) ?: time.now() - playerJoinTimeCache.remove(event.player.uniqueId) - - val now = time.now() - val diff = Duration.between(joinTime, now) - - val secsOnline = diff.toSeconds() - val minsOnline = diff.toMinutes() - val hoursOnline = diff.toHours() - - val timeOnline = if (secsOnline < 60) { - "$secsOnline sec" + if (secsOnline > 1) "s" else "" - } else if(minsOnline < 60) { - "$minsOnline min" + if (minsOnline > 1) "s" else "" - } else { - "$hoursOnline hour" + if (hoursOnline > 1) "s" else "" - } - - val message = config.get().messages.leave - .replace("%name%", event.player.name) - .replace("%time_online%", timeOnline) - - server.broadcastMessage( - TextComponent(message) - ) - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/listeners/FirstTimeJoinListener.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/listeners/FirstTimeJoinListener.kt deleted file mode 100644 index 838fb0342..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/listeners/FirstTimeJoinListener.kt +++ /dev/null @@ -1,29 +0,0 @@ -package com.projectcitybuild.modules.joinmessages.listeners - -import com.projectcitybuild.entities.ConfigData -import com.projectcitybuild.entities.events.FirstTimeJoinEvent -import com.projectcitybuild.pcbridge.core.contracts.PlatformLogger -import com.projectcitybuild.pcbridge.core.modules.config.Config -import com.projectcitybuild.support.spigot.SpigotServer -import com.projectcitybuild.support.spigot.listeners.SpigotListener -import net.md_5.bungee.api.chat.TextComponent -import org.bukkit.event.EventHandler - -class FirstTimeJoinListener( - private val server: SpigotServer, - private val config: Config, - private val logger: PlatformLogger, -) : SpigotListener { - - @EventHandler - override suspend fun handle(event: FirstTimeJoinEvent) { - logger.debug("Sending first-time welcome message for ${event.player.name}") - - val message = config.get().messages.firstTimeJoin - .replace("%name%", event.player.name) - - server.broadcastMessage( - TextComponent(message) - ) - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/listeners/ServerOverviewJoinListener.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/listeners/ServerOverviewJoinListener.kt deleted file mode 100644 index 77463aba8..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/joinmessages/listeners/ServerOverviewJoinListener.kt +++ /dev/null @@ -1,22 +0,0 @@ -package com.projectcitybuild.modules.joinmessages.listeners - -import com.projectcitybuild.entities.ConfigData -import com.projectcitybuild.pcbridge.core.modules.config.Config -import com.projectcitybuild.support.spigot.listeners.SpigotListener -import net.md_5.bungee.api.chat.TextComponent -import org.bukkit.event.EventHandler -import org.bukkit.event.player.PlayerJoinEvent - -class ServerOverviewJoinListener( - private val config: Config, -) : SpigotListener { - - @EventHandler - override suspend fun handle(event: PlayerJoinEvent) { - val message = config.get().messages.welcome - - event.player.spigot().sendMessage( - TextComponent(message) - ) - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/bans/BansModule.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/bans/BansModule.kt deleted file mode 100644 index 0ff94077d..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/bans/BansModule.kt +++ /dev/null @@ -1,144 +0,0 @@ -package com.projectcitybuild.modules.moderation.bans - -import com.projectcitybuild.entities.Permissions -import com.projectcitybuild.modules.moderation.bans.actions.AuthoriseConnection -import com.projectcitybuild.modules.moderation.bans.actions.BanIP -import com.projectcitybuild.modules.moderation.bans.actions.BanUUID -import com.projectcitybuild.modules.moderation.bans.actions.CheckUUIDBan -import com.projectcitybuild.modules.moderation.bans.actions.UnbanIP -import com.projectcitybuild.modules.moderation.bans.actions.UnbanUUID -import com.projectcitybuild.modules.moderation.bans.commands.BanCommand -import com.projectcitybuild.modules.moderation.bans.commands.BanIPCommand -import com.projectcitybuild.modules.moderation.bans.commands.CheckBanCommand -import com.projectcitybuild.modules.moderation.bans.commands.UnbanCommand -import com.projectcitybuild.modules.moderation.bans.commands.UnbanIPCommand -import com.projectcitybuild.modules.moderation.bans.listeners.CheckBanOnConnectListener -import com.projectcitybuild.support.commandapi.suspendExecutesPlayer -import com.projectcitybuild.support.modules.ModuleDeclaration -import com.projectcitybuild.support.modules.PluginModule -import dev.jorel.commandapi.arguments.ArgumentSuggestions -import dev.jorel.commandapi.arguments.GreedyStringArgument -import dev.jorel.commandapi.arguments.StringArgument - -class BansModule: PluginModule { - - override fun register(module: ModuleDeclaration) = module { - command("ban") { - withPermission(Permissions.COMMAND_BANS_BAN) - withShortDescription("Bans a player from connecting to the server") - withArguments( - StringArgument("player") - .replaceSuggestions( - ArgumentSuggestions.strings(container.server.onlinePlayers.map { it.name }) - ), - GreedyStringArgument("reason"), - ) - suspendExecutesPlayer(container.plugin) { player, args -> - BanCommand( - BanUUID( - container.playerBanRepository, - container.playerUUIDRepository, - container.spigotServer, - ), - ).execute( - commandSender = player, - targetPlayerName = args.get("player") as String, - reason = args.get("reason") as String - ) - } - } - - command("banip") { - withPermission(Permissions.COMMAND_BANS_BAN_IP) - withShortDescription("Bans an IP address from connecting to the server") - withArguments( - StringArgument("player") - .replaceSuggestions( - ArgumentSuggestions.strings(container.server.onlinePlayers.map { it.name }) - ) - , - GreedyStringArgument("reason"), - ) - suspendExecutesPlayer(container.plugin) { player, args -> - BanIPCommand( - container.server, - BanIP( - container.ipBanRepository, - container.spigotServer, - ), - ).execute( - commandSender = player, - target = args.get("player") as String, - reason = args.get("reason") as String - ) - } - } - - command("checkban") { - withPermission(Permissions.COMMAND_BANS_CHECK_BAN) - withShortDescription("Checks whether a player is currently banned from the server") - withArguments( - StringArgument("player"), - ) - suspendExecutesPlayer(container.plugin) { player, args -> - CheckBanCommand( - CheckUUIDBan( - container.playerBanRepository, - container.playerUUIDRepository, - container.dateTimeFormatter, - ), - ).execute( - commandSender = player, - targetPlayerName = args.get("player") as String, - ) - } - } - - command("unban") { - withPermission(Permissions.COMMAND_BANS_UNBAN) - withShortDescription("Allows a banned player to connect to the server again") - withArguments( - StringArgument("player"), - ) - suspendExecutesPlayer(container.plugin) { player, args -> - UnbanCommand( - UnbanUUID( - container.playerBanRepository, - container.playerUUIDRepository, - container.server, - ), - ).execute( - commandSender = player, - targetPlayerName = args.get("player") as String, - ) - } - } - - command("unbanip") { - withPermission(Permissions.COMMAND_BANS_UNBAN_IP) - withShortDescription("Allows the given IP to connect to the server") - withArguments( - StringArgument("ip"), - ) - suspendExecutesPlayer(container.plugin) { player, args -> - UnbanIPCommand( - UnbanIP(container.ipBanRepository) - ).execute( - commandSender = player, - targetIP = args.get("ip") as String, - ) - } - } - - listener( - CheckBanOnConnectListener( - container.aggregateRepository, - AuthoriseConnection(), - container.logger, - container.dateTimeFormatter, - container.errorReporter, - container.localEventBroadcaster, - ), - ) - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/bans/actions/BanUUID.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/bans/actions/BanUUID.kt deleted file mode 100644 index 375c8fce9..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/bans/actions/BanUUID.kt +++ /dev/null @@ -1,60 +0,0 @@ -package com.projectcitybuild.modules.moderation.bans.actions - -import com.projectcitybuild.pcbridge.core.utils.Failure -import com.projectcitybuild.pcbridge.core.utils.Result -import com.projectcitybuild.pcbridge.core.utils.Success -import com.projectcitybuild.pcbridge.http.services.pcb.UUIDBanHttpService -import com.projectcitybuild.repositories.PlayerBanRepository -import com.projectcitybuild.repositories.PlayerUUIDRepository -import com.projectcitybuild.support.spigot.SpigotServer -import net.md_5.bungee.api.ChatColor -import net.md_5.bungee.api.chat.TextComponent -import java.util.UUID - -class BanUUID( - private val playerBanRepository: PlayerBanRepository, - private val playerUUIDRepository: PlayerUUIDRepository, - private val server: SpigotServer, -) { - enum class FailureReason { - PlayerDoesNotExist, - PlayerAlreadyBanned, - } - - suspend fun ban( - targetPlayerName: String, - bannerUUID: UUID?, - bannerName: String, - reason: String? - ): Result { - try { - val targetPlayerUUID = playerUUIDRepository.get(targetPlayerName) - ?: return Failure(FailureReason.PlayerDoesNotExist) - - playerBanRepository.ban( - targetPlayerUUID = targetPlayerUUID, - targetPlayerName = targetPlayerName, - bannerPlayerUUID = bannerUUID, - bannerPlayerName = bannerName, - reason = reason - ) - - server.kickByUUID( - playerUUID = targetPlayerUUID, - reason = "You have been banned.\n\nAppeal @ projectcitybuild.com", - context = SpigotServer.KickContext.FATAL, - ) - - server.broadcastMessage( - TextComponent("$targetPlayerName has been banned by $bannerName: ${reason ?: "No reason given"}").apply { - color = ChatColor.GRAY - isItalic = true - } - ) - - return Success(Unit) - } catch (e: UUIDBanHttpService.UUIDAlreadyBannedException) { - return Failure(FailureReason.PlayerAlreadyBanned) - } - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/bans/actions/CheckUUIDBan.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/bans/actions/CheckUUIDBan.kt deleted file mode 100644 index 0ee288807..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/bans/actions/CheckUUIDBan.kt +++ /dev/null @@ -1,41 +0,0 @@ -package com.projectcitybuild.modules.moderation.bans.actions - -import com.projectcitybuild.pcbridge.core.modules.datetime.formatter.DateTimeFormatter -import com.projectcitybuild.pcbridge.core.utils.Failure -import com.projectcitybuild.pcbridge.core.utils.Result -import com.projectcitybuild.pcbridge.core.utils.Success -import com.projectcitybuild.repositories.PlayerBanRepository -import com.projectcitybuild.repositories.PlayerUUIDRepository - -class CheckUUIDBan( - private val playerBanRepository: PlayerBanRepository, - private val playerUUIDRepository: PlayerUUIDRepository, - private val dateTimeFormatter: DateTimeFormatter, -) { - enum class FailureReason { - PLAYER_DOES_NOT_EXIST, - } - - data class BanRecord( - val reason: String, - val dateOfBan: String, - val expiryDate: String, - ) - - suspend fun getBan( - targetPlayerName: String - ): Result { - val targetPlayerUUID = playerUUIDRepository.get(targetPlayerName) - ?: return Failure(FailureReason.PLAYER_DOES_NOT_EXIST) - - val ban = playerBanRepository.get(targetPlayerUUID = targetPlayerUUID) - ?: return Success(null) - - val banRecord = BanRecord( - reason = ban.reason ?: "No reason given", - dateOfBan = ban.createdAt.let { dateTimeFormatter.convert(it) }, - expiryDate = ban.expiresAt?.let { dateTimeFormatter.convert(it) } ?: "Never" - ) - return Success(banRecord) - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/bans/actions/TempBanUUID.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/bans/actions/TempBanUUID.kt deleted file mode 100644 index 12912a4fe..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/bans/actions/TempBanUUID.kt +++ /dev/null @@ -1,62 +0,0 @@ -package com.projectcitybuild.modules.moderation.bans.actions - -import com.projectcitybuild.pcbridge.core.utils.Failure -import com.projectcitybuild.pcbridge.core.utils.Result -import com.projectcitybuild.pcbridge.core.utils.Success -import com.projectcitybuild.pcbridge.http.services.pcb.UUIDBanHttpService -import com.projectcitybuild.repositories.PlayerBanRepository -import com.projectcitybuild.repositories.PlayerUUIDRepository -import com.projectcitybuild.support.spigot.SpigotServer -import net.md_5.bungee.api.ChatColor -import net.md_5.bungee.api.chat.TextComponent -import java.util.UUID - -class TempBanUUID( - private val playerBanRepository: PlayerBanRepository, - private val playerUUIDRepository: PlayerUUIDRepository, - private val server: SpigotServer, -) { - enum class FailureReason { - PlayerDoesNotExist, - PlayerAlreadyBanned, - } - - suspend fun ban( - targetPlayerName: String, - bannerUUID: UUID?, - bannerName: String, - reason: String?, - expiryDate: Long, - ): Result { - try { - val targetPlayerUUID = playerUUIDRepository.get(targetPlayerName) - ?: return Failure(FailureReason.PlayerDoesNotExist) - - playerBanRepository.ban( - targetPlayerUUID = targetPlayerUUID, - targetPlayerName = targetPlayerName, - bannerPlayerUUID = bannerUUID, - bannerPlayerName = bannerName, - reason = reason, - expiryDate = expiryDate, - ) - - server.kickByUUID( - playerUUID = targetPlayerUUID, - reason = "You have been banned.\n\nAppeal @ projectcitybuild.com", - context = SpigotServer.KickContext.FATAL, - ) - - server.broadcastMessage( - TextComponent("$targetPlayerName has been temporarily banned by $bannerName: ${reason ?: "No reason given"}").apply { - color = ChatColor.GRAY - isItalic = true - } - ) - - return Success(Unit) - } catch (e: UUIDBanHttpService.UUIDAlreadyBannedException) { - return Failure(FailureReason.PlayerAlreadyBanned) - } - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/bans/actions/UnbanUUID.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/bans/actions/UnbanUUID.kt deleted file mode 100644 index 15d2807a3..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/bans/actions/UnbanUUID.kt +++ /dev/null @@ -1,49 +0,0 @@ -package com.projectcitybuild.modules.moderation.bans.actions - -import com.projectcitybuild.pcbridge.core.utils.Failure -import com.projectcitybuild.pcbridge.core.utils.Result -import com.projectcitybuild.pcbridge.core.utils.Success -import com.projectcitybuild.pcbridge.http.services.pcb.UUIDBanHttpService -import com.projectcitybuild.repositories.PlayerBanRepository -import com.projectcitybuild.repositories.PlayerUUIDRepository -import net.md_5.bungee.api.ChatColor -import net.md_5.bungee.api.chat.TextComponent -import org.bukkit.Server -import java.util.UUID - -class UnbanUUID( - private val playerBanRepository: PlayerBanRepository, - private val playerUUIDRepository: PlayerUUIDRepository, - private val server: Server, -) { - enum class FailureReason { - PlayerDoesNotExist, - PlayerNotBanned, - } - - suspend fun unban( - targetPlayerName: String, - unbannerUUID: UUID?, - ): Result { - try { - val targetPlayerUUID = playerUUIDRepository.get(targetPlayerName) - ?: return Failure(FailureReason.PlayerDoesNotExist) - - playerBanRepository.unban( - targetPlayerUUID = targetPlayerUUID, - unbannerUUID = unbannerUUID, - ) - - server.broadcastMessage( - TextComponent("$targetPlayerName has been unbanned").apply { - color = ChatColor.GRAY - isItalic = true - }.toLegacyText() - ) - - return Success(Unit) - } catch (e: UUIDBanHttpService.UUIDNotBannedException) { - return Failure(FailureReason.PlayerNotBanned) - } - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/bans/commands/BanCommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/bans/commands/BanCommand.kt deleted file mode 100644 index 22dfde8b7..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/bans/commands/BanCommand.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.projectcitybuild.modules.moderation.bans.commands - -import com.projectcitybuild.modules.moderation.bans.actions.BanUUID -import com.projectcitybuild.pcbridge.core.utils.Failure -import com.projectcitybuild.support.textcomponent.send -import org.bukkit.entity.Player - -class BanCommand( - private val banUUID: BanUUID, -) { - suspend fun execute( - commandSender: Player, - targetPlayerName: String, - reason: String, - ) { - val result = banUUID.ban( - targetPlayerName, - bannerUUID = commandSender.uniqueId, - bannerName = commandSender.name, - reason - ) - if (result is Failure) { - commandSender.send().error( - when (result.reason) { - BanUUID.FailureReason.PlayerDoesNotExist -> "Could not find UUID for $targetPlayerName. This player likely doesn't exist" - BanUUID.FailureReason.PlayerAlreadyBanned -> "$targetPlayerName is already banned" - } - ) - } - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/bans/commands/BanIPCommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/bans/commands/BanIPCommand.kt deleted file mode 100644 index 853056b97..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/bans/commands/BanIPCommand.kt +++ /dev/null @@ -1,40 +0,0 @@ -package com.projectcitybuild.modules.moderation.bans.commands - -import com.projectcitybuild.modules.moderation.bans.actions.BanIP -import com.projectcitybuild.pcbridge.core.utils.Failure -import com.projectcitybuild.pcbridge.core.utils.Success -import com.projectcitybuild.support.textcomponent.send -import org.bukkit.Server -import org.bukkit.entity.Player - -class BanIPCommand( - private val server: Server, - private val banIP: BanIP, -) { - suspend fun execute( - commandSender: Player, - target: String, - reason: String?, - ) { - val targetIP = server.onlinePlayers - .firstOrNull { it.name.lowercase() == target.lowercase() } - ?.address?.toString() - ?: target - - val result = banIP.execute( - ip = targetIP, - bannerUUID = commandSender.uniqueId, - bannerName = commandSender.name, - reason = if (reason.isNullOrEmpty()) "No reason given" else reason, - ) - when (result) { - is Failure -> commandSender.send().error( - when (result.reason) { - BanIP.FailureReason.IP_ALREADY_BANNED -> "$targetIP is already banned" - BanIP.FailureReason.INVALID_IP -> "$targetIP is not a valid IP" - } - ) - is Success -> commandSender.send().success("IP $targetIP has been banned") - } - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/bans/commands/CheckBanCommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/bans/commands/CheckBanCommand.kt deleted file mode 100644 index a49503e3f..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/bans/commands/CheckBanCommand.kt +++ /dev/null @@ -1,41 +0,0 @@ -package com.projectcitybuild.modules.moderation.bans.commands - -import com.projectcitybuild.modules.moderation.bans.actions.CheckUUIDBan -import com.projectcitybuild.pcbridge.core.utils.Failure -import com.projectcitybuild.pcbridge.core.utils.Success -import com.projectcitybuild.support.textcomponent.send -import net.md_5.bungee.api.ChatColor -import org.bukkit.entity.Player - -class CheckBanCommand( - private val checkUUIDBan: CheckUUIDBan, -) { - suspend fun execute(commandSender: Player, targetPlayerName: String) { - val result = checkUUIDBan.getBan(targetPlayerName) - - when (result) { - is Failure -> { - if (result.reason == CheckUUIDBan.FailureReason.PLAYER_DOES_NOT_EXIST) { - commandSender.send().error("Could not find UUID for $targetPlayerName. This player likely doesn't exist") - } - } - is Success -> { - val ban = result.value - if (ban == null) { - commandSender.send().info("$targetPlayerName is not currently banned") - } else { - commandSender.send().info( - """ - #${ChatColor.RED}$targetPlayerName is currently banned. - #${ChatColor.GRAY}--- - #${ChatColor.GRAY}Reason » ${ChatColor.WHITE}${ban.reason} - #${ChatColor.GRAY}Date » ${ChatColor.WHITE}${ban.dateOfBan} - #${ChatColor.GRAY}Expires » ${ChatColor.WHITE}${ban.expiryDate} - """.trimMargin("#"), - isMultiLine = true - ) - } - } - } - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/bans/commands/UnbanCommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/bans/commands/UnbanCommand.kt deleted file mode 100644 index eba99717f..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/bans/commands/UnbanCommand.kt +++ /dev/null @@ -1,25 +0,0 @@ -package com.projectcitybuild.modules.moderation.bans.commands - -import com.projectcitybuild.modules.moderation.bans.actions.UnbanUUID -import com.projectcitybuild.pcbridge.core.utils.Failure -import com.projectcitybuild.support.textcomponent.send -import org.bukkit.entity.Player - -class UnbanCommand( - private val unbanUUID: UnbanUUID, -) { - suspend fun execute(commandSender: Player, targetPlayerName: String) { - val result = unbanUUID.unban( - targetPlayerName= targetPlayerName, - unbannerUUID = commandSender.uniqueId, - ) - if (result is Failure) { - commandSender.send().error( - when (result.reason) { - UnbanUUID.FailureReason.PlayerDoesNotExist -> "Could not find UUID for $targetPlayerName. This player likely doesn't exist" - UnbanUUID.FailureReason.PlayerNotBanned -> "$targetPlayerName is not currently banned" - } - ) - } - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/bans/commands/UnbanIPCommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/bans/commands/UnbanIPCommand.kt deleted file mode 100644 index 5352e5283..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/bans/commands/UnbanIPCommand.kt +++ /dev/null @@ -1,29 +0,0 @@ -package com.projectcitybuild.modules.moderation.bans.commands - -import com.projectcitybuild.modules.moderation.bans.actions.UnbanIP -import com.projectcitybuild.pcbridge.core.utils.Failure -import com.projectcitybuild.pcbridge.core.utils.Success -import com.projectcitybuild.support.textcomponent.send -import org.bukkit.entity.Player - -class UnbanIPCommand( - private val unbanIP: UnbanIP, -) { - suspend fun execute(commandSender: Player, targetIP: String) { - val result = unbanIP.execute( - ip = targetIP, - unbannerUUID = commandSender.uniqueId, - unbannerName = commandSender.name, - ) - - when (result) { - is Failure -> commandSender.send().error( - when (result.reason) { - UnbanIP.FailureReason.IP_NOT_BANNED -> "$targetIP is not currently banned" - UnbanIP.FailureReason.INVALID_IP -> "$targetIP is not a valid IP" - } - ) - is Success -> commandSender.send().success("IP $targetIP has been unbanned") - } - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/bans/listeners/CheckBanOnConnectListener.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/bans/listeners/CheckBanOnConnectListener.kt deleted file mode 100644 index ff7cc71de..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/bans/listeners/CheckBanOnConnectListener.kt +++ /dev/null @@ -1,107 +0,0 @@ -package com.projectcitybuild.modules.moderation.bans.listeners - -import com.projectcitybuild.entities.events.ConnectionPermittedEvent -import com.projectcitybuild.modules.moderation.bans.actions.AuthoriseConnection -import com.projectcitybuild.pcbridge.core.modules.datetime.formatter.DateTimeFormatter -import com.projectcitybuild.libs.errorreporting.ErrorReporter -import com.projectcitybuild.pcbridge.core.contracts.PlatformLogger -import com.projectcitybuild.pcbridge.http.responses.Aggregate -import com.projectcitybuild.repositories.AggregateRepository -import com.projectcitybuild.support.spigot.eventbroadcast.LocalEventBroadcaster -import com.projectcitybuild.support.spigot.listeners.SpigotListener -import com.projectcitybuild.support.textcomponent.add -import com.projectcitybuild.utils.Sanitizer -import kotlinx.coroutines.runBlocking -import net.md_5.bungee.api.ChatColor -import net.md_5.bungee.api.chat.TextComponent -import org.bukkit.event.EventHandler -import org.bukkit.event.EventPriority -import org.bukkit.event.player.AsyncPlayerPreLoginEvent -import java.time.format.FormatStyle - -class CheckBanOnConnectListener( - private val aggregateRepository: AggregateRepository, - private val authoriseConnection: AuthoriseConnection, - private val logger: PlatformLogger, - private val dateTimeFormatter: DateTimeFormatter, - private val errorReporter: ErrorReporter, - private val localEventBroadcaster: LocalEventBroadcaster, -) : SpigotListener { - - @EventHandler(priority = EventPriority.HIGHEST) - override suspend fun handle(event: AsyncPlayerPreLoginEvent) { - /** - * Events cannot be mutated (i.e. we cannot kick the connecting player) inside a - * suspended function due to the way the code compiles, so we need to block. - * Blocking isn't a problem here because the event observation is already running asynchronously - * - * See https://github.com/Shynixn/MCCoroutine/issues/43 - */ - runBlocking { - runCatching { - val aggregate = aggregateRepository.get( - playerUUID = event.uniqueId, - ip = Sanitizer.sanitizedIP(event.address.toString()), - ) ?: Aggregate() - - val result = authoriseConnection.execute(aggregate) - if (result is AuthoriseConnection.ConnectResult.Denied) { - event.disallow( - AsyncPlayerPreLoginEvent.Result.KICK_BANNED, - result.ban.toMessage(dateTimeFormatter), - ) - return@runBlocking - } - - localEventBroadcaster.emit( - ConnectionPermittedEvent( - aggregate = aggregate, - playerUUID = event.uniqueId, - ) - ) - - }.onFailure { throwable -> - throwable.message?.let { logger.severe(it) } - throwable.printStackTrace() - - errorReporter.report(throwable) - - // If something goes wrong, better not to let players in - event.disallow( - AsyncPlayerPreLoginEvent.Result.KICK_OTHER, - "An error occurred while contacting the PCB authentication server. Please try again later" - ) - } - } - } -} - -private fun AuthoriseConnection.Ban.toMessage( - dateTimeFormatter: DateTimeFormatter, -): String { - return when (this) { - is AuthoriseConnection.Ban.UUID -> TextComponent() - .add("You are currently banned.\n\n") { - it.color = ChatColor.RED - it.isBold = true - } - .add("Reason: ") { it.color = ChatColor.GRAY } - .add(value.reason ?: "No reason provided") { it.color = ChatColor.WHITE } - .add("\n") - .add("Expires: ") { it.color = ChatColor.GRAY } - .add((value.expiresAt?.let { dateTimeFormatter.convert(it, FormatStyle.SHORT) } ?: "Never") + "\n\n") { it.color = ChatColor.WHITE } - .add("Appeal @ https://projectcitybuild.com") { it.color = ChatColor.AQUA } - - is AuthoriseConnection.Ban.IP -> TextComponent() - .add("You are currently IP banned.\n\n") { - it.color = ChatColor.RED - it.isBold = true - } - .add("Reason: ") { it.color = ChatColor.GRAY } - .add(value.reason.ifEmpty { "No reason provided" }) { it.color = ChatColor.WHITE } - .add("\n") - .add("\n\n") - .add("Appeal @ https://projectcitybuild.com") { it.color = ChatColor.AQUA } - } - .toLegacyText() -} \ No newline at end of file diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/mutes/MutesModule.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/mutes/MutesModule.kt deleted file mode 100644 index eb80b8ac8..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/mutes/MutesModule.kt +++ /dev/null @@ -1,48 +0,0 @@ -package com.projectcitybuild.modules.moderation.mutes - -import com.projectcitybuild.entities.Permissions -import com.projectcitybuild.modules.moderation.mutes.commands.MuteCommand -import com.projectcitybuild.modules.moderation.mutes.commands.UnmuteCommand -import com.projectcitybuild.modules.moderation.mutes.actions.MutePlayer -import com.projectcitybuild.support.modules.ModuleDeclaration -import com.projectcitybuild.support.modules.PluginModule -import dev.jorel.commandapi.arguments.EntitySelectorArgument -import dev.jorel.commandapi.executors.PlayerCommandExecutor -import org.bukkit.entity.Player - -class MutesModule: PluginModule { - - override fun register(module: ModuleDeclaration) = module { - command("mute") { - withPermission(Permissions.COMMAND_MUTES_MUTE) - withShortDescription("Prevents a player from talking in chat") - withArguments( - EntitySelectorArgument.OnePlayer("player"), - ) - executesPlayer(PlayerCommandExecutor { player, args -> - MuteCommand( - MutePlayer(container.playerConfigRepository), - ).execute( - commandSender = player, - targetPlayer = args.get("player") as Player, - ) - }) - } - - command("unmute") { - withPermission(Permissions.COMMAND_MUTES_UNMUTE) - withShortDescription("Allows a muted player to talk in chat again") - withArguments( - EntitySelectorArgument.OnePlayer("player"), - ) - executesPlayer(PlayerCommandExecutor { player, args -> - UnmuteCommand( - MutePlayer(container.playerConfigRepository), - ).execute( - commandSender = player, - targetPlayer = args.get("player") as Player, - ) - }) - } - } -} \ No newline at end of file diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/mutes/actions/MutePlayer.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/mutes/actions/MutePlayer.kt deleted file mode 100644 index 2c60b5832..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/mutes/actions/MutePlayer.kt +++ /dev/null @@ -1,19 +0,0 @@ -package com.projectcitybuild.modules.moderation.mutes.actions - -import com.projectcitybuild.repositories.PlayerConfigRepository -import java.util.UUID - -class MutePlayer( - private val playerConfigRepository: PlayerConfigRepository, -) { - fun execute( - targetPlayerUUID: UUID, - shouldMute: Boolean, - ) { - val targetPlayerConfig = playerConfigRepository - .get(targetPlayerUUID)!! - .also { it.isMuted = shouldMute } - - playerConfigRepository.save(targetPlayerConfig) - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/mutes/commands/MuteCommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/mutes/commands/MuteCommand.kt deleted file mode 100644 index 8acc710df..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/mutes/commands/MuteCommand.kt +++ /dev/null @@ -1,18 +0,0 @@ -package com.projectcitybuild.modules.moderation.mutes.commands - -import com.projectcitybuild.modules.moderation.mutes.actions.MutePlayer -import com.projectcitybuild.support.textcomponent.send -import org.bukkit.entity.Player - -class MuteCommand( - private val mute: MutePlayer, -) { - fun execute(commandSender: Player, targetPlayer: Player) { - mute.execute( - targetPlayerUUID = targetPlayer.uniqueId, - shouldMute = true, - ) - commandSender.send().success("${targetPlayer.name} has been muted") - targetPlayer.send().info("You have been muted by ${commandSender.name}") - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/mutes/commands/UnmuteCommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/mutes/commands/UnmuteCommand.kt deleted file mode 100644 index 6af91e255..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/mutes/commands/UnmuteCommand.kt +++ /dev/null @@ -1,18 +0,0 @@ -package com.projectcitybuild.modules.moderation.mutes.commands - -import com.projectcitybuild.modules.moderation.mutes.actions.MutePlayer -import com.projectcitybuild.support.textcomponent.send -import org.bukkit.entity.Player - -class UnmuteCommand( - private val mute: MutePlayer, -) { - fun execute(commandSender: Player, targetPlayer: Player) { - mute.execute( - targetPlayerUUID = targetPlayer.uniqueId, - shouldMute = false, - ) - commandSender.send().success("${targetPlayer.name} has been unmuted") - targetPlayer.send().info("You have been unmuted by ${commandSender.name}") - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/staffchat/StaffChatModule.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/staffchat/StaffChatModule.kt deleted file mode 100644 index fa2bae29a..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/staffchat/StaffChatModule.kt +++ /dev/null @@ -1,27 +0,0 @@ -package com.projectcitybuild.modules.moderation.staffchat - -import com.projectcitybuild.entities.Permissions -import com.projectcitybuild.modules.moderation.staffchat.commands.ACommand -import com.projectcitybuild.support.modules.ModuleDeclaration -import com.projectcitybuild.support.modules.PluginModule -import dev.jorel.commandapi.arguments.GreedyStringArgument -import dev.jorel.commandapi.executors.PlayerCommandExecutor - -class StaffChatModule: PluginModule { - - override fun register(module: ModuleDeclaration) = module { - command("a") { - withPermission(Permissions.COMMAND_STAFF_CHAT) - withShortDescription("Sends a message to all staff currently online") - withArguments( - GreedyStringArgument("message"), - ) - executesPlayer(PlayerCommandExecutor { player, args -> - ACommand(container.server).execute( - commandSender = player, - message = args.get("message") as String, - ) - }) - } - } -} \ No newline at end of file diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/staffchat/commands/ACommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/staffchat/commands/ACommand.kt deleted file mode 100644 index 4897140a9..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/staffchat/commands/ACommand.kt +++ /dev/null @@ -1,25 +0,0 @@ -package com.projectcitybuild.modules.moderation.staffchat.commands - -import com.projectcitybuild.entities.Permissions -import com.projectcitybuild.support.textcomponent.add -import net.md_5.bungee.api.ChatColor -import net.md_5.bungee.api.chat.TextComponent -import org.bukkit.Server -import org.bukkit.entity.Player - -class ACommand( - private val server: Server -) { - fun execute(commandSender: Player, message: String) { - server.onlinePlayers - .filter { it.hasPermission(Permissions.COMMAND_STAFF_CHAT) } - .forEach { player -> - player.spigot().sendMessage( - TextComponent() - .add("(Staff) ${commandSender.displayName}") { it.color = ChatColor.YELLOW } - .add(" » ") { it.color = ChatColor.GRAY } - .add(TextComponent.fromLegacyText(message)) - ) - } - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/warnings/WarningsModule.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/warnings/WarningsModule.kt deleted file mode 100644 index 74658d8c4..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/warnings/WarningsModule.kt +++ /dev/null @@ -1,43 +0,0 @@ -package com.projectcitybuild.modules.moderation.warnings - -import com.projectcitybuild.entities.Permissions -import com.projectcitybuild.modules.moderation.warnings.actions.AcknowledgeWarning -import com.projectcitybuild.modules.moderation.warnings.actions.GetUnacknowledgedWarnings -import com.projectcitybuild.modules.moderation.warnings.commands.WarningAcknowledgeCommand -import com.projectcitybuild.modules.moderation.warnings.listeners.NotifyWarningsOnJoinListener -import com.projectcitybuild.support.commandapi.suspendExecutesPlayer -import com.projectcitybuild.support.modules.ModuleDeclaration -import com.projectcitybuild.support.modules.PluginModule -import dev.jorel.commandapi.arguments.IntegerArgument -import dev.jorel.commandapi.arguments.MultiLiteralArgument - -class WarningsModule: PluginModule { - - override fun register(module: ModuleDeclaration) = module { - command("warning") { - withPermission(Permissions.COMMAND_WARNING_ACKNOWLEDGE) - withShortDescription("Acknowledges a given warning") - withArguments( - MultiLiteralArgument("action", listOf("acknowledge")), - IntegerArgument("id"), - ) - suspendExecutesPlayer(container.plugin) { player, args -> - WarningAcknowledgeCommand( - AcknowledgeWarning(container.playerWarningRepository) - ).execute( - commandSender = player, - warningId = args.get("id") as Int, - ) - } - } - - listener( - NotifyWarningsOnJoinListener( - GetUnacknowledgedWarnings( - container.playerWarningRepository, - container.dateTimeFormatter, - ), - ), - ) - } -} \ No newline at end of file diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/warnings/actions/AcknowledgeWarning.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/warnings/actions/AcknowledgeWarning.kt deleted file mode 100644 index ec4b28cd5..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/warnings/actions/AcknowledgeWarning.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.projectcitybuild.modules.moderation.warnings.actions - -import com.projectcitybuild.pcbridge.core.utils.Result -import com.projectcitybuild.pcbridge.core.utils.Success -import com.projectcitybuild.repositories.PlayerWarningRepository - -class AcknowledgeWarning( - private val playerWarningRepository: PlayerWarningRepository, -) { - suspend fun execute(warningId: Int): Result { - playerWarningRepository.acknowledge(warningId = warningId) - return Success(Unit) - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/warnings/commands/WarningAcknowledgeCommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/warnings/commands/WarningAcknowledgeCommand.kt deleted file mode 100644 index b8809da65..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/warnings/commands/WarningAcknowledgeCommand.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.projectcitybuild.modules.moderation.warnings.commands - -import com.projectcitybuild.modules.moderation.warnings.actions.AcknowledgeWarning -import com.projectcitybuild.support.textcomponent.send -import org.bukkit.entity.Player - -class WarningAcknowledgeCommand( - private val acknowledgeWarning: AcknowledgeWarning, -) { - suspend fun execute(commandSender: Player, warningId: Int) { - acknowledgeWarning.execute(warningId) - commandSender.send().success("Warning acknowledged and hidden") - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/warnings/listeners/NotifyWarningsOnJoinListener.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/warnings/listeners/NotifyWarningsOnJoinListener.kt deleted file mode 100644 index 8931376f9..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/warnings/listeners/NotifyWarningsOnJoinListener.kt +++ /dev/null @@ -1,59 +0,0 @@ -package com.projectcitybuild.modules.moderation.warnings.listeners - -import com.projectcitybuild.modules.moderation.warnings.actions.GetUnacknowledgedWarnings -import com.projectcitybuild.support.spigot.listeners.SpigotListener -import com.projectcitybuild.support.textcomponent.add -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch -import net.md_5.bungee.api.ChatColor -import net.md_5.bungee.api.chat.ClickEvent -import net.md_5.bungee.api.chat.TextComponent -import org.bukkit.event.EventHandler -import org.bukkit.event.player.PlayerJoinEvent - -class NotifyWarningsOnJoinListener( - private val getUnacknowledgedWarnings: GetUnacknowledgedWarnings, -) : SpigotListener { - - @EventHandler - override suspend fun handle(event: PlayerJoinEvent) { - val player = event.player - - CoroutineScope(Dispatchers.IO).launch { - val warnings = getUnacknowledgedWarnings.execute( - playerUUID = player.uniqueId, - playerName = player.name, - ) - if (warnings.isEmpty()) { - return@launch - } - val tc = TextComponent() - .add("You have ") { it.color = ChatColor.RED } - .add(warnings.size) { it.isBold = true } - .add(" unacknowledged warnings\n") { it.color = ChatColor.RED } - .add("---\n") - - warnings.forEach { warning -> - tc.add("${warning.reason}\n") - tc.add("Date: ") { it.color = ChatColor.GRAY } - tc.add("${warning.createdAt}\n\n") - tc.add("[I ACKNOWLEDGE]") { - it.isUnderlined = true - it.isBold = true - it.color = ChatColor.GOLD - it.clickEvent = ClickEvent(ClickEvent.Action.RUN_COMMAND, "/warning acknowledge ${warning.id}") - } - tc.add("\n") - tc.add("---\n") - } - - tc.add("Click the 'acknowledge' button to mark it as read and hide it") { - it.color = ChatColor.GRAY - it.isItalic = true - } - - player.spigot().sendMessage(tc) - } - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/pluginutils/PluginUtilsModule.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/pluginutils/PluginUtilsModule.kt deleted file mode 100644 index 4e5af97a1..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/pluginutils/PluginUtilsModule.kt +++ /dev/null @@ -1,63 +0,0 @@ -package com.projectcitybuild.modules.pluginutils - -import com.projectcitybuild.entities.Permissions -import com.projectcitybuild.modules.pluginutils.commands.VersionCommand -import com.projectcitybuild.modules.pluginutils.actions.GetVersion -import com.projectcitybuild.modules.pluginutils.actions.ReloadPlugin -import com.projectcitybuild.modules.pluginutils.commands.ReloadCommand -import com.projectcitybuild.modules.pluginutils.listeners.CachePlayerOnJoinListener -import com.projectcitybuild.modules.pluginutils.listeners.ExceptionListener -import com.projectcitybuild.modules.pluginutils.listeners.UncachePlayerOnQuitListener -import com.projectcitybuild.support.modules.ModuleDeclaration -import com.projectcitybuild.support.modules.PluginModule -import dev.jorel.commandapi.CommandAPICommand -import dev.jorel.commandapi.executors.PlayerCommandExecutor - -class PluginUtilsModule: PluginModule { - - override fun register(module: ModuleDeclaration) = module { - command("pcbridge") { - withPermission(Permissions.COMMAND_UTILITIES) - withSubcommand( - CommandAPICommand("version") - .withShortDescription("Shows the plugin version") - .executesPlayer(PlayerCommandExecutor { player, _ -> - VersionCommand(GetVersion()).execute(player) - }) - ) - withSubcommand( - CommandAPICommand("reload") - .withShortDescription("Flushes caches and reloads the plugin config") - .executesPlayer(PlayerCommandExecutor { player, _ -> - ReloadCommand( - ReloadPlugin( - container.chatGroupFormatter, - container.playerConfigCache, - container.warpRepository, - container.config, - ), - ).execute(player) - }) - ) - } - - listener( - ExceptionListener(container.errorReporter) - ) - listener( - CachePlayerOnJoinListener( - container.localEventBroadcaster, - container.playerConfigRepository, - container.logger, - container.time, - ), - ) - listener( - UncachePlayerOnQuitListener( - container.playerConfigCache, - container.chatGroupFormatter, - container.chatBadgeRepository, - ), - ) - } -} \ No newline at end of file diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/pluginutils/actions/GetVersion.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/pluginutils/actions/GetVersion.kt deleted file mode 100644 index 0a192f08c..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/pluginutils/actions/GetVersion.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.projectcitybuild.modules.pluginutils.actions - -import com.projectcitybuild.entities.PluginVersion -import java.util.Properties - -class GetVersion { - - fun execute(): PluginVersion { - val properties = Properties().apply { - load(object {}.javaClass.getResourceAsStream("/version.properties")) - } - return PluginVersion( - version = properties.getProperty("version"), - commitHash = properties.getProperty("commit"), - ) - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/pluginutils/actions/ReloadPlugin.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/pluginutils/actions/ReloadPlugin.kt deleted file mode 100644 index 86e283ab6..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/pluginutils/actions/ReloadPlugin.kt +++ /dev/null @@ -1,21 +0,0 @@ -package com.projectcitybuild.modules.pluginutils.actions - -import com.projectcitybuild.entities.ConfigData -import com.projectcitybuild.modules.chat.ChatGroupFormatter -import com.projectcitybuild.pcbridge.core.modules.config.Config -import com.projectcitybuild.libs.playercache.PlayerConfigCache -import com.projectcitybuild.repositories.WarpRepository - -class ReloadPlugin( - private val chatGroupFormatter: ChatGroupFormatter, - private val playerConfigCache: PlayerConfigCache, - private val warpRepository: WarpRepository, - private val config: Config, -) { - fun execute() { - chatGroupFormatter.flushAllCaches() - playerConfigCache.flush() - warpRepository.flush() - config.flush() - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/pluginutils/commands/ReloadCommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/pluginutils/commands/ReloadCommand.kt deleted file mode 100644 index 231745d39..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/pluginutils/commands/ReloadCommand.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.projectcitybuild.modules.pluginutils.commands - -import com.projectcitybuild.modules.pluginutils.actions.ReloadPlugin -import com.projectcitybuild.support.textcomponent.send -import org.bukkit.entity.Player - -class ReloadCommand( - private val reloadPlugin: ReloadPlugin, -) { - fun execute(commandSender: Player) { - reloadPlugin.execute() - commandSender.send().success("Caches flushed") - } -} \ No newline at end of file diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/pluginutils/commands/VersionCommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/pluginutils/commands/VersionCommand.kt deleted file mode 100644 index 8fd98db59..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/pluginutils/commands/VersionCommand.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.projectcitybuild.modules.pluginutils.commands - -import com.projectcitybuild.modules.pluginutils.actions.GetVersion -import com.projectcitybuild.support.textcomponent.send -import org.bukkit.entity.Player - -class VersionCommand( - private val getVersion: GetVersion, -) { - fun execute(commandSender: Player) { - val version = getVersion.execute() - - commandSender.send().info( - "Running PCBridge v${version.version} (${version.commitHash})" - ) - } -} \ No newline at end of file diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/pluginutils/listeners/CachePlayerOnJoinListener.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/pluginutils/listeners/CachePlayerOnJoinListener.kt deleted file mode 100644 index 3c830bf9d..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/pluginutils/listeners/CachePlayerOnJoinListener.kt +++ /dev/null @@ -1,39 +0,0 @@ -package com.projectcitybuild.modules.pluginutils.listeners - -import com.projectcitybuild.entities.events.FirstTimeJoinEvent -import com.projectcitybuild.pcbridge.core.contracts.PlatformLogger -import com.projectcitybuild.pcbridge.core.modules.datetime.time.Time -import com.projectcitybuild.repositories.PlayerConfigRepository -import com.projectcitybuild.support.spigot.eventbroadcast.LocalEventBroadcaster -import com.projectcitybuild.support.spigot.listeners.SpigotListener -import org.bukkit.event.EventHandler -import org.bukkit.event.player.PlayerJoinEvent - -// TODO: move this to somewhere more appropriate -class CachePlayerOnJoinListener( - private val localEventBroadcaster: LocalEventBroadcaster, - private val playerConfigRepository: PlayerConfigRepository, - private val logger: PlatformLogger, - private val time: Time, -) : SpigotListener { - - @EventHandler - override suspend fun handle(event: PlayerJoinEvent) { - val player = event.player - val uuid = player.uniqueId - - if (playerConfigRepository.get(uuid) == null) { - logger.debug("No player config found for $uuid. Generating new one...") - - localEventBroadcaster.emit( - FirstTimeJoinEvent(player) - ) - playerConfigRepository.add( - uuid = uuid, - isMuted = false, - isChatBadgeDisabled = false, - firstSeen = time.now(), - ) - } - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/pluginutils/listeners/ExceptionListener.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/pluginutils/listeners/ExceptionListener.kt deleted file mode 100644 index 23011cd99..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/pluginutils/listeners/ExceptionListener.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.projectcitybuild.modules.pluginutils.listeners - -import com.github.shynixn.mccoroutine.bukkit.MCCoroutineExceptionEvent -import com.projectcitybuild.libs.errorreporting.ErrorReporter -import com.projectcitybuild.support.spigot.listeners.SpigotListener -import org.bukkit.event.EventHandler - -// TODO: move this to somewhere more appropriate -class ExceptionListener( - private val errorReporter: ErrorReporter, -) : SpigotListener { - - @EventHandler - override suspend fun handle(event: MCCoroutineExceptionEvent) { - errorReporter.report(event.exception) - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/pluginutils/listeners/UncachePlayerOnQuitListener.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/pluginutils/listeners/UncachePlayerOnQuitListener.kt deleted file mode 100644 index 29d3572b9..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/pluginutils/listeners/UncachePlayerOnQuitListener.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.projectcitybuild.modules.pluginutils.listeners - -import com.projectcitybuild.modules.chat.ChatGroupFormatter -import com.projectcitybuild.libs.playercache.PlayerConfigCache -import com.projectcitybuild.repositories.ChatBadgeRepository -import com.projectcitybuild.support.spigot.listeners.SpigotListener -import org.bukkit.event.EventHandler -import org.bukkit.event.player.PlayerQuitEvent - -class UncachePlayerOnQuitListener( - private val playerCache: PlayerConfigCache, - private val chatGroupFormatter: ChatGroupFormatter, - private val chatBadgeRepository: ChatBadgeRepository, -) : SpigotListener { - - @EventHandler - override suspend fun handle(event: PlayerQuitEvent) { - val player = event.player - - playerCache.remove(uuid = player.uniqueId) - chatGroupFormatter.flush(playerUUID = player.uniqueId) - chatBadgeRepository.remove(playerUUID = player.uniqueId) - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/ranksync/RankSyncModule.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/ranksync/RankSyncModule.kt deleted file mode 100644 index fb557bc07..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/ranksync/RankSyncModule.kt +++ /dev/null @@ -1,71 +0,0 @@ -package com.projectcitybuild.modules.ranksync - -import com.projectcitybuild.entities.Permissions -import com.projectcitybuild.modules.ranksync.actions.GenerateAccountVerificationURL -import com.projectcitybuild.modules.ranksync.actions.SyncPlayerGroupsWithAggregate -import com.projectcitybuild.modules.ranksync.actions.UpdatePlayerGroups -import com.projectcitybuild.modules.ranksync.commands.SyncCommand -import com.projectcitybuild.modules.ranksync.commands.SyncOtherCommand -import com.projectcitybuild.modules.ranksync.listener.SyncPlayerGroupsOnJoinListener -import com.projectcitybuild.support.commandapi.suspendExecutesPlayer -import com.projectcitybuild.support.modules.ModuleDeclaration -import com.projectcitybuild.support.modules.PluginModule -import dev.jorel.commandapi.arguments.EntitySelectorArgument -import dev.jorel.commandapi.arguments.MultiLiteralArgument -import org.bukkit.entity.Player - -class RankSyncModule: PluginModule { - - override fun register(module: ModuleDeclaration) = module { - command("sync") { - withPermission(Permissions.COMMAND_RANKSYNC_SYNC) - withShortDescription("Syncs your rank with the website") - withOptionalArguments( - MultiLiteralArgument("action", listOf("finish")), - ) - suspendExecutesPlayer(container.plugin) { player, args -> - SyncCommand( - GenerateAccountVerificationURL( - container.verificationURLRepository, - ), - UpdatePlayerGroups( - container.permissions, - container.playerGroupRepository, - ) - ).execute( - commandSender = player, - finishSyncing = args.get("action") == "finish", - ) - } - } - - command("syncother") { - withPermission(Permissions.COMMAND_RANKSYNC_SYNC_OTHER) - withShortDescription("Syncs a given player's rank with the website") - withArguments( - EntitySelectorArgument.OnePlayer("player"), - ) - suspendExecutesPlayer(container.plugin) { player, args -> - SyncOtherCommand( - UpdatePlayerGroups( - container.permissions, - container.playerGroupRepository, - ), - ).execute( - commandSender = player, - targetPlayer = args.get("player") as Player, - ) - } - } - - listener( - SyncPlayerGroupsOnJoinListener( - SyncPlayerGroupsWithAggregate( - container.permissions, - container.config, - container.logger, - ), - ) - ) - } -} \ No newline at end of file diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/ranksync/actions/SyncPlayerGroupsWithAggregate.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/ranksync/actions/SyncPlayerGroupsWithAggregate.kt deleted file mode 100644 index 5ccbb4158..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/ranksync/actions/SyncPlayerGroupsWithAggregate.kt +++ /dev/null @@ -1,41 +0,0 @@ -package com.projectcitybuild.modules.ranksync.actions - -import com.projectcitybuild.entities.ConfigData -import com.projectcitybuild.pcbridge.core.modules.config.Config -import com.projectcitybuild.libs.permissions.Permissions -import com.projectcitybuild.pcbridge.core.contracts.PlatformLogger -import com.projectcitybuild.pcbridge.http.responses.Aggregate -import java.util.UUID - -class SyncPlayerGroupsWithAggregate( - private val permissions: Permissions, - private val config: Config, - private val logger: PlatformLogger, -) { - fun execute(playerUUID: UUID, aggregate: Aggregate) { - val account = aggregate.account ?: return - - val groupSet = mutableSetOf() - groupSet.addAll( - account.groups.mapNotNull { it.minecraftName } - ) - groupSet.addAll( - aggregate.donationPerks.mapNotNull { donorPerk -> - val tierName = donorPerk.donationTier.name - - val groupNames = config.get().groups.donorTierGroupNames - val permissionGroupName = when (tierName) { - "copper" -> groupNames.copper - "iron" -> groupNames.iron - "diamond" -> groupNames.diamond - else -> { - logger.severe("Missing config node for donor tier: $tierName") - return@mapNotNull null - } - } - return@mapNotNull permissionGroupName - } - ) - permissions.setUserGroups(playerUUID, groupSet.toList()) - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/ranksync/actions/UpdatePlayerGroups.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/ranksync/actions/UpdatePlayerGroups.kt deleted file mode 100644 index f7a264e7b..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/ranksync/actions/UpdatePlayerGroups.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.projectcitybuild.modules.ranksync.actions - -import com.projectcitybuild.libs.permissions.Permissions -import com.projectcitybuild.pcbridge.core.utils.Failure -import com.projectcitybuild.pcbridge.core.utils.Result -import com.projectcitybuild.pcbridge.core.utils.Success -import com.projectcitybuild.pcbridge.http.services.pcb.PlayerGroupHttpService -import com.projectcitybuild.repositories.PlayerGroupRepository -import java.util.UUID - -class UpdatePlayerGroups( - private val permissions: Permissions, - private val playerGroupRepository: PlayerGroupRepository, -) { - enum class FailureReason { - ACCOUNT_NOT_LINKED, - } - - suspend fun execute(playerUUID: UUID): Result { - val groupSet = mutableSetOf() - - try { - groupSet.addAll(playerGroupRepository.getGroups(playerUUID = playerUUID)) - groupSet.addAll(playerGroupRepository.getDonorTiers(playerUUID = playerUUID)) - } catch (e: PlayerGroupHttpService.NoLinkedAccountException) { - return Failure(FailureReason.ACCOUNT_NOT_LINKED) - } - - permissions.setUserGroups(playerUUID, groupSet.toList()) - - return Success(Unit) - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/ranksync/commands/SyncCommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/ranksync/commands/SyncCommand.kt deleted file mode 100644 index 4717a7013..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/ranksync/commands/SyncCommand.kt +++ /dev/null @@ -1,65 +0,0 @@ -package com.projectcitybuild.modules.ranksync.commands - -import com.projectcitybuild.modules.ranksync.actions.GenerateAccountVerificationURL -import com.projectcitybuild.modules.ranksync.actions.UpdatePlayerGroups -import com.projectcitybuild.pcbridge.core.utils.Failure -import com.projectcitybuild.pcbridge.core.utils.Success -import com.projectcitybuild.support.textcomponent.add -import com.projectcitybuild.support.textcomponent.send -import net.md_5.bungee.api.chat.ClickEvent -import net.md_5.bungee.api.chat.HoverEvent -import net.md_5.bungee.api.chat.TextComponent -import net.md_5.bungee.api.chat.hover.content.Text -import org.bukkit.entity.Player - -class SyncCommand( - private val generateAccountVerificationURL: GenerateAccountVerificationURL, - private val updatePlayerGroups: UpdatePlayerGroups, -) { - // TODO: clean up this horrible mess... - suspend fun execute(commandSender: Player, finishSyncing: Boolean) { - when (finishSyncing) { - false -> generateVerificationURL(commandSender) - true -> syncGroups(commandSender) - } - } - - private suspend fun generateVerificationURL(player: Player) { - val result = generateAccountVerificationURL.generate(player.uniqueId) - - when (result) { - is Failure -> when (result.reason) { - GenerateAccountVerificationURL.FailureReason.ALREADY_LINKED - -> syncGroups(player) - - GenerateAccountVerificationURL.FailureReason.EMPTY_RESPONSE - -> player.send().error("Failed to generate verification URL: No URL received from server") - } - is Success -> player.spigot().sendMessage( - TextComponent() - .add("To link your account, please ") - .add("click here") { - it.isBold = true - it.isUnderlined = true - it.clickEvent = ClickEvent(ClickEvent.Action.OPEN_URL, result.value.urlString) - it.hoverEvent = HoverEvent(HoverEvent.Action.SHOW_TEXT, Text(result.value.urlString)) - } - .add(" and login if required") - ) - } - } - - private suspend fun syncGroups(player: Player) { - val result = updatePlayerGroups.execute(player.uniqueId) - - when (result) { - is Failure -> when (result.reason) { - UpdatePlayerGroups.FailureReason.ACCOUNT_NOT_LINKED - -> player.send().error("Sync failed. Did you finish registering your account?") - } - is Success -> { - player.send().success("Account linked! Your rank will be automatically synchronized with the PCB network") - } - } - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/ranksync/commands/SyncOtherCommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/ranksync/commands/SyncOtherCommand.kt deleted file mode 100644 index 53ce1fdec..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/ranksync/commands/SyncOtherCommand.kt +++ /dev/null @@ -1,28 +0,0 @@ -package com.projectcitybuild.modules.ranksync.commands - -import com.projectcitybuild.modules.ranksync.actions.UpdatePlayerGroups -import com.projectcitybuild.pcbridge.core.utils.Failure -import com.projectcitybuild.pcbridge.core.utils.Success -import com.projectcitybuild.support.textcomponent.send -import org.bukkit.entity.Player - -class SyncOtherCommand( - private val updatePlayerGroups: UpdatePlayerGroups, -) { - suspend fun execute(commandSender: Player, targetPlayer: Player) { - val result = updatePlayerGroups.execute(targetPlayer.uniqueId) - - when (result) { - is Failure -> commandSender.send().error( - when (result.reason) { - UpdatePlayerGroups.FailureReason.ACCOUNT_NOT_LINKED - -> "Sync failed: Player does not have a linked PCB account" - } - ) - is Success -> { - commandSender.send().success("$targetPlayer has been synchronized") - targetPlayer.send().success("Your account groups have been synchronized") - } - } - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/ranksync/listener/SyncPlayerGroupsOnJoinListener.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/ranksync/listener/SyncPlayerGroupsOnJoinListener.kt deleted file mode 100644 index 5a4c1ffea..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/ranksync/listener/SyncPlayerGroupsOnJoinListener.kt +++ /dev/null @@ -1,19 +0,0 @@ -package com.projectcitybuild.modules.ranksync.listener - -import com.projectcitybuild.entities.events.ConnectionPermittedEvent -import com.projectcitybuild.modules.ranksync.actions.SyncPlayerGroupsWithAggregate -import com.projectcitybuild.support.spigot.listeners.SpigotListener -import org.bukkit.event.EventHandler - -class SyncPlayerGroupsOnJoinListener( - private val syncPlayerGroupsWithAggregate: SyncPlayerGroupsWithAggregate, -) : SpigotListener { - - @EventHandler - override suspend fun handle(event: ConnectionPermittedEvent) { - syncPlayerGroupsWithAggregate.execute( - playerUUID = event.playerUUID, - aggregate = event.aggregate, - ) - } -} \ No newline at end of file diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/telemetry/TelemetryModule.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/telemetry/TelemetryModule.kt deleted file mode 100644 index 99fe6cf65..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/telemetry/TelemetryModule.kt +++ /dev/null @@ -1,19 +0,0 @@ -package com.projectcitybuild.modules.telemetry - -import com.projectcitybuild.modules.telemetry.listeners.PlayerJoinListener -import com.projectcitybuild.modules.telemetry.listeners.PlayerQuitListener -import com.projectcitybuild.support.modules.ModuleDeclaration -import com.projectcitybuild.support.modules.PluginModule - -class TelemetryModule: PluginModule { - override fun register(module: ModuleDeclaration) { - module { - listener( - PlayerJoinListener(container.telemetryRepository), - ) - listener( - PlayerQuitListener(container.telemetryRepository), - ) - } - } -} \ No newline at end of file diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/telemetry/listeners/PlayerJoinListener.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/telemetry/listeners/PlayerJoinListener.kt deleted file mode 100644 index 5ec389be9..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/telemetry/listeners/PlayerJoinListener.kt +++ /dev/null @@ -1,19 +0,0 @@ -package com.projectcitybuild.modules.telemetry.listeners - -import com.projectcitybuild.repositories.TelemetryRepository -import com.projectcitybuild.support.spigot.listeners.SpigotListener -import org.bukkit.event.EventHandler -import org.bukkit.event.player.PlayerJoinEvent - -class PlayerJoinListener( - private val telemetryRepository: TelemetryRepository, -) : SpigotListener { - - @EventHandler - override suspend fun handle(event: PlayerJoinEvent) { - telemetryRepository.playerSeen( - playerUUID = event.player.uniqueId, - playerName = event.player.name, - ) - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/telemetry/listeners/PlayerQuitListener.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/telemetry/listeners/PlayerQuitListener.kt deleted file mode 100644 index 7822b4700..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/telemetry/listeners/PlayerQuitListener.kt +++ /dev/null @@ -1,19 +0,0 @@ -package com.projectcitybuild.modules.telemetry.listeners - -import com.projectcitybuild.repositories.TelemetryRepository -import com.projectcitybuild.support.spigot.listeners.SpigotListener -import org.bukkit.event.EventHandler -import org.bukkit.event.player.PlayerQuitEvent - -class PlayerQuitListener( - private val telemetryRepository: TelemetryRepository, -) : SpigotListener { - - @EventHandler - override suspend fun handle(event: PlayerQuitEvent) { - telemetryRepository.playerSeen( - playerUUID = event.player.uniqueId, - playerName = event.player.name, - ) - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/warps/WarpsModule.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/warps/WarpsModule.kt deleted file mode 100644 index 16d77a335..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/warps/WarpsModule.kt +++ /dev/null @@ -1,111 +0,0 @@ -package com.projectcitybuild.modules.warps - -import com.projectcitybuild.entities.Permissions -import com.projectcitybuild.modules.warps.actions.CreateWarp -import com.projectcitybuild.modules.warps.actions.DeleteWarp -import com.projectcitybuild.modules.warps.actions.GetWarpList -import com.projectcitybuild.modules.warps.actions.TeleportToWarp -import com.projectcitybuild.modules.warps.commands.DeleteWarpCommand -import com.projectcitybuild.modules.warps.commands.CreateWarpCommand -import com.projectcitybuild.modules.warps.commands.WarpCommand -import com.projectcitybuild.modules.warps.commands.ListWarpsCommand -import com.projectcitybuild.support.commandapi.suspendExecutesPlayer -import com.projectcitybuild.support.modules.ModuleDeclaration -import com.projectcitybuild.support.modules.PluginModule -import dev.jorel.commandapi.arguments.ArgumentSuggestions -import dev.jorel.commandapi.arguments.IntegerArgument -import dev.jorel.commandapi.arguments.StringArgument -import dev.jorel.commandapi.executors.PlayerCommandExecutor - -class WarpsModule: PluginModule { - override fun register(module: ModuleDeclaration) = module { - command("delwarp") { - withPermission(Permissions.COMMAND_WARPS_DELETE) - withShortDescription("Deletes a warp") - withArguments( - StringArgument("warp") - .replaceSuggestions( - ArgumentSuggestions.strings(container.warpRepository.names()) - ), - ) - suspendExecutesPlayer(container.plugin) { player, args -> - DeleteWarpCommand( - DeleteWarp( - container.warpRepository, - container.localEventBroadcaster, - ), - ).execute( - commandSender = player, - warpName = args.get("warp") as String, - ) - } - } - - command("setwarp") { - withPermission(Permissions.COMMAND_WARPS_CREATE) - withShortDescription("Creates a warp at the current position and direction") - withArguments( - StringArgument("warp") - .replaceSuggestions( - ArgumentSuggestions.strings(container.warpRepository.names()) - ), - ) - executesPlayer(PlayerCommandExecutor { player, args -> - CreateWarpCommand( - CreateWarp( - container.warpRepository, - container.localEventBroadcaster, - container.time, - ) - ).execute( - commandSender = player, - warpName = args.get("warp") as String, - ) - }) - } - - command("warps") { - withPermission(Permissions.COMMAND_WARPS_LIST) - withShortDescription("Gets a list of all warps available") - withOptionalArguments( - IntegerArgument("page"), - ) - executesPlayer(PlayerCommandExecutor { player, args -> - ListWarpsCommand( - GetWarpList( - container.warpRepository, - container.config, - ) - ).execute( - commandSender = player, - pageIndex = args.get("page") as Int?, - ) - }) - } - - command("warp") { - withPermission(Permissions.COMMAND_WARPS_USE) - withShortDescription("Teleports to a pre-defined location") - withArguments( - StringArgument("warp") - .replaceSuggestions( - ArgumentSuggestions.strings(container.warpRepository.names()) - ), - ) - executesPlayer(PlayerCommandExecutor { player, args -> - WarpCommand( - TeleportToWarp( - container.warpRepository, - container.nameGuesser, - container.logger, - container.localEventBroadcaster, - container.server, - ), - ).execute( - commandSender = player, - warpName = args.get("warp") as String, - ) - }) - } - } -} \ No newline at end of file diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/warps/actions/CreateWarp.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/warps/actions/CreateWarp.kt deleted file mode 100644 index f3fa0a2d3..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/warps/actions/CreateWarp.kt +++ /dev/null @@ -1,37 +0,0 @@ -package com.projectcitybuild.modules.warps.actions - -import com.projectcitybuild.entities.SerializableLocation -import com.projectcitybuild.entities.Warp -import com.projectcitybuild.entities.events.WarpCreateEvent -import com.projectcitybuild.pcbridge.core.modules.datetime.time.Time -import com.projectcitybuild.pcbridge.core.utils.Failure -import com.projectcitybuild.pcbridge.core.utils.Result -import com.projectcitybuild.pcbridge.core.utils.Success -import com.projectcitybuild.repositories.WarpRepository -import com.projectcitybuild.support.spigot.eventbroadcast.LocalEventBroadcaster - -class CreateWarp( - private val warpRepository: WarpRepository, - private val localEventBroadcaster: LocalEventBroadcaster, - private val time: Time, -) { - enum class FailureReason { - WARP_ALREADY_EXISTS, - } - - fun createWarp(name: String, location: SerializableLocation): Result { - if (warpRepository.exists(name)) { - return Failure(FailureReason.WARP_ALREADY_EXISTS) - } - val warp = Warp( - name, - location, - time.now() - ) - warpRepository.add(warp) - - localEventBroadcaster.emit(WarpCreateEvent()) - - return Success(Unit) - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/warps/actions/DeleteWarp.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/warps/actions/DeleteWarp.kt deleted file mode 100644 index 46e3ba528..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/warps/actions/DeleteWarp.kt +++ /dev/null @@ -1,29 +0,0 @@ -package com.projectcitybuild.modules.warps.actions - -import com.projectcitybuild.entities.events.WarpDeleteEvent -import com.projectcitybuild.pcbridge.core.utils.Failure -import com.projectcitybuild.pcbridge.core.utils.Result -import com.projectcitybuild.pcbridge.core.utils.Success -import com.projectcitybuild.repositories.WarpRepository -import com.projectcitybuild.support.spigot.eventbroadcast.LocalEventBroadcaster - -class DeleteWarp( - private val warpRepository: WarpRepository, - private val localEventBroadcaster: LocalEventBroadcaster, -) { - enum class FailureReason { - WARP_NOT_FOUND, - } - - fun deleteWarp(name: String): Result { - if (!warpRepository.exists(name)) { - return Failure(FailureReason.WARP_NOT_FOUND) - } - // TODO: Add confirmation - warpRepository.delete(name) - - localEventBroadcaster.emit(WarpDeleteEvent()) - - return Success(Unit) - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/warps/actions/GetWarpList.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/warps/actions/GetWarpList.kt deleted file mode 100644 index 28027a4f3..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/warps/actions/GetWarpList.kt +++ /dev/null @@ -1,43 +0,0 @@ -package com.projectcitybuild.modules.warps.actions - -import com.projectcitybuild.entities.ConfigData -import com.projectcitybuild.pcbridge.core.modules.config.Config -import com.projectcitybuild.repositories.WarpRepository -import kotlin.math.ceil -import kotlin.math.max -import kotlin.math.min - -class GetWarpList( - private val warpRepository: WarpRepository, - private val config: Config -) { - data class WarpList( - val totalWarps: Int, - val totalPages: Int, - val currentPage: Int, - val warps: List, - ) - - fun getList(page: Int = 1): WarpList? { - val warpsPerPage = config.get().warps.itemsPerPage - val availableWarps = warpRepository.names() - val totalWarpPages = ceil((availableWarps.size.toDouble() / warpsPerPage.toDouble())).toInt() - - if (availableWarps.isEmpty()) { - return null - } - - val currentPage = min(page, totalWarpPages) - - val warpList = availableWarps - .sorted() - .chunked(warpsPerPage)[max(currentPage - 1, 0)] - - return WarpList( - totalWarps = availableWarps.size, - totalPages = totalWarpPages, - currentPage = currentPage, - warps = warpList, - ) - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/warps/actions/TeleportToWarp.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/warps/actions/TeleportToWarp.kt deleted file mode 100644 index 94ad25b5c..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/warps/actions/TeleportToWarp.kt +++ /dev/null @@ -1,64 +0,0 @@ -package com.projectcitybuild.modules.warps.actions - -import com.projectcitybuild.entities.events.PlayerPreWarpEvent -import com.projectcitybuild.libs.nameguesser.NameGuesser -import com.projectcitybuild.pcbridge.core.contracts.PlatformLogger -import com.projectcitybuild.pcbridge.core.utils.Failure -import com.projectcitybuild.pcbridge.core.utils.Result -import com.projectcitybuild.pcbridge.core.utils.Success -import com.projectcitybuild.repositories.WarpRepository -import com.projectcitybuild.support.spigot.eventbroadcast.LocalEventBroadcaster -import org.bukkit.Location -import org.bukkit.Server -import org.bukkit.entity.Player - -class TeleportToWarp( - private val warpRepository: WarpRepository, - private val nameGuesser: NameGuesser, - private val logger: PlatformLogger, - private val localEventBroadcaster: LocalEventBroadcaster, - private val server: Server, -) { - data class Warp( - val warpName: String, - ) - enum class FailureReason { - WARP_NOT_FOUND, - WORLD_NOT_FOUND, - } - - fun warp( - player: Player, - targetWarpName: String, - ): Result { - val availableWarpNames = warpRepository.names() - - val matchingWarpName = nameGuesser.guessClosest(targetWarpName, availableWarpNames) - ?: return Failure(FailureReason.WARP_NOT_FOUND) - - val warp = warpRepository.first(matchingWarpName) - ?: return Failure(FailureReason.WARP_NOT_FOUND) - - val world = server.getWorld(warp.location.worldName) - if (world == null) { - logger.warning("Could not find world matching name [${warp.location.worldName}] for warp") - return Failure(FailureReason.WORLD_NOT_FOUND) - } - - localEventBroadcaster.emit( - PlayerPreWarpEvent(player = player) - ) - - player.teleport( - Location( - world, - warp.location.x, - warp.location.y, - warp.location.z, - warp.location.yaw, - warp.location.pitch, - ) - ) - return Success(Warp(warpName = warp.name)) - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/warps/commands/CreateWarpCommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/warps/commands/CreateWarpCommand.kt deleted file mode 100644 index 433ac9cd8..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/warps/commands/CreateWarpCommand.kt +++ /dev/null @@ -1,27 +0,0 @@ -package com.projectcitybuild.modules.warps.commands - -import com.projectcitybuild.entities.SerializableLocation -import com.projectcitybuild.modules.warps.actions.CreateWarp -import com.projectcitybuild.pcbridge.core.utils.Failure -import com.projectcitybuild.pcbridge.core.utils.Success -import com.projectcitybuild.support.textcomponent.send -import org.bukkit.entity.Player - -class CreateWarpCommand( - private val createWarp: CreateWarp, -) { - fun execute(commandSender: Player, warpName: String) { - val result = createWarp.createWarp( - name = warpName, - location = SerializableLocation.fromLocation(commandSender.location) - ) - when (result) { - is Success -> commandSender.send().success("Created warp for $warpName") - is Failure -> commandSender.send().error( - when (result.reason) { - CreateWarp.FailureReason.WARP_ALREADY_EXISTS -> "A warp for $warpName already exists" - } - ) - } - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/warps/commands/DeleteWarpCommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/warps/commands/DeleteWarpCommand.kt deleted file mode 100644 index 5e3f2b9ff..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/warps/commands/DeleteWarpCommand.kt +++ /dev/null @@ -1,26 +0,0 @@ -package com.projectcitybuild.modules.warps.commands - -import com.projectcitybuild.modules.warps.actions.DeleteWarp -import com.projectcitybuild.pcbridge.core.utils.Failure -import com.projectcitybuild.pcbridge.core.utils.Success -import com.projectcitybuild.support.textcomponent.send -import org.bukkit.entity.Player - -class DeleteWarpCommand( - private val deleteWarp: DeleteWarp, -) { - fun execute(commandSender: Player, warpName: String) { - val result = deleteWarp.deleteWarp(warpName) - - when (result) { - is Failure -> { - commandSender.send().error( - when (result.reason) { - DeleteWarp.FailureReason.WARP_NOT_FOUND -> "Warp $warpName does not exist" - } - ) - } - is Success -> commandSender.send().success("Warp $warpName deleted") - } - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/warps/commands/ListWarpsCommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/warps/commands/ListWarpsCommand.kt deleted file mode 100644 index c3710a54e..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/warps/commands/ListWarpsCommand.kt +++ /dev/null @@ -1,49 +0,0 @@ -package com.projectcitybuild.modules.warps.commands - -import com.projectcitybuild.modules.warps.actions.GetWarpList -import com.projectcitybuild.support.textcomponent.add -import com.projectcitybuild.support.textcomponent.send -import net.md_5.bungee.api.ChatColor -import net.md_5.bungee.api.chat.ClickEvent -import net.md_5.bungee.api.chat.HoverEvent -import net.md_5.bungee.api.chat.TextComponent -import net.md_5.bungee.api.chat.hover.content.Text -import org.bukkit.entity.Player -import java.lang.Integer.max - -class ListWarpsCommand( - private val getWarpList: GetWarpList, -) { - fun execute(commandSender: Player, pageIndex: Int?) { - val clampedPageIndex = max(1, pageIndex ?: 1) - val warpList = getWarpList.getList(clampedPageIndex) - if (warpList == null) { - commandSender.send().info("No warps available") - return - } - - val tc = TextComponent() - .add("Warps (${warpList.totalWarps})") { it.isBold = true } - .add("\n---\n") - - warpList.warps.withIndex().forEach { (index, name) -> - if (index != 0) { - tc.add(", ") - } - tc.add( - TextComponent(name).also { - it.clickEvent = ClickEvent(ClickEvent.Action.RUN_COMMAND, "/warp $name") - it.hoverEvent = HoverEvent(HoverEvent.Action.SHOW_TEXT, Text("/warp $name")) - it.isUnderlined = true - } - ) - } - - if (warpList.totalPages > 1) { - tc.add("\n---\n") - .add("Page $clampedPageIndex of ${warpList.totalPages}") { it.color = ChatColor.GRAY } - } - - commandSender.spigot().sendMessage(tc) - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/warps/commands/WarpCommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/warps/commands/WarpCommand.kt deleted file mode 100644 index 54d6f2722..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/warps/commands/WarpCommand.kt +++ /dev/null @@ -1,27 +0,0 @@ -package com.projectcitybuild.modules.warps.commands - -import com.projectcitybuild.modules.warps.actions.TeleportToWarp -import com.projectcitybuild.pcbridge.core.utils.Failure -import com.projectcitybuild.pcbridge.core.utils.Success -import com.projectcitybuild.support.textcomponent.send -import org.bukkit.entity.Player - -class WarpCommand( - private val teleportToWarp: TeleportToWarp, -) { - fun execute(commandSender: Player, warpName: String) { - val result = teleportToWarp.warp( - player = commandSender, - targetWarpName = warpName, - ) - when (result) { - is Failure -> commandSender.send().error( - when (result.reason) { - TeleportToWarp.FailureReason.WARP_NOT_FOUND -> "Warp $warpName does not exist" - TeleportToWarp.FailureReason.WORLD_NOT_FOUND -> "The target server is either offline or invalid" - } - ) - is Success -> commandSender.send().action("Warped to ${result.value.warpName}") - } - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/Container.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/Container.kt new file mode 100644 index 000000000..d4733f052 --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/Container.kt @@ -0,0 +1,662 @@ +package com.projectcitybuild.pcbridge + +import com.github.shynixn.mccoroutine.bukkit.minecraftDispatcher +import com.google.gson.reflect.TypeToken +import com.projectcitybuild.pcbridge.core.config.Config +import com.projectcitybuild.pcbridge.core.config.JsonStorage +import com.projectcitybuild.pcbridge.core.database.DatabaseSession +import com.projectcitybuild.pcbridge.core.database.DatabaseSource +import com.projectcitybuild.pcbridge.core.datetime.DateTimeFormatter +import com.projectcitybuild.pcbridge.core.datetime.LocalizedTime +import com.projectcitybuild.pcbridge.core.errors.SentryReporter +import com.projectcitybuild.pcbridge.core.permissions.Permissions +import com.projectcitybuild.pcbridge.core.permissions.adapters.LuckPermsPermissions +import com.projectcitybuild.pcbridge.core.state.Store +import com.projectcitybuild.pcbridge.data.PluginConfig +import com.projectcitybuild.pcbridge.features.announcements.listeners.AnnouncementEnableListener +import com.projectcitybuild.pcbridge.features.announcements.repositories.AnnouncementRepository +import com.projectcitybuild.pcbridge.features.bans.actions.AuthoriseConnection +import com.projectcitybuild.pcbridge.features.bans.actions.BanIP +import com.projectcitybuild.pcbridge.features.bans.actions.BanUUID +import com.projectcitybuild.pcbridge.features.bans.actions.CheckUUIDBan +import com.projectcitybuild.pcbridge.features.bans.actions.UnbanIP +import com.projectcitybuild.pcbridge.features.bans.actions.UnbanUUID +import com.projectcitybuild.pcbridge.features.bans.commands.BanCommand +import com.projectcitybuild.pcbridge.features.bans.commands.BanIPCommand +import com.projectcitybuild.pcbridge.features.bans.commands.CheckBanCommand +import com.projectcitybuild.pcbridge.features.bans.commands.UnbanCommand +import com.projectcitybuild.pcbridge.features.bans.commands.UnbanIPCommand +import com.projectcitybuild.pcbridge.features.bans.listeners.AuthorizeConnectionListener +import com.projectcitybuild.pcbridge.features.bans.repositories.AggregateRepository +import com.projectcitybuild.pcbridge.features.bans.repositories.IPBanRepository +import com.projectcitybuild.pcbridge.features.bans.repositories.PlayerBanRepository +import com.projectcitybuild.pcbridge.features.bans.repositories.PlayerUUIDRepository +import com.projectcitybuild.pcbridge.features.chat.ChatBadgeFormatter +import com.projectcitybuild.pcbridge.features.chat.ChatGroupFormatter +import com.projectcitybuild.pcbridge.features.chat.listeners.EmojiChatListener +import com.projectcitybuild.pcbridge.features.chat.listeners.FormatNameChatListener +import com.projectcitybuild.pcbridge.features.chat.listeners.SyncBadgesOnJoinListener +import com.projectcitybuild.pcbridge.features.chat.repositories.ChatBadgeRepository +import com.projectcitybuild.pcbridge.features.chat.repositories.ChatGroupRepository +import com.projectcitybuild.pcbridge.features.invisframes.commands.InvisFrameCommand +import com.projectcitybuild.pcbridge.features.invisframes.listeners.FrameItemInsertListener +import com.projectcitybuild.pcbridge.features.invisframes.listeners.FrameItemRemoveListener +import com.projectcitybuild.pcbridge.features.invisframes.listeners.FramePlaceListener +import com.projectcitybuild.pcbridge.features.joinmessages.listeners.AnnounceJoinListener +import com.projectcitybuild.pcbridge.features.joinmessages.listeners.AnnounceQuitListener +import com.projectcitybuild.pcbridge.features.joinmessages.listeners.FirstTimeJoinListener +import com.projectcitybuild.pcbridge.features.joinmessages.listeners.ServerOverviewJoinListener +import com.projectcitybuild.pcbridge.features.joinmessages.repositories.PlayerConfigRepository +import com.projectcitybuild.pcbridge.features.mute.commands.MuteCommand +import com.projectcitybuild.pcbridge.features.mute.commands.UnmuteCommand +import com.projectcitybuild.pcbridge.features.mute.listeners.MuteChatListener +import com.projectcitybuild.pcbridge.features.nightvision.commands.NightVisionCommand +import com.projectcitybuild.pcbridge.features.staffchat.commands.StaffChatCommand +import com.projectcitybuild.pcbridge.features.sync.actions.GenerateAccountVerificationURL +import com.projectcitybuild.pcbridge.features.sync.actions.SyncPlayerGroups +import com.projectcitybuild.pcbridge.features.sync.actions.UpdatePlayerGroups +import com.projectcitybuild.pcbridge.features.sync.commands.SyncCommand +import com.projectcitybuild.pcbridge.features.sync.commands.SyncOtherCommand +import com.projectcitybuild.pcbridge.features.sync.listener.SyncRankOnJoinListener +import com.projectcitybuild.pcbridge.features.sync.repositories.SyncRepository +import com.projectcitybuild.pcbridge.features.telemetry.listeners.TelemetryPlayerConnectListener +import com.projectcitybuild.pcbridge.features.telemetry.repositories.TelemetryRepository +import com.projectcitybuild.pcbridge.features.utilities.commands.PCBridgeCommand +import com.projectcitybuild.pcbridge.features.warnings.actions.GetUnacknowledgedWarnings +import com.projectcitybuild.pcbridge.features.warnings.commands.WarningAcknowledgeCommand +import com.projectcitybuild.pcbridge.features.warnings.listeners.NotifyWarningsOnJoinListener +import com.projectcitybuild.pcbridge.features.warnings.repositories.PlayerWarningRepository +import com.projectcitybuild.pcbridge.features.warps.Warp +import com.projectcitybuild.pcbridge.features.warps.commands.WarpCommand +import com.projectcitybuild.pcbridge.features.warps.commands.WarpsCommand +import com.projectcitybuild.pcbridge.features.warps.repositories.WarpRepository +import com.projectcitybuild.pcbridge.http.HttpService +import com.projectcitybuild.pcbridge.integrations.DynmapIntegration +import com.projectcitybuild.pcbridge.integrations.EssentialsIntegration +import com.projectcitybuild.pcbridge.integrations.LuckPermsIntegration +import com.projectcitybuild.pcbridge.support.spigot.SpigotCommandRegistry +import com.projectcitybuild.pcbridge.support.spigot.SpigotListenerRegistry +import com.projectcitybuild.pcbridge.support.spigot.SpigotNamespace +import com.projectcitybuild.pcbridge.support.spigot.SpigotTimer +import io.github.reactivecircus.cache4k.Cache +import net.kyori.adventure.platform.bukkit.BukkitAudiences +import net.kyori.adventure.text.Component +import org.bukkit.plugin.java.JavaPlugin +import org.koin.core.module.Module +import org.koin.core.module.dsl.createdAtStart +import org.koin.core.module.dsl.onClose +import org.koin.core.module.dsl.withOptions +import org.koin.core.qualifier.named +import org.koin.dsl.module +import org.koin.dsl.onClose +import java.time.Clock +import java.time.ZoneId +import java.util.Locale +import java.util.UUID +import kotlin.time.Duration.Companion.minutes + +fun pluginModule(_plugin: JavaPlugin) = + module { + spigot(_plugin) + core() + http() + integrations() + + // Features + announcements() + bans() + chat() + joinMessages() + invisFrames() + mute() + nightVision() + staffChat() + sync() + telemetry() + utilities() + warps() + warnings() + } + +private fun Module.spigot(plugin: JavaPlugin) { + single { plugin } + + factory { + get().server + } + + single { + BukkitAudiences.create(get()) + } + + single { + SpigotNamespace( + plugin = get(), + ) + } + + single { + SpigotCommandRegistry( + plugin = get(), + sentry = get(), + ) + } + + single { + SpigotListenerRegistry( + plugin = get(), + ) + } + + single { + LuckPermsPermissions() + } + + factory { + SpigotTimer( + plugin = get(), + ) + } +} + +private fun Module.core() { + single { + Config( + jsonStorage = + JsonStorage( + file = + get() + .dataFolder + .resolve("config.json"), + typeToken = object : TypeToken() {}, + ), + ) + } + + single { + DatabaseSession().apply { + val configProvider = get() + val config = configProvider.get() + connect(DatabaseSource.fromConfig(config)) + } + } withOptions { + createdAtStart() + onClose { it?.disconnect() } + } + + single { + SentryReporter( + config = get(), + ).apply { + val configProvider = get() + val config = configProvider.get() + if (config.errorReporting.isSentryEnabled) { + start() + } + } + } onClose { + it?.close() + } + + factory { + val config = get().get() + val zoneId = ZoneId.of(config.localization.timeZone) + + LocalizedTime( + clock = Clock.system(zoneId), + ) + } + + factory { + val config = get().get() + + DateTimeFormatter( + locale = + Locale.forLanguageTag( + config.localization.locale, + ), + timezone = + ZoneId.of( + config.localization.timeZone, + ), + ) + } + + single { Store() } +} + +private fun Module.http() { + single { + val config = get().get() + + HttpService( + authToken = config.api.token, + baseURL = config.api.baseUrl, + withLogging = config.api.isLoggingEnabled, + ) + } +} + +private fun Module.integrations() { + single { + DynmapIntegration( + plugin = get(), + config = get(), + sentry = get(), + warpRepository = get(), + ) + } + + single { + EssentialsIntegration( + plugin = get(), + sentry = get(), + ) + } + + single { + LuckPermsIntegration() + } +} + +private fun Module.announcements() { + single { + AnnouncementRepository( + config = get(), + store = get(), + ) + } + + factory { + AnnouncementEnableListener( + announcementRepository = get(), + config = get(), + timer = get(), + server = get(), + plugin = get(), + ) + } +} + +private fun Module.warps() { + single { + WarpRepository( + db = get(), + cache = + Cache.Builder() + .expireAfterWrite(30.minutes) + .build(), + ) + } + + factory { + WarpCommand( + warpRepository = get(), + server = get(), + ) + } + + factory { + WarpsCommand( + warpRepository = get(), + config = get(), + server = get(), + time = get(), + ) + } +} + +private fun Module.joinMessages() { + factory { + PlayerConfigRepository( + dataSource = get(), + ) + } + + factory { + AnnounceJoinListener( + config = get(), + store = get(), + time = get(), + ) + } + + factory { + AnnounceQuitListener( + config = get(), + store = get(), + time = get(), + ) + } + + factory { + FirstTimeJoinListener( + config = get(), + server = get(), + playerConfigRepository = get(), + time = get(), + ) + } + + factory { + ServerOverviewJoinListener( + config = get(), + ) + } +} + +private fun Module.bans() { + factory { + AggregateRepository( + httpService = get().aggregate, + ) + } + + factory { + PlayerBanRepository( + httpService = get().uuidBan, + ) + } + + factory { + PlayerUUIDRepository( + server = get(), + httpService = get().playerUuid, + ) + } + + factory { + IPBanRepository( + httpService = get().ipBan, + ) + } + + factory { + BanCommand( + banUUID = + BanUUID( + playerBanRepository = get(), + playerUUIDRepository = get(), + server = get(), + ), + server = get(), + ) + } + + factory { + BanIPCommand( + banIP = + BanIP( + ipBanRepository = get(), + server = get(), + ), + server = get(), + ) + } + + factory { + UnbanCommand( + unbanUUID = + UnbanUUID( + playerBanRepository = get(), + playerUUIDRepository = get(), + ), + ) + } + + factory { + UnbanIPCommand( + unbanIP = + UnbanIP( + ipBanRepository = get(), + ), + ) + } + + factory { + CheckBanCommand( + checkUUIDBan = + CheckUUIDBan( + dateTimeFormatter = get(), + playerUUIDRepository = get(), + playerBanRepository = get(), + ), + ) + } + + factory { + AuthorizeConnectionListener( + aggregateRepository = get(), + authoriseConnection = AuthoriseConnection(), + dateTimeFormatter = get(), + sentry = get(), + server = get(), + minecraftDispatcher = { get().minecraftDispatcher }, + store = get(), + ) + } +} + +private fun Module.mute() { + single(named("mute_cache")) { + // We use a regular cache instead of the server state here + // so that mutes persist even if the player leaves, but + // invalidates if the plugin is reloaded/shutdown + Cache.Builder().build() + } + + factory { + MuteCommand( + server = get(), + mutedPlayers = get(named("mute_cache")), + ) + } + + factory { + UnmuteCommand( + server = get(), + mutedPlayers = get(named("mute_cache")), + ) + } + + factory { + MuteChatListener( + mutedPlayers = get(named("mute_cache")), + ) + } +} + +private fun Module.nightVision() { + factory { + NightVisionCommand() + } +} + +private fun Module.invisFrames() { + factory { + InvisFrameCommand( + spigotNamespace = get(), + ) + } + + factory { + FramePlaceListener( + spigotNamespace = get(), + ) + } + + factory { + FrameItemInsertListener( + spigotNamespace = get(), + ) + } + + factory { + FrameItemRemoveListener( + spigotNamespace = get(), + ) + } +} + +private fun Module.chat() { + factory { + ChatBadgeRepository( + store = get(), + config = get(), + ) + } + + factory { + ChatGroupRepository( + permissions = get(), + config = get(), + ) + } + + single(named("badge_cache")) { + Cache.Builder().build() + } + + single(named("group_cache")) { + Cache.Builder().build() + } + + factory { + ChatBadgeFormatter( + chatBadgeRepository = get(), + ) + } + + factory { + ChatGroupFormatter( + chatGroupRepository = get(), + ) + } + + factory { + EmojiChatListener() + } + + factory { + FormatNameChatListener( + chatGroupFormatter = get(), + chatBadgeFormatter = get(), + badgeCache = get(named("badge_cache")), + groupCache = get(named("group_cache")), + ) + } + + factory { + SyncBadgesOnJoinListener( + store = get(), + ) + } +} + +private fun Module.telemetry() { + factory { + TelemetryRepository( + telemetryHttpService = get().telemetry, + ) + } + + factory { + TelemetryPlayerConnectListener( + telemetryRepository = get(), + ) + } +} + +private fun Module.staffChat() { + factory { + StaffChatCommand( + server = get(), + ) + } +} + +private fun Module.sync() { + factory { + SyncRepository( + playerGroupHttpService = get().playerGroup, + accountLinkHttpService = get().verificationURL, + config = get(), + ) + } + + factory { + UpdatePlayerGroups( + permissions = get(), + syncRepository = get(), + ) + } + + factory { + GenerateAccountVerificationURL( + syncRepository = get(), + ) + } + + factory { + SyncPlayerGroups( + permissions = get(), + syncRepository = get(), + ) + } + + factory { + SyncCommand( + generateAccountVerificationURL = get(), + updatePlayerGroups = get(), + ) + } + + factory { + SyncOtherCommand( + server = get(), + updatePlayerGroups = get(), + ) + } + + factory { + SyncRankOnJoinListener( + syncPlayerGroups = get(), + ) + } +} + +private fun Module.utilities() { + factory { + PCBridgeCommand( + plugin = get(), + ) + } + + factory { + PCBridgeCommand.TabCompleter() + } +} + +private fun Module.warnings() { + factory { + PlayerWarningRepository( + playerWarningHttpService = get().playerWarning, + ) + } + + factory { + WarningAcknowledgeCommand( + warningRepository = get(), + ) + } + + factory { + NotifyWarningsOnJoinListener( + getUnacknowledgedWarnings = + GetUnacknowledgedWarnings( + dateTimeFormatter = get(), + warningRepository = get(), + ), + ) + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/Permissions.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/Permissions.kt similarity index 97% rename from pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/Permissions.kt rename to pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/Permissions.kt index c6e7b94f3..3e09f44ae 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/Permissions.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/Permissions.kt @@ -1,4 +1,4 @@ -package com.projectcitybuild.entities +package com.projectcitybuild.pcbridge class Permissions private constructor() { companion object { @@ -23,4 +23,4 @@ class Permissions private constructor() { const val COMMAND_WARPS_USE = "pcbridge.warp.use" const val COMMAND_UTILITIES = "pcbridge.utilities" } -} \ No newline at end of file +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/Plugin.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/Plugin.kt new file mode 100644 index 000000000..40ea32adc --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/Plugin.kt @@ -0,0 +1,209 @@ +package com.projectcitybuild.pcbridge + +import com.github.shynixn.mccoroutine.bukkit.SuspendingJavaPlugin +import com.projectcitybuild.pcbridge.core.errors.SentryReporter +import com.projectcitybuild.pcbridge.core.errors.trace +import com.projectcitybuild.pcbridge.features.announcements.listeners.AnnouncementEnableListener +import com.projectcitybuild.pcbridge.features.bans.commands.BanCommand +import com.projectcitybuild.pcbridge.features.bans.commands.BanIPCommand +import com.projectcitybuild.pcbridge.features.bans.commands.CheckBanCommand +import com.projectcitybuild.pcbridge.features.bans.commands.UnbanCommand +import com.projectcitybuild.pcbridge.features.bans.commands.UnbanIPCommand +import com.projectcitybuild.pcbridge.features.bans.listeners.AuthorizeConnectionListener +import com.projectcitybuild.pcbridge.features.chat.listeners.EmojiChatListener +import com.projectcitybuild.pcbridge.features.chat.listeners.FormatNameChatListener +import com.projectcitybuild.pcbridge.features.chat.listeners.SyncBadgesOnJoinListener +import com.projectcitybuild.pcbridge.features.invisframes.commands.InvisFrameCommand +import com.projectcitybuild.pcbridge.features.invisframes.listeners.FrameItemInsertListener +import com.projectcitybuild.pcbridge.features.invisframes.listeners.FrameItemRemoveListener +import com.projectcitybuild.pcbridge.features.invisframes.listeners.FramePlaceListener +import com.projectcitybuild.pcbridge.features.joinmessages.listeners.AnnounceJoinListener +import com.projectcitybuild.pcbridge.features.joinmessages.listeners.AnnounceQuitListener +import com.projectcitybuild.pcbridge.features.joinmessages.listeners.FirstTimeJoinListener +import com.projectcitybuild.pcbridge.features.joinmessages.listeners.ServerOverviewJoinListener +import com.projectcitybuild.pcbridge.features.mute.commands.MuteCommand +import com.projectcitybuild.pcbridge.features.mute.commands.UnmuteCommand +import com.projectcitybuild.pcbridge.features.mute.listeners.MuteChatListener +import com.projectcitybuild.pcbridge.features.nightvision.commands.NightVisionCommand +import com.projectcitybuild.pcbridge.features.staffchat.commands.StaffChatCommand +import com.projectcitybuild.pcbridge.features.sync.commands.SyncCommand +import com.projectcitybuild.pcbridge.features.sync.commands.SyncOtherCommand +import com.projectcitybuild.pcbridge.features.sync.listener.SyncRankOnJoinListener +import com.projectcitybuild.pcbridge.features.telemetry.listeners.TelemetryPlayerConnectListener +import com.projectcitybuild.pcbridge.features.utilities.commands.PCBridgeCommand +import com.projectcitybuild.pcbridge.features.warnings.commands.WarningAcknowledgeCommand +import com.projectcitybuild.pcbridge.features.warnings.listeners.NotifyWarningsOnJoinListener +import com.projectcitybuild.pcbridge.features.warps.commands.WarpCommand +import com.projectcitybuild.pcbridge.features.warps.commands.WarpsCommand +import com.projectcitybuild.pcbridge.integrations.DynmapIntegration +import com.projectcitybuild.pcbridge.integrations.EssentialsIntegration +import com.projectcitybuild.pcbridge.integrations.LuckPermsIntegration +import com.projectcitybuild.pcbridge.support.spigot.SpigotCommandRegistry +import com.projectcitybuild.pcbridge.support.spigot.SpigotListenerRegistry +import com.projectcitybuild.pcbridge.support.spigot.SpigotTimer +import net.kyori.adventure.platform.bukkit.BukkitAudiences +import org.koin.core.KoinApplication +import org.koin.core.component.KoinComponent +import org.koin.core.component.get +import org.koin.core.component.inject +import org.koin.core.context.GlobalContext.startKoin +import org.koin.core.context.GlobalContext.stopKoin + +class Plugin : SuspendingJavaPlugin() { + private var container: KoinApplication? = null + + override suspend fun onEnableAsync() { + printLogo() + + val module = pluginModule(this) + val container = + startKoin { + modules(module) + } + this.container = container + + Lifecycle().boot().onFailure { + server.pluginManager.disablePlugin(this) + } + } + + override suspend fun onDisableAsync() { + Lifecycle().shutdown() + + this.container?.close() + this.container = null + stopKoin() + + logger.info("Goodbye") + } + + private fun printLogo() = + logo + .split("\n") + .forEach(logger::info) +} + +private class Lifecycle : KoinComponent { + private val audiences: BukkitAudiences = get() + private val sentry: SentryReporter by inject() + private val commandRegistry: SpigotCommandRegistry by inject() + private val listenerRegistry: SpigotListenerRegistry by inject() + + suspend fun boot() = + sentry.trace { + commandRegistry.apply { + register( + handler = get(), + argsParser = PCBridgeCommand.Args.Parser(), + tabCompleter = get(), + ) + register( + handler = get(), + argsParser = WarpCommand.Args.Parser(), + ) + register( + handler = get(), + argsParser = WarpsCommand.Args.Parser(), + ) + register( + handler = get(), + argsParser = StaffChatCommand.Args.Parser(), + ) + register( + handler = get(), + argsParser = MuteCommand.Args.Parser(), + ) + register( + handler = get(), + argsParser = UnmuteCommand.Args.Parser(), + ) + register( + handler = get(), + argsParser = NightVisionCommand.Args.Parser(), + ) + register( + handler = get(), + argsParser = InvisFrameCommand.Args.Parser(), + ) + register( + handler = get(), + argsParser = BanCommand.Args.Parser(), + ) + register( + handler = get(), + argsParser = BanIPCommand.Args.Parser(), + ) + register( + handler = get(), + argsParser = CheckBanCommand.Args.Parser(), + ) + register( + handler = get(), + argsParser = UnbanCommand.Args.Parser(), + ) + register( + handler = get(), + argsParser = UnbanIPCommand.Args.Parser(), + ) + register( + handler = get(), + argsParser = SyncCommand.Args.Parser(), + ) + register( + handler = get(), + argsParser = SyncOtherCommand.Args.Parser(), + ) + register( + handler = get(), + argsParser = WarningAcknowledgeCommand.Args.Parser(), + ) + } + listenerRegistry.register( + get(), + get(), + get(), + get(), + get(), + get(), + get(), + get(), + get(), + get(), + get(), + get(), + get(), + get(), + get(), + get(), + ) + + get().enable() + get().enable() + get().enable() + } + + suspend fun shutdown() = + sentry.trace { + get().cancelAll() + + get().disable() + get().disable() + get().disable() + + listenerRegistry.unregisterAll() + commandRegistry.unregisterAll() + audiences.close() + } +} + +private val logo = + """ + + ██████╗ ██████╗██████╗ ██████╗ ██╗██████╗ ██████╗ ███████╗ + ██╔══██╗██╔════╝██╔══██╗██╔══██╗██║██╔══██╗██╔════╝ ██╔════╝ + ██████╔╝██║ ██████╔╝██████╔╝██║██║ ██║██║ ███╗█████╗ + ██╔═══╝ ██║ ██╔══██╗██╔══██╗██║██║ ██║██║ ██║██╔══╝ + ██║ ╚██████╗██████╔╝██║ ██║██║██████╔╝╚██████╔╝███████╗ + ╚═╝ ╚═════╝╚═════╝ ╚═╝ ╚═╝╚═╝╚═════╝ ╚═════╝ ╚══════╝ + + """.trimIndent() diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/core/config/Config.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/core/config/Config.kt new file mode 100644 index 000000000..862be75fe --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/core/config/Config.kt @@ -0,0 +1,24 @@ +package com.projectcitybuild.pcbridge.core.config + +import com.projectcitybuild.pcbridge.data.PluginConfig +import com.projectcitybuild.pcbridge.data.default + +class Config( + private val jsonStorage: JsonStorage, +) { + private var cache: PluginConfig? = null + + fun get(): PluginConfig { + val cache = cache + if (cache != null) { + return cache + } + return (jsonStorage.read() ?: PluginConfig.default()) + .also { this.cache = it } + } + + fun flush() { + cache = null + get() + } +} diff --git a/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/storage/JsonStorage.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/core/config/JsonStorage.kt similarity index 66% rename from pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/storage/JsonStorage.kt rename to pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/core/config/JsonStorage.kt index 00a6f5a20..648cf96d2 100644 --- a/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/storage/JsonStorage.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/core/config/JsonStorage.kt @@ -1,22 +1,22 @@ -package com.projectcitybuild.pcbridge.core.storage +package com.projectcitybuild.pcbridge.core.config import com.google.gson.FieldNamingPolicy import com.google.gson.GsonBuilder import com.google.gson.reflect.TypeToken -import com.projectcitybuild.pcbridge.core.contracts.PlatformLogger +import com.projectcitybuild.pcbridge.core.logger.log import java.io.File import java.io.PrintWriter import java.lang.Exception class JsonStorage( private val file: File, - private val logger: PlatformLogger, private val typeToken: TypeToken, ) { - private val gson = GsonBuilder() - .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES) - .disableHtmlEscaping() - .create() + private val gson = + GsonBuilder() + .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES) + .disableHtmlEscaping() + .create() fun read(): T? { return try { @@ -28,8 +28,8 @@ class JsonStorage( var jsonString = "" file.inputStream().bufferedReader().forEachLine { jsonString += it } gson.fromJson(jsonString, typeToken.type) - } catch (error: Exception) { - logger.severe("Failed to deserialize from json: ${error.message}") + } catch (e: Exception) { + log.error(e) { "Failed to deserialize from json" } null } } @@ -42,8 +42,8 @@ class JsonStorage( PrintWriter(file).use { writer -> gson.toJson(data, typeToken.type, writer) } - } catch (error: Exception) { - logger.severe("Failed to serialize to json: ${error.message}") + } catch (e: Exception) { + log.error(e) { "Failed to serialize to json" } } } } diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/core/database/DatabaseSession.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/core/database/DatabaseSession.kt new file mode 100644 index 000000000..44c1d6704 --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/core/database/DatabaseSession.kt @@ -0,0 +1,74 @@ +package com.projectcitybuild.pcbridge.core.database + +import com.projectcitybuild.pcbridge.core.logger.log +import com.zaxxer.hikari.HikariConfig +import com.zaxxer.hikari.HikariDataSource +import java.sql.Connection + +class DatabaseSession { + private var database: HikariDataSource? = null + + fun connect(source: DatabaseSource) { + val url = "jdbc:mysql://${source.hostName}:${source.port}/${source.databaseName}" + log.debug { "Connecting to $url" } + + val config = + HikariConfig().apply { + jdbcUrl = url + username = source.username + password = source.password + + // See https://github.com/brettwooldridge/HikariCP/wiki/MySQL-Configuration + addDataSourceProperty("cachePrepStmts", true) + addDataSourceProperty("prepStmtCacheSize", 250) + addDataSourceProperty("prepStmtCacheSqlLimit", 2048) + addDataSourceProperty("useServerPrepStmts", true) + addDataSourceProperty("useLocalSessionState", true) + addDataSourceProperty("rewriteBatchedStatements", true) + addDataSourceProperty("cacheResultSetMetadata", true) + addDataSourceProperty("cacheServerConfiguration", true) + addDataSourceProperty("elideSetAutoCommits", true) + addDataSourceProperty("maintainTimeStats", false) + } + database = HikariDataSource(config) + + check(hasDatabase(source.databaseName)) { + "Database not found: ${source.databaseName}" + } + log.info { "Database connection established" } + } + + fun disconnect() { + database?.close() + database = null + + log.info { "Database connection closed" } + } + + fun connect(action: (Connection) -> T): T { + if (database == null) { + log.warn { "Tried to access database before connecting" } + } + val connection = database?.connection + checkNotNull(connection) + + return database!!.connection.use(action) + } + + private fun hasDatabase(expectedName: String): Boolean { + var found = false + + connect { connection -> + connection.metaData.catalogs.use { resultSet -> + while (resultSet.next()) { + val databaseName = resultSet.getString(1) + if (databaseName == expectedName) { + found = true + break + } + } + } + } + return found + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/core/database/DatabaseSource.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/core/database/DatabaseSource.kt new file mode 100644 index 000000000..c7e51eac8 --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/core/database/DatabaseSource.kt @@ -0,0 +1,22 @@ +package com.projectcitybuild.pcbridge.core.database + +import com.projectcitybuild.pcbridge.data.PluginConfig + +data class DatabaseSource( + val hostName: String, + val port: Int = 3306, + val databaseName: String, + val username: String, + val password: String, +) { + companion object { + fun fromConfig(config: PluginConfig) = + DatabaseSource( + hostName = config.database.hostName, + port = config.database.port, + databaseName = config.database.name, + username = config.database.username, + password = config.database.password, + ) + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/core/datetime/DateTimeFormatter.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/core/datetime/DateTimeFormatter.kt new file mode 100644 index 000000000..95e3c8b3a --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/core/datetime/DateTimeFormatter.kt @@ -0,0 +1,27 @@ +package com.projectcitybuild.pcbridge.core.datetime + +import java.time.Instant +import java.time.ZoneId +import java.time.format.FormatStyle +import java.util.Locale +import java.util.concurrent.TimeUnit + +class DateTimeFormatter( + private val locale: Locale, + private val timezone: ZoneId, +) { + fun convert( + timestampInSeconds: Long, + formatStyle: FormatStyle = FormatStyle.MEDIUM, + ): String { + val formatter = + java.time.format.DateTimeFormatter + .ofLocalizedDateTime(formatStyle) + .withLocale(locale) + + val secondsSince1970 = TimeUnit.SECONDS.toSeconds(timestampInSeconds) + val dateTime = Instant.ofEpochSecond(secondsSince1970).atZone(timezone) + + return dateTime.format(formatter) + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/core/datetime/LocalizedTime.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/core/datetime/LocalizedTime.kt new file mode 100644 index 000000000..3d8df5ee9 --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/core/datetime/LocalizedTime.kt @@ -0,0 +1,10 @@ +package com.projectcitybuild.pcbridge.core.datetime + +import java.time.Clock +import java.time.LocalDateTime + +class LocalizedTime( + private val clock: Clock, +) { + fun now(): LocalDateTime = LocalDateTime.now(clock) +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/core/errors/SentryReporter.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/core/errors/SentryReporter.kt new file mode 100644 index 000000000..33aeeb6dd --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/core/errors/SentryReporter.kt @@ -0,0 +1,39 @@ +package com.projectcitybuild.pcbridge.core.errors + +import com.projectcitybuild.pcbridge.core.config.Config +import com.projectcitybuild.pcbridge.core.logger.log +import io.sentry.Sentry + +class SentryReporter( + private val config: Config, +) { + private var started = false + + fun start() { + Sentry.init { options -> + options.dsn = config.get().errorReporting.sentryDsn + } + started = true + log.info { "Sentry error reporting enabled" } + } + + fun close() { + if (started) { + Sentry.close() + log.info { "Sentry error reporting disabled" } + } + } + + fun report(throwable: Throwable) { + if (started) { + Sentry.captureException(throwable) + } + } +} + +suspend fun SentryReporter.trace(block: suspend () -> R): Result { + return runCatching { block() }.onFailure { + report(it) + throw it + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/core/logger/Logger.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/core/logger/Logger.kt new file mode 100644 index 000000000..19f0fb811 --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/core/logger/Logger.kt @@ -0,0 +1,5 @@ +package com.projectcitybuild.pcbridge.core.logger + +import io.github.oshai.kotlinlogging.KotlinLogging + +val log = KotlinLogging.logger("PCBridge") diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/permissions/Permissions.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/core/permissions/Permissions.kt similarity index 52% rename from pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/permissions/Permissions.kt rename to pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/core/permissions/Permissions.kt index aa86b5a6c..df09bbffe 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/permissions/Permissions.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/core/permissions/Permissions.kt @@ -1,16 +1,23 @@ -package com.projectcitybuild.libs.permissions +package com.projectcitybuild.pcbridge.core.permissions import java.util.UUID interface Permissions { - fun connect() + fun setUserGroups( + playerUUID: UUID, + groupNames: List, + ) - fun setUserGroups(playerUUID: UUID, groupNames: List) fun getUserGroups(playerUUID: UUID): Set + fun getUserPrefix(playerUUID: UUID): String + fun getUserSuffix(playerUUID: UUID): String - fun getGroupMetaData(groupName: String, key: String): String? + fun getGroupMetaData( + groupName: String, + key: String, + ): String? fun getGroupDisplayName(groupName: String): String? } diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/permissions/adapters/LuckPermsPermissions.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/core/permissions/adapters/LuckPermsPermissions.kt similarity index 74% rename from pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/permissions/adapters/LuckPermsPermissions.kt rename to pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/core/permissions/adapters/LuckPermsPermissions.kt index 3bdc2bbdf..545386f4f 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/libs/permissions/adapters/LuckPermsPermissions.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/core/permissions/adapters/LuckPermsPermissions.kt @@ -1,7 +1,7 @@ -package com.projectcitybuild.libs.permissions.adapters +package com.projectcitybuild.pcbridge.core.permissions.adapters -import com.projectcitybuild.libs.permissions.Permissions -import com.projectcitybuild.pcbridge.core.contracts.PlatformLogger +import com.projectcitybuild.pcbridge.core.logger.log +import com.projectcitybuild.pcbridge.core.permissions.Permissions import net.luckperms.api.LuckPerms import net.luckperms.api.LuckPermsProvider import net.luckperms.api.model.user.User @@ -10,30 +10,25 @@ import net.luckperms.api.node.types.InheritanceNode import java.util.UUID import java.util.stream.Collectors -class LuckPermsPermissions( - private val logger: PlatformLogger, -) : Permissions { - +class LuckPermsPermissions : Permissions { class PermissionUserNotFoundException() : Exception() - private lateinit var luckPerms: LuckPerms - - override fun connect() { - luckPerms = LuckPermsProvider.get() - - logger.info("Connected to LuckPerms") - } + private val luckPerms: LuckPerms + get() = LuckPermsProvider.get() private fun getUser(playerUUID: UUID): User { val user = luckPerms.userManager.getUser(playerUUID) if (user == null) { - logger.severe("Could not load user ($playerUUID) from permissions manager") + log.error { "Could not load user ($playerUUID) from permissions manager" } throw PermissionUserNotFoundException() } return user } - override fun setUserGroups(playerUUID: UUID, groupNames: List) { + override fun setUserGroups( + playerUUID: UUID, + groupNames: List, + ) { val user = getUser(playerUUID) user.nodes.stream() @@ -47,8 +42,7 @@ class LuckPermsPermissions( groupNames.forEach { groupName -> val groupNode = InheritanceNode.builder(groupName).build() user.data().add(groupNode) - - logger.verbose("Assigning to $groupName group") + log.debug { "Assigning to $groupName group" } } luckPerms.userManager.saveUser(user) @@ -87,9 +81,13 @@ class LuckPermsPermissions( .joinToString(separator = "") } - override fun getGroupMetaData(groupName: String, key: String): String? { - val group = luckPerms.groupManager.getGroup(groupName) - ?: return null + override fun getGroupMetaData( + groupName: String, + key: String, + ): String? { + val group = + luckPerms.groupManager.getGroup(groupName) + ?: return null return group.cachedData.metaData.getMetaValue(key) } diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/core/state/ServerState.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/core/state/ServerState.kt new file mode 100644 index 000000000..3521ad88a --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/core/state/ServerState.kt @@ -0,0 +1,52 @@ +package com.projectcitybuild.pcbridge.core.state + +import com.projectcitybuild.pcbridge.http.responses.Badge +import com.projectcitybuild.pcbridge.support.serializable.LocalDateTimeSerializer +import com.projectcitybuild.pcbridge.support.serializable.UUIDSerializer +import kotlinx.serialization.Serializable +import java.time.LocalDateTime +import java.util.UUID + +/** + * Represents in-memory, global state for the plugin. + * + * This state is persisted to storage on plugin shutdown, + * and restored upon boot. + */ +@Serializable(with = UUIDSerializer::class) +data class ServerState( + /** + * Individual state for each online player + */ + val players: MutableMap, + /** + * Index of the last announcement broadcast to players on the server. + * + * This is used to enumerate over the announcement list, and remember + * which one was last broadcast when reloading + */ + val lastBroadcastIndex: Int, +) { + companion object { + fun default() = + ServerState( + players = mutableMapOf(), + lastBroadcastIndex = -1, + ) + } +} + +@Serializable +data class PlayerState( + @Serializable(with = LocalDateTimeSerializer::class) + val connectedAt: LocalDateTime?, + val badges: List, +) { + companion object { + fun empty() = + PlayerState( + connectedAt = null, + badges = emptyList(), + ) + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/core/state/Store.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/core/state/Store.kt new file mode 100644 index 000000000..0d96e54ab --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/core/state/Store.kt @@ -0,0 +1,37 @@ +package com.projectcitybuild.pcbridge.core.state + +import com.projectcitybuild.pcbridge.core.logger.log +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.sync.Mutex +import kotlinx.coroutines.sync.withLock +import kotlinx.coroutines.withContext + +private val mutex = Mutex() + +class Store { + val state: ServerState + get() = _state + + private var _state = + ServerState( + players = mutableMapOf(), + lastBroadcastIndex = 0, + ) + + suspend fun mutate(mutation: (ServerState) -> ServerState) = + withContext(Dispatchers.Default) { + log.debug { "[previous state]\n$state" } + + mutex.withLock { + _state = mutation(_state) + log.debug { "[new state]\n$state" } + } + } + + fun persist() { + } + + fun rehydrate() { + // TODO: check whether players in the state are still online + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/data/Page.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/data/Page.kt new file mode 100644 index 000000000..a8d3813cb --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/data/Page.kt @@ -0,0 +1,7 @@ +package com.projectcitybuild.pcbridge.data + +data class Page( + val items: List, + val page: Int, + val totalPages: Int, +) diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/data/PluginConfig.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/data/PluginConfig.kt new file mode 100644 index 000000000..9a0524a42 --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/data/PluginConfig.kt @@ -0,0 +1,210 @@ +@file:Suppress("ktlint:standard:max-line-length") + +package com.projectcitybuild.pcbridge.data + +import kotlinx.serialization.Serializable + +@Serializable +data class PluginConfig( + val api: Api, + val database: Database, + val webServer: WebServer, + val errorReporting: ErrorReporting, + val localization: Localization, + val chatBadge: ChatBadge, + val warps: Warps, + val integrations: Integrations, + val announcements: Announcements, + val groups: Groups, + val messages: Messages, +) { + @Serializable + data class Api( + val token: String, + val baseUrl: String, + val isLoggingEnabled: Boolean, + ) + + @Serializable + data class Database( + val hostName: String, + val port: Int, + val name: String, + val username: String, + val password: String, + ) + + @Serializable + data class WebServer( + val token: String, + val port: Int, + ) + + @Serializable + data class ErrorReporting( + val isSentryEnabled: Boolean, + val sentryDsn: String, + ) + + @Serializable + data class Localization( + val timeZone: String, + val locale: String, + ) + + @Serializable + data class ChatBadge( + val icon: String, + ) + + @Serializable + data class Warps( + val itemsPerPage: Int, + ) + + @Serializable + data class Integrations( + val dynmap: Dynmap, + ) { + @Serializable + data class Dynmap( + val warpIconName: String, + ) + } + + @Serializable + data class Announcements( + val intervalInMins: Int, + val messages: List, + ) + + @Serializable + data class Groups( + val displayPriority: DisplayPriority, + val donorTierGroupNames: DonorTierGroupNames, + ) { + @Serializable + data class DisplayPriority( + val builder: List, + val trust: List, + val donor: List, + ) + + @Serializable + data class DonorTierGroupNames( + val copper: String, + val iron: String, + val diamond: String, + ) + } + + @Serializable + data class Messages( + val join: String, + val leave: String, + val firstTimeJoin: String, + val welcome: String, + ) + + companion object +} + +fun PluginConfig.Companion.default() = + PluginConfig( + api = + PluginConfig.Api( + token = "FILL_THIS_IN", + baseUrl = "https://projectcitybuild.com/api/", + isLoggingEnabled = false, + ), + database = + PluginConfig.Database( + hostName = "127.0.0.1", + port = 3306, + name = "pcbridge", + username = "FILL_THIS_IN", + password = "FILL_THIS_IN", + ), + webServer = + PluginConfig.WebServer( + token = "FILL_THIS_IN", + port = 8080, + ), + errorReporting = + PluginConfig.ErrorReporting( + isSentryEnabled = false, + sentryDsn = "https://@sentry.io/", + ), + localization = + PluginConfig.Localization( + timeZone = "UTC", + locale = "en-us", + ), + chatBadge = + PluginConfig.ChatBadge( + icon = "★", + ), + warps = + PluginConfig.Warps( + itemsPerPage = 15, + ), + integrations = + PluginConfig.Integrations( + dynmap = + PluginConfig.Integrations.Dynmap( + warpIconName = "portal", + ), + ), + announcements = + PluginConfig.Announcements( + intervalInMins = 30, + messages = + listOf( + "Join the Project City Build Discord server! Type /discord in game!", + "Donations are the only way to keep PCB running! If you would like to donate to the server, you can do so by typing /donate in game!", + "Vote for us to help keep PCB active! Type /vote in game!", + "Post screenshots of your builds to the #showcase channel on our Discord to be featured on the PCB Instagram! Type /discord to join!", + "Make sure to follow the Project City Build Instagram for features of YOUR builds! Type /instagram in game!", + ), + ), + groups = + PluginConfig.Groups( + displayPriority = + PluginConfig.Groups.DisplayPriority( + builder = + listOf( + "architect", + "engineer", + "planner", + "builder", + "intern", + ), + trust = + listOf( + "developer", + "moderator", + "trusted+", + "trusted", + "member", + ), + donor = + listOf( + "donator", + "legacy-donator", + ), + ), + donorTierGroupNames = + PluginConfig.Groups.DonorTierGroupNames( + copper = "copper_tier", + iron = "iron_tier", + diamond = "diamond_tier", + ), + ), + messages = + PluginConfig.Messages( + join = "+ %name% joined the server", + leave = "- %name% left the server (online for %time_online%)", + firstTimeJoin = "✦ Welcome §f%name%§d to the server!", + welcome = "Welcome to PCB!", + ), + ) diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/SerializableLocation.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/data/SerializableLocation.kt similarity index 88% rename from pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/SerializableLocation.kt rename to pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/data/SerializableLocation.kt index 022e043a6..cb326b3b7 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/SerializableLocation.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/data/SerializableLocation.kt @@ -1,4 +1,4 @@ -package com.projectcitybuild.entities +package com.projectcitybuild.pcbridge.data import org.bukkit.Location @@ -18,7 +18,7 @@ data class SerializableLocation( y = location.y, z = location.z, pitch = location.pitch, - yaw = location.yaw + yaw = location.yaw, ) } } diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/announcements/actions/StartAnnouncementTimer.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/announcements/actions/StartAnnouncementTimer.kt new file mode 100644 index 000000000..a6d7b0ec8 --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/announcements/actions/StartAnnouncementTimer.kt @@ -0,0 +1,42 @@ +package com.projectcitybuild.pcbridge.features.announcements.actions + +import com.projectcitybuild.pcbridge.core.config.Config +import com.projectcitybuild.pcbridge.features.announcements.repositories.AnnouncementRepository +import com.projectcitybuild.pcbridge.support.spigot.SpigotTimer +import kotlinx.coroutines.runBlocking +import net.kyori.adventure.text.minimessage.MiniMessage +import org.bukkit.Server +import java.util.concurrent.TimeUnit + +class StartAnnouncementTimer( + private val repository: AnnouncementRepository, + private val config: Config, + private val timer: SpigotTimer, + private val server: Server, +) { + private val timerId = "scheduled_announcements" + + suspend fun start() { + val config = config.get() + val intervalInMins = config.announcements.intervalInMins + + timer.cancel(timerId) + timer.scheduleRepeating( + identifier = timerId, + // No point doing an announcement just as the server starts + delay = intervalInMins.toLong(), + repeatingInterval = intervalInMins.toLong(), + unit = TimeUnit.MINUTES, + work = { + val message = runBlocking { repository.getNextAnnouncement() } + server.broadcast( + MiniMessage.miniMessage().deserialize(message), + ) + }, + ) + } + + fun stop() { + timer.cancel(timerId) + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/announcements/listeners/AnnouncementEnableListener.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/announcements/listeners/AnnouncementEnableListener.kt new file mode 100644 index 000000000..44a46621b --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/announcements/listeners/AnnouncementEnableListener.kt @@ -0,0 +1,54 @@ +package com.projectcitybuild.pcbridge.features.announcements.listeners + +import com.projectcitybuild.pcbridge.core.config.Config +import com.projectcitybuild.pcbridge.core.logger.log +import com.projectcitybuild.pcbridge.features.announcements.actions.StartAnnouncementTimer +import com.projectcitybuild.pcbridge.features.announcements.repositories.AnnouncementRepository +import com.projectcitybuild.pcbridge.support.spigot.SpigotTimer +import org.bukkit.Server +import org.bukkit.event.EventHandler +import org.bukkit.event.EventPriority +import org.bukkit.event.Listener +import org.bukkit.event.server.PluginDisableEvent +import org.bukkit.event.server.PluginEnableEvent +import org.bukkit.plugin.java.JavaPlugin + +class AnnouncementEnableListener( + private val announcementRepository: AnnouncementRepository, + private val config: Config, + private val timer: SpigotTimer, + private val server: Server, + private val plugin: JavaPlugin, +) : Listener { + private var action: StartAnnouncementTimer? = null + + @EventHandler(priority = EventPriority.MONITOR) + suspend fun onPluginEnable(event: PluginEnableEvent) { + if (event.plugin != plugin) { + // PluginEnableEvent is emitted for every plugin, not just ours + return + } + action = + StartAnnouncementTimer( + announcementRepository, + config, + timer, + server, + ) + action?.start() + + log.debug { "Announcement timer started" } + } + + @EventHandler + fun onPluginDisable(event: PluginDisableEvent) { + if (event.plugin != plugin) { + // PluginDisableEvent is emitted for every plugin, not just ours + return + } + action?.stop() + action = null + + log.debug { "Announcement timer stopped" } + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/announcements/repositories/AnnouncementRepository.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/announcements/repositories/AnnouncementRepository.kt new file mode 100644 index 000000000..92899dd9b --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/announcements/repositories/AnnouncementRepository.kt @@ -0,0 +1,22 @@ +package com.projectcitybuild.pcbridge.features.announcements.repositories + +import com.projectcitybuild.pcbridge.core.config.Config +import com.projectcitybuild.pcbridge.core.state.Store +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext + +class AnnouncementRepository( + private val config: Config, + private val store: Store, +) { + suspend fun getNextAnnouncement(): String = + withContext(Dispatchers.IO) { + val announcements = config.get().announcements.messages + val lastBroadcastIndex = store.state.lastBroadcastIndex + val nextIndex = (lastBroadcastIndex + 1) % announcements.size + store.mutate { state -> + state.copy(lastBroadcastIndex = nextIndex) + } + announcements[nextIndex] + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/utils/Sanitizer.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/Sanitizer.kt similarity index 92% rename from pcbridge-spigot/src/main/kotlin/com/projectcitybuild/utils/Sanitizer.kt rename to pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/Sanitizer.kt index 302e07e76..674c03dff 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/utils/Sanitizer.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/Sanitizer.kt @@ -1,7 +1,6 @@ -package com.projectcitybuild.utils +package com.projectcitybuild.pcbridge.features.bans class Sanitizer private constructor() { - companion object { private val ipPortPattern = Regex("^.*:[0-9]+$") diff --git a/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/utils/helpers/ValidIP.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/ValidIP.kt similarity index 85% rename from pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/utils/helpers/ValidIP.kt rename to pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/ValidIP.kt index 41199caa0..4bc17e77d 100644 --- a/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/utils/helpers/ValidIP.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/ValidIP.kt @@ -1,4 +1,4 @@ -package com.projectcitybuild.pcbridge.core.utils.helpers +package com.projectcitybuild.pcbridge.features.bans import java.util.regex.Pattern @@ -12,4 +12,4 @@ private object Regex { fun isValidIP(string: String): Boolean { return Regex.IP.matcher(string).matches() -} \ No newline at end of file +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/bans/actions/AuthoriseConnection.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/actions/AuthoriseConnection.kt similarity index 94% rename from pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/bans/actions/AuthoriseConnection.kt rename to pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/actions/AuthoriseConnection.kt index 2ea5e2b08..5b39e8642 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/bans/actions/AuthoriseConnection.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/actions/AuthoriseConnection.kt @@ -1,4 +1,4 @@ -package com.projectcitybuild.modules.moderation.bans.actions +package com.projectcitybuild.pcbridge.features.bans.actions import com.projectcitybuild.pcbridge.http.responses.Aggregate import com.projectcitybuild.pcbridge.http.responses.IPBan @@ -7,11 +7,13 @@ import com.projectcitybuild.pcbridge.http.responses.PlayerBan class AuthoriseConnection { sealed class ConnectResult { object Allowed : ConnectResult() + data class Denied(val ban: Ban) : ConnectResult() } sealed class Ban { data class UUID(val value: PlayerBan) : Ban() + data class IP(val value: IPBan) : Ban() } diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/bans/actions/BanIP.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/actions/BanIP.kt similarity index 52% rename from pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/bans/actions/BanIP.kt rename to pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/actions/BanIP.kt index 1ef337ceb..bcaf3b6b2 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/bans/actions/BanIP.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/actions/BanIP.kt @@ -1,18 +1,20 @@ -package com.projectcitybuild.modules.moderation.bans.actions +package com.projectcitybuild.pcbridge.features.bans.actions -import com.projectcitybuild.utils.Sanitizer -import com.projectcitybuild.pcbridge.core.utils.Failure -import com.projectcitybuild.pcbridge.core.utils.Result -import com.projectcitybuild.pcbridge.core.utils.Success -import com.projectcitybuild.pcbridge.core.utils.helpers.isValidIP +import com.projectcitybuild.pcbridge.features.bans.Sanitizer +import com.projectcitybuild.pcbridge.features.bans.isValidIP +import com.projectcitybuild.pcbridge.features.bans.repositories.IPBanRepository import com.projectcitybuild.pcbridge.http.services.pcb.IPBanHttpService -import com.projectcitybuild.repositories.IPBanRepository -import com.projectcitybuild.support.spigot.SpigotServer +import com.projectcitybuild.pcbridge.utils.Failure +import com.projectcitybuild.pcbridge.utils.Result +import com.projectcitybuild.pcbridge.utils.Success +import net.kyori.adventure.text.Component +import org.bukkit.Server +import org.bukkit.event.player.PlayerKickEvent import java.util.UUID class BanIP( private val ipBanRepository: IPBanRepository, - private val server: SpigotServer, + private val server: Server, ) { enum class FailureReason { IP_ALREADY_BANNED, @@ -21,7 +23,7 @@ class BanIP( suspend fun execute( ip: String, - bannerUUID: UUID, + bannerUUID: UUID?, bannerName: String, reason: String, ): Result { @@ -29,7 +31,6 @@ class BanIP( if (!isValidIP(sanitizedIP)) { return Failure(FailureReason.INVALID_IP) } - try { ipBanRepository.ban( ip = sanitizedIP, @@ -41,11 +42,12 @@ class BanIP( return Failure(FailureReason.IP_ALREADY_BANNED) } - server.kickByIP( - ip = ip, - reason = "You have been banned.\n\nAppeal @ projectcitybuild.com", - context = SpigotServer.KickContext.FATAL, - ) + server.onlinePlayers + .firstOrNull { it.address.toString() == ip } + ?.kick( + Component.text("You have been banned.\n\nAppeal @ projectcitybuild.com"), + PlayerKickEvent.Cause.BANNED, + ) return Success(Unit) } diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/actions/BanUUID.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/actions/BanUUID.kt new file mode 100644 index 000000000..18ffebc48 --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/actions/BanUUID.kt @@ -0,0 +1,53 @@ +package com.projectcitybuild.pcbridge.features.bans.actions + +import com.projectcitybuild.pcbridge.features.bans.repositories.PlayerBanRepository +import com.projectcitybuild.pcbridge.features.bans.repositories.PlayerUUIDRepository +import com.projectcitybuild.pcbridge.http.services.pcb.UUIDBanHttpService +import com.projectcitybuild.pcbridge.utils.Failure +import com.projectcitybuild.pcbridge.utils.Result +import com.projectcitybuild.pcbridge.utils.Success +import net.kyori.adventure.text.Component +import org.bukkit.Server +import org.bukkit.event.player.PlayerKickEvent +import java.util.UUID + +class BanUUID( + private val playerBanRepository: PlayerBanRepository, + private val playerUUIDRepository: PlayerUUIDRepository, + private val server: Server, +) { + enum class FailureReason { + PlayerDoesNotExist, + PlayerAlreadyBanned, + } + + suspend fun ban( + targetPlayerName: String, + bannerUUID: UUID?, + bannerName: String, + reason: String?, + ): Result { + try { + val targetPlayerUUID = + playerUUIDRepository.get(targetPlayerName) + ?: return Failure(FailureReason.PlayerDoesNotExist) + + playerBanRepository.ban( + targetPlayerUUID = targetPlayerUUID, + targetPlayerName = targetPlayerName, + bannerPlayerUUID = bannerUUID, + bannerPlayerName = bannerName, + reason = reason, + ) + + server.getPlayer(targetPlayerUUID)?.kick( + Component.text("You have been banned.\n\nAppeal @ projectcitybuild.com"), + PlayerKickEvent.Cause.BANNED, + ) + + return Success(Unit) + } catch (e: UUIDBanHttpService.UUIDAlreadyBannedException) { + return Failure(FailureReason.PlayerAlreadyBanned) + } + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/actions/CheckUUIDBan.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/actions/CheckUUIDBan.kt new file mode 100644 index 000000000..d777e930a --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/actions/CheckUUIDBan.kt @@ -0,0 +1,42 @@ +package com.projectcitybuild.pcbridge.features.bans.actions + +import com.projectcitybuild.pcbridge.core.datetime.DateTimeFormatter +import com.projectcitybuild.pcbridge.features.bans.repositories.PlayerBanRepository +import com.projectcitybuild.pcbridge.features.bans.repositories.PlayerUUIDRepository +import com.projectcitybuild.pcbridge.utils.Failure +import com.projectcitybuild.pcbridge.utils.Result +import com.projectcitybuild.pcbridge.utils.Success + +class CheckUUIDBan( + private val playerBanRepository: PlayerBanRepository, + private val playerUUIDRepository: PlayerUUIDRepository, + private val dateTimeFormatter: DateTimeFormatter, +) { + enum class FailureReason { + PLAYER_DOES_NOT_EXIST, + } + + data class BanRecord( + val reason: String, + val dateOfBan: String, + val expiryDate: String, + ) + + suspend fun getBan(targetPlayerName: String): Result { + val targetPlayerUUID = + playerUUIDRepository.get(targetPlayerName) + ?: return Failure(FailureReason.PLAYER_DOES_NOT_EXIST) + + val ban = + playerBanRepository.get(targetPlayerUUID = targetPlayerUUID) + ?: return Success(null) + + val banRecord = + BanRecord( + reason = ban.reason ?: "No reason given", + dateOfBan = ban.createdAt.let { dateTimeFormatter.convert(it) }, + expiryDate = ban.expiresAt?.let { dateTimeFormatter.convert(it) } ?: "Never", + ) + return Success(banRecord) + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/bans/actions/UnbanIP.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/actions/UnbanIP.kt similarity index 65% rename from pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/bans/actions/UnbanIP.kt rename to pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/actions/UnbanIP.kt index 82159b7bf..87165c021 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/bans/actions/UnbanIP.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/actions/UnbanIP.kt @@ -1,12 +1,12 @@ -package com.projectcitybuild.modules.moderation.bans.actions +package com.projectcitybuild.pcbridge.features.bans.actions -import com.projectcitybuild.utils.Sanitizer -import com.projectcitybuild.pcbridge.core.utils.Failure -import com.projectcitybuild.pcbridge.core.utils.Result -import com.projectcitybuild.pcbridge.core.utils.Success -import com.projectcitybuild.pcbridge.core.utils.helpers.isValidIP +import com.projectcitybuild.pcbridge.features.bans.Sanitizer +import com.projectcitybuild.pcbridge.features.bans.isValidIP +import com.projectcitybuild.pcbridge.features.bans.repositories.IPBanRepository import com.projectcitybuild.pcbridge.http.services.pcb.IPBanHttpService -import com.projectcitybuild.repositories.IPBanRepository +import com.projectcitybuild.pcbridge.utils.Failure +import com.projectcitybuild.pcbridge.utils.Result +import com.projectcitybuild.pcbridge.utils.Success import java.util.UUID class UnbanIP( @@ -19,7 +19,7 @@ class UnbanIP( suspend fun execute( ip: String, - unbannerUUID: UUID, + unbannerUUID: UUID?, unbannerName: String, ): Result { val sanitizedIP = Sanitizer.sanitizedIP(ip) diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/actions/UnbanUUID.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/actions/UnbanUUID.kt new file mode 100644 index 000000000..b8454e9be --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/actions/UnbanUUID.kt @@ -0,0 +1,39 @@ +package com.projectcitybuild.pcbridge.features.bans.actions + +import com.projectcitybuild.pcbridge.features.bans.repositories.PlayerBanRepository +import com.projectcitybuild.pcbridge.features.bans.repositories.PlayerUUIDRepository +import com.projectcitybuild.pcbridge.http.services.pcb.UUIDBanHttpService +import com.projectcitybuild.pcbridge.utils.Failure +import com.projectcitybuild.pcbridge.utils.Result +import com.projectcitybuild.pcbridge.utils.Success +import java.util.UUID + +class UnbanUUID( + private val playerBanRepository: PlayerBanRepository, + private val playerUUIDRepository: PlayerUUIDRepository, +) { + enum class FailureReason { + PlayerDoesNotExist, + PlayerNotBanned, + } + + suspend fun unban( + targetPlayerName: String, + unbannerUUID: UUID?, + ): Result { + try { + val targetPlayerUUID = + playerUUIDRepository.get(targetPlayerName) + ?: return Failure(FailureReason.PlayerDoesNotExist) + + playerBanRepository.unban( + targetPlayerUUID = targetPlayerUUID, + unbannerUUID = unbannerUUID, + ) + + return Success(Unit) + } catch (e: UUIDBanHttpService.UUIDNotBannedException) { + return Failure(FailureReason.PlayerNotBanned) + } + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/commands/BanCommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/commands/BanCommand.kt new file mode 100644 index 000000000..7bfec1497 --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/commands/BanCommand.kt @@ -0,0 +1,76 @@ +package com.projectcitybuild.pcbridge.features.bans.commands + +import com.projectcitybuild.pcbridge.features.bans.actions.BanUUID +import com.projectcitybuild.pcbridge.support.messages.CommandHelpBuilder +import com.projectcitybuild.pcbridge.support.spigot.BadCommandUsageException +import com.projectcitybuild.pcbridge.support.spigot.CommandArgsParser +import com.projectcitybuild.pcbridge.support.spigot.SpigotCommand +import com.projectcitybuild.pcbridge.utils.Failure +import com.projectcitybuild.pcbridge.utils.Success +import net.kyori.adventure.text.Component +import net.kyori.adventure.text.format.NamedTextColor +import net.kyori.adventure.text.format.TextDecoration +import org.bukkit.Server +import org.bukkit.command.CommandSender +import org.bukkit.entity.Player + +class BanCommand( + private val banUUID: BanUUID, + private val server: Server, +) : SpigotCommand { + override val label = "ban" + + override val usage = CommandHelpBuilder() + + override suspend fun run( + sender: CommandSender, + args: Args, + ) { + val result = + banUUID.ban( + targetPlayerName = args.targetPlayerName, + bannerUUID = if (sender is Player) sender.uniqueId else null, + bannerName = sender.name, + reason = args.reason, + ) + when (result) { + is Failure -> + sender.sendMessage( + Component.text(result.reason.toMessage(args.targetPlayerName)) + .color(NamedTextColor.RED), + ) + is Success -> + server.broadcast( + Component.text("${args.targetPlayerName} has been banned") + .color(NamedTextColor.GRAY) + .decorate(TextDecoration.ITALIC), + ) + } + } + + data class Args( + val targetPlayerName: String, + val reason: String, + ) { + class Parser : CommandArgsParser { + override fun parse(args: List): Args { + if (args.isEmpty()) { + throw BadCommandUsageException() + } + return Args( + targetPlayerName = args[0], + reason = if (args.size > 1) args.drop(1).joinToString(separator = " ") else "", + ) + } + } + } +} + +private fun BanUUID.FailureReason.toMessage(targetPlayerName: String) = + when (this) { + BanUUID.FailureReason.PlayerDoesNotExist, + -> "Error: Could not find UUID for $targetPlayerName. This player likely doesn't exist" + + BanUUID.FailureReason.PlayerAlreadyBanned, + -> "Error: $targetPlayerName is already banned" + } diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/commands/BanIPCommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/commands/BanIPCommand.kt new file mode 100644 index 000000000..0d6bb6ff5 --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/commands/BanIPCommand.kt @@ -0,0 +1,77 @@ +package com.projectcitybuild.pcbridge.features.bans.commands + +import com.projectcitybuild.pcbridge.features.bans.actions.BanIP +import com.projectcitybuild.pcbridge.support.messages.CommandHelpBuilder +import com.projectcitybuild.pcbridge.support.spigot.BadCommandUsageException +import com.projectcitybuild.pcbridge.support.spigot.CommandArgsParser +import com.projectcitybuild.pcbridge.support.spigot.SpigotCommand +import com.projectcitybuild.pcbridge.utils.Failure +import com.projectcitybuild.pcbridge.utils.Success +import net.kyori.adventure.text.Component +import net.kyori.adventure.text.format.NamedTextColor +import net.kyori.adventure.text.format.TextDecoration +import org.bukkit.Server +import org.bukkit.command.CommandSender +import org.bukkit.entity.Player + +class BanIPCommand( + private val server: Server, + private val banIP: BanIP, +) : SpigotCommand { + override val label = "banip" + + override val usage = CommandHelpBuilder() + + override suspend fun run( + sender: CommandSender, + args: Args, + ) { + val targetIP = + server.onlinePlayers + .firstOrNull { it.name.lowercase() == args.target.lowercase() } + ?.address?.toString() + ?: args.target + + val result = + banIP.execute( + ip = targetIP, + bannerUUID = if (sender is Player) sender.uniqueId else null, + bannerName = sender.name, + reason = args.reason, + ) + val message = + when (result) { + is Failure -> + when (result.reason) { + BanIP.FailureReason.IP_ALREADY_BANNED -> + Component.text("$targetIP is already banned") + .color(NamedTextColor.RED) + BanIP.FailureReason.INVALID_IP -> + Component.text("$targetIP is not a valid IP") + .color(NamedTextColor.RED) + } + is Success -> + Component.text("IP $targetIP has been banned") + .color(NamedTextColor.GRAY) + .decorate(TextDecoration.ITALIC) + } + sender.sendMessage(message) + } + + data class Args( + val target: String, + val reason: String, + ) { + class Parser : CommandArgsParser { + override fun parse(args: List): Args { + if (args.isEmpty()) { + throw BadCommandUsageException() + } + return Args( + target = args[0], + reason = if (args.size > 1) args.drop(1).joinToString(separator = " ") else "", + ) + } + } + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/commands/CheckBanCommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/commands/CheckBanCommand.kt new file mode 100644 index 000000000..31fe0d1c4 --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/commands/CheckBanCommand.kt @@ -0,0 +1,69 @@ +package com.projectcitybuild.pcbridge.features.bans.commands + +import com.projectcitybuild.pcbridge.features.bans.actions.CheckUUIDBan +import com.projectcitybuild.pcbridge.support.messages.CommandHelpBuilder +import com.projectcitybuild.pcbridge.support.spigot.BadCommandUsageException +import com.projectcitybuild.pcbridge.support.spigot.CommandArgsParser +import com.projectcitybuild.pcbridge.support.spigot.SpigotCommand +import com.projectcitybuild.pcbridge.utils.Failure +import com.projectcitybuild.pcbridge.utils.Success +import net.kyori.adventure.text.Component +import net.kyori.adventure.text.format.NamedTextColor +import net.md_5.bungee.api.ChatColor +import org.bukkit.command.CommandSender + +class CheckBanCommand( + private val checkUUIDBan: CheckUUIDBan, +) : SpigotCommand { + override val label = "checkban" + + override val usage = CommandHelpBuilder() + + override suspend fun run( + sender: CommandSender, + args: Args, + ) { + val result = checkUUIDBan.getBan(args.targetPlayerName) + val message = + when (result) { + is Failure -> + when (result.reason) { + CheckUUIDBan.FailureReason.PLAYER_DOES_NOT_EXIST -> + Component + .text("Could not find UUID for ${args.targetPlayerName}. This player likely doesn't exist") + .color(NamedTextColor.RED) + } + is Success -> + result.value.let { ban -> + if (ban == null) { + Component.text("${args.targetPlayerName} is not currently banned") + .color(NamedTextColor.RED) + } else { + Component.text( + """ + ${ChatColor.RED}${args.targetPlayerName} is currently banned. + ${ChatColor.GRAY}--- + ${ChatColor.GRAY}Reason » ${ChatColor.WHITE}${ban.reason} + ${ChatColor.GRAY}Date » ${ChatColor.WHITE}${ban.dateOfBan} + ${ChatColor.GRAY}Expires » ${ChatColor.WHITE}${ban.expiryDate} + """.trimIndent(), + ) + } + } + } + sender.sendMessage(message) + } + + data class Args( + val targetPlayerName: String, + ) { + class Parser : CommandArgsParser { + override fun parse(args: List): Args { + if (args.isEmpty()) { + throw BadCommandUsageException() + } + return Args(targetPlayerName = args[0]) + } + } + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/commands/UnbanCommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/commands/UnbanCommand.kt new file mode 100644 index 000000000..cdde597d6 --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/commands/UnbanCommand.kt @@ -0,0 +1,63 @@ +package com.projectcitybuild.pcbridge.features.bans.commands + +import com.projectcitybuild.pcbridge.features.bans.actions.UnbanUUID +import com.projectcitybuild.pcbridge.support.messages.CommandHelpBuilder +import com.projectcitybuild.pcbridge.support.spigot.BadCommandUsageException +import com.projectcitybuild.pcbridge.support.spigot.CommandArgsParser +import com.projectcitybuild.pcbridge.support.spigot.SpigotCommand +import com.projectcitybuild.pcbridge.utils.Failure +import com.projectcitybuild.pcbridge.utils.Success +import net.kyori.adventure.text.Component +import net.kyori.adventure.text.format.NamedTextColor +import net.kyori.adventure.text.format.TextDecoration +import org.bukkit.command.CommandSender +import org.bukkit.entity.Player + +class UnbanCommand( + private val unbanUUID: UnbanUUID, +) : SpigotCommand { + override val label = "unban" + + override val usage = CommandHelpBuilder() // TODO + + override suspend fun run( + sender: CommandSender, + args: Args, + ) { + val result = + unbanUUID.unban( + targetPlayerName = args.targetPlayerName, + unbannerUUID = if (sender is Player) sender.uniqueId else null, + ) + val message = + when (result) { + is Failure -> + Component.text(result.reason.toMessage(args.targetPlayerName)) + .color(NamedTextColor.RED) + is Success -> + Component.text("{${args.targetPlayerName} has been unbanned") + .color(NamedTextColor.GRAY) + .decorate(TextDecoration.ITALIC) + } + sender.sendMessage(message) + } + + data class Args( + val targetPlayerName: String, + ) { + class Parser : CommandArgsParser { + override fun parse(args: List): Args { + if (args.isEmpty()) { + throw BadCommandUsageException() + } + return Args(targetPlayerName = args[0]) + } + } + } +} + +private fun UnbanUUID.FailureReason.toMessage(targetPlayerName: String) = + when (this) { + UnbanUUID.FailureReason.PlayerDoesNotExist -> "Could not find UUID for $targetPlayerName. This player likely doesn't exist" + UnbanUUID.FailureReason.PlayerNotBanned -> "$targetPlayerName is not currently banned" + } diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/commands/UnbanIPCommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/commands/UnbanIPCommand.kt new file mode 100644 index 000000000..8e0a986bd --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/commands/UnbanIPCommand.kt @@ -0,0 +1,63 @@ +package com.projectcitybuild.pcbridge.features.bans.commands + +import com.projectcitybuild.pcbridge.features.bans.actions.UnbanIP +import com.projectcitybuild.pcbridge.support.messages.CommandHelpBuilder +import com.projectcitybuild.pcbridge.support.spigot.BadCommandUsageException +import com.projectcitybuild.pcbridge.support.spigot.CommandArgsParser +import com.projectcitybuild.pcbridge.support.spigot.SpigotCommand +import com.projectcitybuild.pcbridge.utils.Failure +import com.projectcitybuild.pcbridge.utils.Success +import net.kyori.adventure.text.Component +import net.kyori.adventure.text.format.NamedTextColor +import org.bukkit.command.CommandSender +import org.bukkit.entity.Player + +class UnbanIPCommand( + private val unbanIP: UnbanIP, +) : SpigotCommand { + override val label = "unbanip" + + override val usage = CommandHelpBuilder() + + override suspend fun run( + sender: CommandSender, + args: Args, + ) { + val result = + unbanIP.execute( + ip = args.ip, + unbannerUUID = if (sender is Player) sender.uniqueId else null, + unbannerName = sender.name, + ) + + val message = + when (result) { + is Failure -> + Component.text(result.reason.toMessage(args.ip)) + .color(NamedTextColor.RED) + is Success -> + Component.text("IP ${args.ip} has been unbanned") + .color(NamedTextColor.GRAY) + } + sender.sendMessage(message) + } + + data class Args( + val ip: String, + ) { + class Parser : CommandArgsParser { + override fun parse(args: List): Args { + if (args.isEmpty()) { + throw BadCommandUsageException() + } + return Args(ip = args[0]) + } + } + } +} + +private fun UnbanIP.FailureReason.toMessage(targetIP: String) = + when (this) { + UnbanIP.FailureReason.IP_NOT_BANNED -> "$targetIP is not currently banned" + UnbanIP.FailureReason.INVALID_IP -> "$targetIP is not a valid IP" + } diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/events/ConnectionPermittedEvent.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/events/ConnectionPermittedEvent.kt similarity index 63% rename from pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/events/ConnectionPermittedEvent.kt rename to pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/events/ConnectionPermittedEvent.kt index 72f6a3548..b57a9287c 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/events/ConnectionPermittedEvent.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/events/ConnectionPermittedEvent.kt @@ -1,7 +1,6 @@ -package com.projectcitybuild.entities.events +package com.projectcitybuild.pcbridge.features.bans.events import com.projectcitybuild.pcbridge.http.responses.Aggregate -import com.projectcitybuild.support.spigot.eventbroadcast.BroadcastableEvent import org.bukkit.event.Event import org.bukkit.event.HandlerList import java.util.UUID @@ -9,18 +8,15 @@ import java.util.UUID class ConnectionPermittedEvent( val aggregate: Aggregate, val playerUUID: UUID, -) : Event(), BroadcastableEvent { +) : Event() { + override fun getHandlers(): HandlerList { + return HANDLERS + } companion object { private val HANDLERS = HandlerList() @JvmStatic - fun getHandlerList(): HandlerList { - return HANDLERS - } - } - - override fun getHandlers(): HandlerList { - return HANDLERS + fun getHandlerList() = HANDLERS } } diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/listeners/AuthorizeConnectionListener.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/listeners/AuthorizeConnectionListener.kt new file mode 100644 index 000000000..5947dad69 --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/listeners/AuthorizeConnectionListener.kt @@ -0,0 +1,118 @@ +package com.projectcitybuild.pcbridge.features.bans.listeners + +import com.projectcitybuild.pcbridge.core.datetime.DateTimeFormatter +import com.projectcitybuild.pcbridge.core.errors.SentryReporter +import com.projectcitybuild.pcbridge.core.logger.log +import com.projectcitybuild.pcbridge.core.state.PlayerState +import com.projectcitybuild.pcbridge.core.state.Store +import com.projectcitybuild.pcbridge.features.bans.Sanitizer +import com.projectcitybuild.pcbridge.features.bans.actions.AuthoriseConnection +import com.projectcitybuild.pcbridge.features.bans.events.ConnectionPermittedEvent +import com.projectcitybuild.pcbridge.features.bans.repositories.AggregateRepository +import com.projectcitybuild.pcbridge.http.responses.Aggregate +import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.withContext +import net.kyori.adventure.text.Component +import net.kyori.adventure.text.minimessage.MiniMessage +import org.bukkit.Server +import org.bukkit.event.EventHandler +import org.bukkit.event.EventPriority +import org.bukkit.event.Listener +import org.bukkit.event.player.AsyncPlayerPreLoginEvent +import java.time.format.FormatStyle +import kotlin.coroutines.CoroutineContext + +class AuthorizeConnectionListener( + private val aggregateRepository: AggregateRepository, + private val authoriseConnection: AuthoriseConnection, + private val dateTimeFormatter: DateTimeFormatter, + private val sentry: SentryReporter, + private val server: Server, + private val minecraftDispatcher: () -> CoroutineContext, + private val store: Store, +) : Listener { + @EventHandler(priority = EventPriority.HIGHEST) + suspend fun handle(event: AsyncPlayerPreLoginEvent) { + /** + * Events cannot be mutated after a suspended function has paused execution, + * because the event would have been fully processed by the time execution is + * resumed in this listener. + * + * We need to block so that the event processing pauses until this listener has + * finished execution. Blocking shouldn't be a problem here because the listener + * is already being executed asynchronously. + * + * See https://github.com/Shynixn/MCCoroutine/issues/43 + */ + runBlocking { + runCatching { + val aggregate = + aggregateRepository.get( + playerUUID = event.uniqueId, + ip = Sanitizer.sanitizedIP(event.address.toString()), + ) ?: Aggregate() + + val result = authoriseConnection.execute(aggregate) + if (result is AuthoriseConnection.ConnectResult.Denied) { + event.disallow( + AsyncPlayerPreLoginEvent.Result.KICK_BANNED, + result.ban.toMessage(dateTimeFormatter), + ) + return@runBlocking + } + store.mutate { state -> + state.copy( + players = + state.players + .apply { put(event.uniqueId, PlayerState.empty()) }, + ) + } + + withContext(minecraftDispatcher()) { + server.pluginManager.callEvent( + ConnectionPermittedEvent( + aggregate = aggregate, + playerUUID = event.uniqueId, + ), + ) + } + }.onFailure { + log.error(it) { "An error occurred while authorizing a connection" } + sentry.report(it) + + // If something goes wrong, better not to let players in + event.disallow( + AsyncPlayerPreLoginEvent.Result.KICK_OTHER, + Component.text("An error occurred while contacting the PCB authentication server. Please try again later"), + ) + } + } + } +} + +private fun AuthoriseConnection.Ban.toMessage(dateTimeFormatter: DateTimeFormatter): Component { + return when (this) { + is AuthoriseConnection.Ban.UUID -> + MiniMessage.miniMessage().deserialize( + """ + You are currently banned. + + Reason: ${value.reason ?: "No reason provided"} + Expires: ${value.expiresAt?.let { dateTimeFormatter.convert(it, FormatStyle.SHORT) } ?: "Never"} + + Appeal @ https://projectcitybuild.com" + """.trimIndent(), + ) + + is AuthoriseConnection.Ban.IP -> + MiniMessage.miniMessage().deserialize( + """ + You are currently IP banned. + + Reason: ${value.reason.ifEmpty { "No reason provided" }} + + Appeal @ https://projectcitybuild.com + """.trimIndent(), + ) + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/repositories/AggregateRepository.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/repositories/AggregateRepository.kt similarity index 57% rename from pcbridge-spigot/src/main/kotlin/com/projectcitybuild/repositories/AggregateRepository.kt rename to pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/repositories/AggregateRepository.kt index c37a50367..d8777a7d4 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/repositories/AggregateRepository.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/repositories/AggregateRepository.kt @@ -1,4 +1,4 @@ -package com.projectcitybuild.repositories +package com.projectcitybuild.pcbridge.features.bans.repositories import com.projectcitybuild.pcbridge.http.responses.Aggregate import com.projectcitybuild.pcbridge.http.services.pcb.AggregateHttpService @@ -6,11 +6,14 @@ import java.util.UUID import kotlin.jvm.Throws class AggregateRepository( - private val aggregateHttpService: AggregateHttpService, + private val httpService: AggregateHttpService, ) { @Throws(Exception::class) - suspend fun get(playerUUID: UUID, ip: String): Aggregate? { - return aggregateHttpService.get( + suspend fun get( + playerUUID: UUID, + ip: String, + ): Aggregate? { + return httpService.get( playerUUID = playerUUID, ip = ip, ) diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/repositories/IPBanRepository.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/repositories/IPBanRepository.kt similarity index 72% rename from pcbridge-spigot/src/main/kotlin/com/projectcitybuild/repositories/IPBanRepository.kt rename to pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/repositories/IPBanRepository.kt index dec6a73a4..c7201c329 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/repositories/IPBanRepository.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/repositories/IPBanRepository.kt @@ -1,38 +1,38 @@ -package com.projectcitybuild.repositories +package com.projectcitybuild.pcbridge.features.bans.repositories import com.projectcitybuild.pcbridge.http.responses.IPBan import com.projectcitybuild.pcbridge.http.services.pcb.IPBanHttpService import java.util.UUID class IPBanRepository( - private val ipBanHttpService: IPBanHttpService + private val httpService: IPBanHttpService, ) { suspend fun get(ip: String): IPBan? { - return ipBanHttpService.get(ip) + return httpService.get(ip) } @Throws(IPBanHttpService.IPAlreadyBannedException::class) suspend fun ban( ip: String, - bannerUUID: UUID, + bannerUUID: UUID?, bannerName: String, reason: String, ) { - ipBanHttpService.ban( + httpService.ban( ip = ip, bannerUUID = bannerUUID, bannerName = bannerName, - reason = reason + reason = reason, ) } @Throws(IPBanHttpService.IPNotBannedException::class) suspend fun unban( ip: String, - unbannerUUID: UUID, + unbannerUUID: UUID?, unbannerName: String, ) { - ipBanHttpService.unban( + httpService.unban( ip = ip, unbannerUUID = unbannerUUID, unbannerName = unbannerName, diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/repositories/PlayerBanRepository.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/repositories/PlayerBanRepository.kt similarity index 83% rename from pcbridge-spigot/src/main/kotlin/com/projectcitybuild/repositories/PlayerBanRepository.kt rename to pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/repositories/PlayerBanRepository.kt index f0af0e142..47b21a285 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/repositories/PlayerBanRepository.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/repositories/PlayerBanRepository.kt @@ -1,14 +1,14 @@ -package com.projectcitybuild.repositories +package com.projectcitybuild.pcbridge.features.bans.repositories import com.projectcitybuild.pcbridge.http.responses.PlayerBan import com.projectcitybuild.pcbridge.http.services.pcb.UUIDBanHttpService import java.util.UUID class PlayerBanRepository( - private val uuidBanHttpService: UUIDBanHttpService, + private val httpService: UUIDBanHttpService, ) { suspend fun get(targetPlayerUUID: UUID): PlayerBan? { - return uuidBanHttpService.get(targetPlayerUUID) + return httpService.get(targetPlayerUUID) } @Throws(UUIDBanHttpService.UUIDAlreadyBannedException::class) @@ -20,7 +20,7 @@ class PlayerBanRepository( reason: String?, expiryDate: Long? = null, ) { - uuidBanHttpService.ban( + httpService.ban( targetPlayerUUID = targetPlayerUUID, targetPlayerName = targetPlayerName, bannerPlayerUUID = bannerPlayerUUID, @@ -35,7 +35,7 @@ class PlayerBanRepository( targetPlayerUUID: UUID, unbannerUUID: UUID?, ) { - uuidBanHttpService.unban( + httpService.unban( targetPlayerUUID = targetPlayerUUID, unbannerUUID = unbannerUUID, ) diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/repositories/PlayerUUIDRepository.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/repositories/PlayerUUIDRepository.kt similarity index 81% rename from pcbridge-spigot/src/main/kotlin/com/projectcitybuild/repositories/PlayerUUIDRepository.kt rename to pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/repositories/PlayerUUIDRepository.kt index 264364c8c..531411df0 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/repositories/PlayerUUIDRepository.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/repositories/PlayerUUIDRepository.kt @@ -1,14 +1,14 @@ -package com.projectcitybuild.repositories +package com.projectcitybuild.pcbridge.features.bans.repositories -import com.projectcitybuild.pcbridge.core.utils.extensions.toDashFormattedUUID import com.projectcitybuild.pcbridge.http.responses.MojangPlayer import com.projectcitybuild.pcbridge.http.services.mojang.PlayerUUIDHttpService +import com.projectcitybuild.pcbridge.utils.extensions.toDashFormattedUUID import org.bukkit.Server import java.util.UUID open class PlayerUUIDRepository( private val server: Server, - private val playerUUIDHttpService: PlayerUUIDHttpService, + private val httpService: PlayerUUIDHttpService, ) { // TODO: cache with expiry time private val mojangPlayerCache = HashMap() @@ -29,7 +29,7 @@ open class PlayerUUIDRepository( return cacheHit } return try { - playerUUIDHttpService.get(playerName) + httpService.get(playerName) } catch (e: PlayerUUIDHttpService.PlayerNotFoundException) { null } diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/chat/ChatBadgeFormatter.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/chat/ChatBadgeFormatter.kt new file mode 100644 index 000000000..92c316afc --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/chat/ChatBadgeFormatter.kt @@ -0,0 +1,43 @@ +package com.projectcitybuild.pcbridge.features.chat + +import com.projectcitybuild.pcbridge.features.chat.repositories.ChatBadgeRepository +import net.kyori.adventure.text.Component +import net.kyori.adventure.text.event.HoverEvent +import net.kyori.adventure.text.format.NamedTextColor +import net.kyori.adventure.text.minimessage.MiniMessage +import java.util.UUID + +class ChatBadgeFormatter( + private val chatBadgeRepository: ChatBadgeRepository, +) { + fun get(playerUUID: UUID): Component? { + val badges = chatBadgeRepository.getBadgesForPlayer(playerUUID) + if (badges.isEmpty()) { + return null + } + + val formattedBadge = + Component.text().append( + Component.text("Badges") + .color(NamedTextColor.YELLOW) + .appendNewline(), + Component.text("---") + .color(NamedTextColor.GRAY) + .appendNewline(), + ) + badges.withIndex().forEach { (index, badge) -> + formattedBadge.append( + Component.text(badge.unicodeIcon), + Component.space(), + Component.text(badge.displayName), + ).also { + if (index < badges.size - 1) { + it.appendNewline() + } + } + } + return MiniMessage.miniMessage() + .deserialize(chatBadgeRepository.getIcon()) + .hoverEvent(HoverEvent.showText(formattedBadge)) + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/chat/ChatGroupFormatter.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/chat/ChatGroupFormatter.kt new file mode 100644 index 000000000..9bd6b0c9d --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/chat/ChatGroupFormatter.kt @@ -0,0 +1,109 @@ +package com.projectcitybuild.pcbridge.features.chat + +import com.projectcitybuild.pcbridge.features.chat.repositories.ChatGroupRepository +import net.kyori.adventure.text.Component +import net.kyori.adventure.text.event.HoverEvent +import net.kyori.adventure.text.minimessage.MiniMessage +import java.util.UUID + +class ChatGroupFormatter( + private val chatGroupRepository: ChatGroupRepository, +) { + data class Aggregate( + val prefix: Component, + val suffix: Component, + val groups: Component, + ) + + private val groupPriorities: MutableMap> = mutableMapOf() + + fun format(playerUUID: UUID): Aggregate { + if (groupPriorities.isEmpty()) { + buildGroupList() + } + + val groupNames = chatGroupRepository.getGroupNamesForPlayer(playerUUID) + + var highestTrust: Pair? = null + var highestBuild: Pair? = null + var highestDonor: Pair? = null + + for (groupName in groupNames) { + val lowercaseGroupName = groupName.lowercase() + val (groupType, priorityIndex) = + groupPriorities[lowercaseGroupName] + ?: continue + + when (groupType) { + ChatGroupType.TRUST -> + if (highestTrust == null || priorityIndex < highestTrust.first) { + highestTrust = Pair(priorityIndex, groupName) + } + ChatGroupType.BUILD -> + if (highestBuild == null || priorityIndex < highestBuild.first) { + highestBuild = Pair(priorityIndex, groupName) + } + ChatGroupType.DONOR -> + if (highestDonor == null || priorityIndex < highestDonor.first) { + highestDonor = Pair(priorityIndex, groupName) + } + } + } + + val groupComponent = Component.text() + + if (highestDonor != null) { + groupComponent.append(groupTextComponent(highestDonor)) + } + if (highestTrust != null) { + groupComponent.append(groupTextComponent(highestTrust)) + } + if (highestBuild != null) { + groupComponent.append(groupTextComponent(highestBuild)) + } + + return Aggregate( + prefix = + MiniMessage.miniMessage().deserialize( + chatGroupRepository.getPrefixForPlayer(playerUUID), + ), + suffix = + MiniMessage.miniMessage().deserialize( + chatGroupRepository.getSuffixForPlayer(playerUUID), + ), + groups = groupComponent.build(), + ) + } + + private fun groupTextComponent(group: Pair): Component { + val groupName = group.second + val hoverName = chatGroupRepository.getGroupHoverName(groupName) + val displayName = chatGroupRepository.getGroupDisplayName(groupName) ?: groupName + + return MiniMessage.miniMessage() + .deserialize(displayName) + .also { + if (!hoverName.isNullOrEmpty()) { + it.hoverEvent( + HoverEvent.showText(Component.text(hoverName)), + ) + } + } + } + + private fun buildGroupList() { + val trustedGroupPriority = chatGroupRepository.getDisplayPriority(ChatGroupType.TRUST) + val builderGroupPriority = chatGroupRepository.getDisplayPriority(ChatGroupType.BUILD) + val donorGroupPriority = chatGroupRepository.getDisplayPriority(ChatGroupType.DONOR) + + trustedGroupPriority.withIndex().forEach { + groupPriorities[it.value.lowercase()] = Pair(ChatGroupType.TRUST, it.index) + } + builderGroupPriority.withIndex().forEach { + groupPriorities[it.value.lowercase()] = Pair(ChatGroupType.BUILD, it.index) + } + donorGroupPriority.withIndex().forEach { + groupPriorities[it.value.lowercase()] = Pair(ChatGroupType.DONOR, it.index) + } + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/chat/ChatGroupType.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/chat/ChatGroupType.kt new file mode 100644 index 000000000..b1969f095 --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/chat/ChatGroupType.kt @@ -0,0 +1,7 @@ +package com.projectcitybuild.pcbridge.features.chat + +enum class ChatGroupType { + TRUST, + BUILD, + DONOR, +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/chat/listeners/EmojiChatListener.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/chat/listeners/EmojiChatListener.kt new file mode 100644 index 000000000..2943b98ec --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/chat/listeners/EmojiChatListener.kt @@ -0,0 +1,46 @@ +package com.projectcitybuild.pcbridge.features.chat.listeners + +import io.papermc.paper.chat.ChatRenderer +import io.papermc.paper.event.player.AsyncChatEvent +import net.kyori.adventure.text.Component +import org.bukkit.entity.Player +import org.bukkit.event.EventHandler +import org.bukkit.event.EventPriority +import org.bukkit.event.Listener + +class EmojiChatListener : Listener, ChatRenderer.ViewerUnaware { + @EventHandler(priority = EventPriority.LOW) + fun onChat(event: AsyncChatEvent) { + event.renderer( + ChatRenderer.viewerUnaware(this), + ) + } + + override fun render( + source: Player, + sourceDisplayName: Component, + message: Component, + ): Component { + return message.replaceText { builder -> + builder.match(pattern).replacement { match, _ -> + val replaced = emojis[match.group().lowercase()] ?: match.group() + Component.text(replaced) + } + } + } + + private companion object { + val emojis: Map = + mapOf( + Pair(":skull:", "☠"), + Pair(":heart:", "❤"), + Pair(":fire:", "\uD83D\uDD25"), + Pair(":tm:", "™"), + ) + + val pattern = + emojis.keys + .joinToString(separator = "|") + .let { pattern -> "(?i)($pattern)" } // Add case-insensitivity + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/chat/listeners/FormatNameChatListener.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/chat/listeners/FormatNameChatListener.kt new file mode 100644 index 000000000..5203ef736 --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/chat/listeners/FormatNameChatListener.kt @@ -0,0 +1,57 @@ +package com.projectcitybuild.pcbridge.features.chat.listeners + +import com.projectcitybuild.pcbridge.features.chat.ChatBadgeFormatter +import com.projectcitybuild.pcbridge.features.chat.ChatGroupFormatter +import io.github.reactivecircus.cache4k.Cache +import io.papermc.paper.chat.ChatRenderer +import io.papermc.paper.event.player.AsyncChatEvent +import kotlinx.coroutines.runBlocking +import net.kyori.adventure.text.Component +import org.bukkit.entity.Player +import org.bukkit.event.EventHandler +import org.bukkit.event.EventPriority +import org.bukkit.event.Listener +import java.util.UUID + +class FormatNameChatListener( + private val chatGroupFormatter: ChatGroupFormatter, + private val chatBadgeFormatter: ChatBadgeFormatter, + private val badgeCache: Cache, + private val groupCache: Cache, +) : Listener, ChatRenderer.ViewerUnaware { + @EventHandler(priority = EventPriority.HIGHEST) + fun onChat(event: AsyncChatEvent) { + event.renderer( + ChatRenderer.viewerUnaware(this), + ) + } + + override fun render( + source: Player, + sourceDisplayName: Component, + message: Component, + ): Component = + runBlocking { + val uuid = source.uniqueId + val badge = + badgeCache.get(uuid) { + chatBadgeFormatter.get(uuid) ?: Component.empty() + } + val groups = + groupCache.get(uuid) { + chatGroupFormatter.format(uuid) + } + Component.text() + .append( + badge, + groups.prefix, + groups.groups, + Component.space(), + sourceDisplayName, + groups.suffix, + Component.text(": "), + message, + ) + .build() + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/chat/listeners/SyncBadgesOnJoinListener.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/chat/listeners/SyncBadgesOnJoinListener.kt new file mode 100644 index 000000000..054251c74 --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/chat/listeners/SyncBadgesOnJoinListener.kt @@ -0,0 +1,25 @@ +package com.projectcitybuild.pcbridge.features.chat.listeners + +import com.projectcitybuild.pcbridge.core.state.Store +import com.projectcitybuild.pcbridge.features.bans.events.ConnectionPermittedEvent +import org.bukkit.event.EventHandler +import org.bukkit.event.Listener + +class SyncBadgesOnJoinListener( + private val store: Store, +) : Listener { + @EventHandler + suspend fun onConnectionPermitted(event: ConnectionPermittedEvent) { + store.mutate { state -> + val player = + state.players[event.playerUUID]!!.copy( + badges = event.aggregate.badges, + ) + val players = + state.players.apply { + put(event.playerUUID, player) + } + state.copy(players = players) + } + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/chat/repositories/ChatBadgeRepository.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/chat/repositories/ChatBadgeRepository.kt new file mode 100644 index 000000000..1a37404bd --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/chat/repositories/ChatBadgeRepository.kt @@ -0,0 +1,20 @@ +package com.projectcitybuild.pcbridge.features.chat.repositories + +import com.projectcitybuild.pcbridge.core.config.Config +import com.projectcitybuild.pcbridge.core.state.Store +import com.projectcitybuild.pcbridge.http.responses.Badge +import java.util.UUID + +class ChatBadgeRepository( + private val config: Config, + private val store: Store, +) { + fun getIcon(): String { + return config.get().chatBadge.icon + } + + fun getBadgesForPlayer(playerUuid: UUID): List { + return store.state.players[playerUuid]?.badges + ?: emptyList() + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/chat/repositories/ChatGroupRepository.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/chat/repositories/ChatGroupRepository.kt new file mode 100644 index 000000000..59c0df83d --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/chat/repositories/ChatGroupRepository.kt @@ -0,0 +1,45 @@ +package com.projectcitybuild.pcbridge.features.chat.repositories + +import com.projectcitybuild.pcbridge.core.config.Config +import com.projectcitybuild.pcbridge.core.permissions.Permissions +import com.projectcitybuild.pcbridge.features.chat.ChatGroupType +import java.util.UUID + +class ChatGroupRepository( + private val permissions: Permissions, + private val config: Config, +) { + fun getGroupNamesForPlayer(playerUUID: UUID): Set { + return permissions.getUserGroups(playerUUID) + } + + fun getPrefixForPlayer(playerUUID: UUID): String { + return permissions.getUserPrefix(playerUUID) + } + + fun getSuffixForPlayer(playerUUID: UUID): String { + return permissions.getUserSuffix(playerUUID) + } + + fun getGroupDisplayName(groupName: String): String? { + return permissions.getGroupMetaData( + groupName = groupName, + key = "chat_display_name", + ) ?: permissions.getGroupDisplayName(groupName) + } + + fun getGroupHoverName(groupName: String): String? { + return permissions.getGroupMetaData( + groupName = groupName, + key = "chat_hover_name", + ) + } + + fun getDisplayPriority(groupType: ChatGroupType): List { + return when (groupType) { + ChatGroupType.TRUST -> config.get().groups.displayPriority.trust + ChatGroupType.BUILD -> config.get().groups.displayPriority.builder + ChatGroupType.DONOR -> config.get().groups.displayPriority.donor + } + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/invisframes/commands/InvisFrameCommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/invisframes/commands/InvisFrameCommand.kt new file mode 100644 index 000000000..536472ecc --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/invisframes/commands/InvisFrameCommand.kt @@ -0,0 +1,104 @@ +package com.projectcitybuild.pcbridge.features.invisframes.commands + +import com.projectcitybuild.pcbridge.support.messages.CommandHelpBuilder +import com.projectcitybuild.pcbridge.support.spigot.BadCommandUsageException +import com.projectcitybuild.pcbridge.support.spigot.CommandArgsParser +import com.projectcitybuild.pcbridge.support.spigot.SpigotCommand +import com.projectcitybuild.pcbridge.support.spigot.SpigotNamespace +import net.kyori.adventure.text.Component +import net.kyori.adventure.text.format.NamedTextColor +import net.kyori.adventure.text.format.TextDecoration +import org.bukkit.Material +import org.bukkit.command.CommandSender +import org.bukkit.entity.Player +import org.bukkit.inventory.ItemStack +import org.bukkit.persistence.PersistentDataType + +class InvisFrameCommand( + private val spigotNamespace: SpigotNamespace, +) : SpigotCommand { + override val label = "invisframe" + + override val usage = CommandHelpBuilder() + + override suspend fun run( + sender: CommandSender, + args: Args, + ) { + val player = sender as? Player + checkNotNull(player) { + "Only players can use this command" + } + val itemStack = + if (args.isGlowingFrame) { + ItemStack(Material.GLOW_ITEM_FRAME) + } else { + ItemStack(Material.ITEM_FRAME) + } + val itemName = + if (args.isGlowingFrame) { + "Invisible Glowing Frame" + } else { + "Invisible Item Frame" + } + player.inventory.addItem( + itemStack.apply { + /** + * Since we don't have direct access to NMS editing, we track whether a frame + * should be invisible using a tag. This tag is saved into the world's + * "persistentDataContainer" so that it persists with the actual block data. + * + * - When the player hangs the frame (HangingPlaceEvent), we apply the tag to the placed entity + * - When the player places an item in the tagged frame (PlayerInteractEntityEvent), we hide the frame + * - When the player takes an item from the tagged frame (EntityDamageByEntityEvent), we show the frame + */ + if (itemMeta == null) throw Exception("ItemMeta cannot be null") + itemMeta = + itemMeta?.apply { + displayName( + Component.text(itemName) + .color(NamedTextColor.LIGHT_PURPLE) + .decorate(TextDecoration.ITALIC), + ) + persistentDataContainer.set( + spigotNamespace.invisibleKey, + PersistentDataType.BYTE, + 1, + ) + } + }, + ) + + if (args.isGlowingFrame) { + player.sendMessage( + Component.text("You received an invisible glowing frame") + .color(NamedTextColor.GRAY) + .decorate(TextDecoration.ITALIC), + ) + } else { + player.sendMessage( + Component.text("You received an invisible item frame") + .color(NamedTextColor.GRAY) + .decorate(TextDecoration.ITALIC), + ) + } + } + + data class Args( + val isGlowingFrame: Boolean, + ) { + class Parser : CommandArgsParser { + override fun parse(args: List): Args { + val isGlowing = + if (args.isEmpty()) { + false + } else if (args[0].lowercase() == "glowing") { + true + } else { + throw BadCommandUsageException() + } + return Args(isGlowingFrame = isGlowing) + } + } + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/invisframes/listeners/ItemInsertListener.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/invisframes/listeners/FrameItemInsertListener.kt similarity index 52% rename from pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/invisframes/listeners/ItemInsertListener.kt rename to pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/invisframes/listeners/FrameItemInsertListener.kt index 834ac837a..bc1b12321 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/invisframes/listeners/ItemInsertListener.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/invisframes/listeners/FrameItemInsertListener.kt @@ -1,30 +1,30 @@ -package com.projectcitybuild.modules.buildtools.invisframes.listeners +package com.projectcitybuild.pcbridge.features.invisframes.listeners -import com.projectcitybuild.support.spigot.SpigotNamespace -import com.projectcitybuild.support.spigot.listeners.SpigotListener +import com.projectcitybuild.pcbridge.support.spigot.SpigotNamespace import org.bukkit.entity.GlowItemFrame import org.bukkit.entity.ItemFrame import org.bukkit.event.EventHandler +import org.bukkit.event.Listener import org.bukkit.event.player.PlayerInteractEntityEvent import org.bukkit.persistence.PersistentDataType -class ItemInsertListener( +class FrameItemInsertListener( private val spigotNamespace: SpigotNamespace, -) : SpigotListener { - +) : Listener { @EventHandler - override suspend fun handle(event: PlayerInteractEntityEvent) { + fun onPlayerInteractEntityEvent(event: PlayerInteractEntityEvent) { val entity = event.rightClicked val isItemFrame = entity is ItemFrame if (!isItemFrame) return - val isInvisibleFrame = entity.persistentDataContainer.getOrDefault( - spigotNamespace.invisibleKey, - PersistentDataType.BYTE, - 0, - ) == 1.toByte() - + val invisibleValue = + entity.persistentDataContainer.getOrDefault( + spigotNamespace.invisibleKey, + PersistentDataType.BYTE, + 0, + ) + val isInvisibleFrame = invisibleValue == 1.toByte() if (isInvisibleFrame) { val itemFrame = entity as ItemFrame itemFrame.isVisible = false diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/invisframes/listeners/ItemRemoveListener.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/invisframes/listeners/FrameItemRemoveListener.kt similarity index 52% rename from pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/invisframes/listeners/ItemRemoveListener.kt rename to pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/invisframes/listeners/FrameItemRemoveListener.kt index ad5ac3f40..a2c44caea 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/buildtools/invisframes/listeners/ItemRemoveListener.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/invisframes/listeners/FrameItemRemoveListener.kt @@ -1,30 +1,30 @@ -package com.projectcitybuild.modules.buildtools.invisframes.listeners +package com.projectcitybuild.pcbridge.features.invisframes.listeners -import com.projectcitybuild.support.spigot.SpigotNamespace -import com.projectcitybuild.support.spigot.listeners.SpigotListener +import com.projectcitybuild.pcbridge.support.spigot.SpigotNamespace import org.bukkit.entity.GlowItemFrame import org.bukkit.entity.ItemFrame import org.bukkit.event.EventHandler +import org.bukkit.event.Listener import org.bukkit.event.entity.EntityDamageByEntityEvent import org.bukkit.persistence.PersistentDataType -class ItemRemoveListener( +class FrameItemRemoveListener( private val spigotNamespace: SpigotNamespace, -) : SpigotListener { - +) : Listener { @EventHandler - override suspend fun handle(event: EntityDamageByEntityEvent) { + fun onEntityDamageByEntity(event: EntityDamageByEntityEvent) { val entity = event.entity val isItemFrame = entity is ItemFrame if (!isItemFrame) return - val isInvisibleFrame = entity.persistentDataContainer.getOrDefault( - spigotNamespace.invisibleKey, - PersistentDataType.BYTE, - 0, - ) == 1.toByte() - + val invisibleValue = + entity.persistentDataContainer.getOrDefault( + spigotNamespace.invisibleKey, + PersistentDataType.BYTE, + 0, + ) + val isInvisibleFrame = invisibleValue == 1.toByte() if (isInvisibleFrame) { val itemFrame = entity as ItemFrame itemFrame.isVisible = true diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/invisframes/listeners/FramePlaceListener.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/invisframes/listeners/FramePlaceListener.kt new file mode 100644 index 000000000..77dd20378 --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/invisframes/listeners/FramePlaceListener.kt @@ -0,0 +1,34 @@ +package com.projectcitybuild.pcbridge.features.invisframes.listeners + +import com.projectcitybuild.pcbridge.support.spigot.SpigotNamespace +import org.bukkit.entity.ItemFrame +import org.bukkit.event.EventHandler +import org.bukkit.event.Listener +import org.bukkit.event.hanging.HangingPlaceEvent +import org.bukkit.persistence.PersistentDataType + +class FramePlaceListener( + private val spigotNamespace: SpigotNamespace, +) : Listener { + @EventHandler + fun onHangingPlaceEvent(event: HangingPlaceEvent) { + val isItemFrame = event.entity is ItemFrame + if (!isItemFrame) return + + val invisibleValue = + event.itemStack?.itemMeta?.persistentDataContainer?.getOrDefault( + spigotNamespace.invisibleKey, + PersistentDataType.BYTE, + 0, + ) ?: 0.toByte() + + val isInvisibleFrame = invisibleValue == 1.toByte() + if (isInvisibleFrame) { + event.entity.persistentDataContainer.set( + spigotNamespace.invisibleKey, + PersistentDataType.BYTE, + 1, + ) + } + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/PlayerConfig.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/joinmessages/PlayerConfig.kt similarity index 60% rename from pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/PlayerConfig.kt rename to pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/joinmessages/PlayerConfig.kt index 0184ac283..af7bc087e 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/PlayerConfig.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/joinmessages/PlayerConfig.kt @@ -1,4 +1,4 @@ -package com.projectcitybuild.entities +package com.projectcitybuild.pcbridge.features.joinmessages import java.time.LocalDateTime import java.util.UUID @@ -6,7 +6,5 @@ import java.util.UUID data class PlayerConfig( val id: Long, val uuid: UUID, - var isMuted: Boolean, - var isChatBadgeDisabled: Boolean, val firstSeen: LocalDateTime, ) diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/joinmessages/listeners/AnnounceJoinListener.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/joinmessages/listeners/AnnounceJoinListener.kt new file mode 100644 index 000000000..decd0597d --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/joinmessages/listeners/AnnounceJoinListener.kt @@ -0,0 +1,42 @@ +package com.projectcitybuild.pcbridge.features.joinmessages.listeners + +import com.projectcitybuild.pcbridge.core.config.Config +import com.projectcitybuild.pcbridge.core.datetime.LocalizedTime +import com.projectcitybuild.pcbridge.core.state.PlayerState +import com.projectcitybuild.pcbridge.core.state.Store +import net.kyori.adventure.text.Component +import net.kyori.adventure.text.minimessage.MiniMessage +import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder +import org.bukkit.event.EventHandler +import org.bukkit.event.EventPriority +import org.bukkit.event.Listener +import org.bukkit.event.player.PlayerJoinEvent + +class AnnounceJoinListener( + private val config: Config, + private val store: Store, + private val time: LocalizedTime, +) : Listener { + @EventHandler(priority = EventPriority.NORMAL) + suspend fun onPlayerJoin(event: PlayerJoinEvent) { + store.mutate { state -> + val players = + state.players.also { + it[event.player.uniqueId] = + it + .getOrDefault(event.player.uniqueId, defaultValue = PlayerState.empty()) + .copy(connectedAt = time.now()) + } + state.copy( + players = players, + ) + } + + event.joinMessage( + MiniMessage.miniMessage().deserialize( + config.get().messages.join, + Placeholder.component("name", Component.text(event.player.name)), + ), + ) + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/joinmessages/listeners/AnnounceQuitListener.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/joinmessages/listeners/AnnounceQuitListener.kt new file mode 100644 index 000000000..07ef65fea --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/joinmessages/listeners/AnnounceQuitListener.kt @@ -0,0 +1,59 @@ +package com.projectcitybuild.pcbridge.features.joinmessages.listeners + +import com.projectcitybuild.pcbridge.core.config.Config +import com.projectcitybuild.pcbridge.core.datetime.LocalizedTime +import com.projectcitybuild.pcbridge.core.state.Store +import net.kyori.adventure.text.Component +import net.kyori.adventure.text.minimessage.MiniMessage +import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder +import org.bukkit.event.EventHandler +import org.bukkit.event.EventPriority +import org.bukkit.event.Listener +import org.bukkit.event.player.PlayerQuitEvent +import java.time.Duration +import java.time.LocalDateTime + +class AnnounceQuitListener( + private val config: Config, + private val store: Store, + private val time: LocalizedTime, +) : Listener { + @EventHandler(priority = EventPriority.NORMAL) + suspend fun onPlayerQuit(event: PlayerQuitEvent) { + val playerState = store.state.players[event.player.uniqueId] + val joinTime = playerState?.connectedAt ?: time.now() + + store.mutate { state -> + state.copy( + players = state.players.apply { remove(event.player.uniqueId) }, + ) + } + + val timeOnline = sessionTime(start = joinTime) + + event.quitMessage( + MiniMessage.miniMessage().deserialize( + config.get().messages.leave, + Placeholder.component("name", Component.text(event.player.name)), + Placeholder.component("time_online", Component.text(timeOnline)), + ), + ) + } + + private fun sessionTime(start: LocalDateTime): String { + val now = time.now() + val diff = Duration.between(start, now) + + val secsOnline = diff.toSeconds() + val minsOnline = diff.toMinutes() + val hoursOnline = diff.toHours() + + return if (secsOnline < 60) { + "$secsOnline sec" + if (secsOnline > 1) "s" else "" + } else if (minsOnline < 60) { + "$minsOnline min" + if (minsOnline > 1) "s" else "" + } else { + "$hoursOnline hour" + if (hoursOnline > 1) "s" else "" + } + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/joinmessages/listeners/FirstTimeJoinListener.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/joinmessages/listeners/FirstTimeJoinListener.kt new file mode 100644 index 000000000..c4d3d23aa --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/joinmessages/listeners/FirstTimeJoinListener.kt @@ -0,0 +1,44 @@ +package com.projectcitybuild.pcbridge.features.joinmessages.listeners + +import com.projectcitybuild.pcbridge.core.config.Config +import com.projectcitybuild.pcbridge.core.datetime.LocalizedTime +import com.projectcitybuild.pcbridge.core.logger.log +import com.projectcitybuild.pcbridge.features.joinmessages.repositories.PlayerConfigRepository +import net.kyori.adventure.text.Component +import net.kyori.adventure.text.minimessage.MiniMessage +import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder +import org.bukkit.Server +import org.bukkit.event.EventHandler +import org.bukkit.event.EventPriority +import org.bukkit.event.Listener +import org.bukkit.event.player.PlayerJoinEvent + +class FirstTimeJoinListener( + private val server: Server, + private val playerConfigRepository: PlayerConfigRepository, + private val config: Config, + private val time: LocalizedTime, +) : Listener { + @EventHandler(priority = EventPriority.MONITOR) + suspend fun onPlayerJoin(event: PlayerJoinEvent) { + val playerConfig = playerConfigRepository.get(event.player.uniqueId) + if (playerConfig != null) { + return + } + playerConfigRepository.add( + uuid = event.player.uniqueId, + firstSeen = time.now(), + ) + + log.debug { "Sending first-time welcome message for ${event.player.name}" } + + val message = + MiniMessage.miniMessage().deserialize( + config.get().messages.firstTimeJoin, + Placeholder.component("name", Component.text(event.player.name)), + ) + server.onlinePlayers + .filter { it.uniqueId != event.player.uniqueId } + .forEach { it.sendMessage(message) } + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/joinmessages/listeners/ServerOverviewJoinListener.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/joinmessages/listeners/ServerOverviewJoinListener.kt new file mode 100644 index 000000000..27d6a0ac4 --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/joinmessages/listeners/ServerOverviewJoinListener.kt @@ -0,0 +1,21 @@ +package com.projectcitybuild.pcbridge.features.joinmessages.listeners + +import com.projectcitybuild.pcbridge.core.config.Config +import net.kyori.adventure.text.minimessage.MiniMessage +import org.bukkit.event.EventHandler +import org.bukkit.event.EventPriority +import org.bukkit.event.Listener +import org.bukkit.event.player.PlayerJoinEvent + +class ServerOverviewJoinListener( + private val config: Config, +) : Listener { + @EventHandler(priority = EventPriority.MONITOR) + fun onPlayerJoin(event: PlayerJoinEvent) { + val message = config.get().messages.welcome + + event.player.sendMessage( + MiniMessage.miniMessage().deserialize(message), + ) + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/joinmessages/repositories/PlayerConfigRepository.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/joinmessages/repositories/PlayerConfigRepository.kt new file mode 100644 index 000000000..8626bf230 --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/joinmessages/repositories/PlayerConfigRepository.kt @@ -0,0 +1,73 @@ +package com.projectcitybuild.pcbridge.features.joinmessages.repositories + +import com.projectcitybuild.pcbridge.core.database.DatabaseSession +import com.projectcitybuild.pcbridge.features.joinmessages.PlayerConfig +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext +import java.sql.Date +import java.sql.ResultSet +import java.time.LocalDateTime +import java.util.UUID + +class PlayerConfigRepository( + private val dataSource: DatabaseSession, +) { + suspend fun get(uuid: UUID): PlayerConfig? = + withContext(Dispatchers.IO) { + dataSource.connect { connection -> + connection.prepareStatement("SELECT * FROM players WHERE `uuid`=(?) LIMIT 1") + .apply { setString(1, uuid.toString()) } + .use { it.executeQuery() } + .use { it.firstRow() } + ?.toPlayerConfig() + } + } + + suspend fun add( + uuid: UUID, + firstSeen: LocalDateTime, + ): PlayerConfig = + withContext(Dispatchers.IO) { + val lastInsertedId = + dataSource.connect { connection -> + connection.prepareStatement("INSERT INTO players VALUES (NULL, ?, ?, ?, ?)") + .apply { + setString(1, uuid.toString()) + setBoolean(2, false) + setBoolean(3, false) + setDate(4, Date.valueOf(firstSeen.toLocalDate())) + } + .use { it.executeUpdate() } + } + PlayerConfig( + id = lastInsertedId.toLong(), + uuid = uuid, + firstSeen = firstSeen, + ) + } + + suspend fun save(player: PlayerConfig) = + withContext(Dispatchers.IO) { + dataSource.connect { connection -> + connection.prepareStatement("UPDATE players SET `uuid` = ?, `first_seen` = ? WHERE `id`= ?") + .apply { + setString(1, player.uuid.toString()) + setDate(4, Date.valueOf(player.firstSeen.toLocalDate())) + setLong(5, player.id) + } + .use { it.executeUpdate() } + } + } +} + +private fun ResultSet.firstRow(): ResultSet? { + if (next()) return this + return null +} + +private fun ResultSet.toPlayerConfig() = + PlayerConfig( + id = getLong("id"), + uuid = UUID.fromString(getString("uuid")), + firstSeen = getTimestamp("first_seen").toLocalDateTime(), + ) diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/mute/commands/MuteCommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/mute/commands/MuteCommand.kt new file mode 100644 index 000000000..c6bcbb16d --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/mute/commands/MuteCommand.kt @@ -0,0 +1,61 @@ +package com.projectcitybuild.pcbridge.features.mute.commands + +import com.projectcitybuild.pcbridge.support.messages.CommandHelpBuilder +import com.projectcitybuild.pcbridge.support.spigot.BadCommandUsageException +import com.projectcitybuild.pcbridge.support.spigot.CommandArgsParser +import com.projectcitybuild.pcbridge.support.spigot.SpigotCommand +import io.github.reactivecircus.cache4k.Cache +import net.kyori.adventure.text.Component +import net.kyori.adventure.text.format.NamedTextColor +import net.kyori.adventure.text.format.TextDecoration +import org.bukkit.Server +import org.bukkit.command.CommandSender +import java.util.UUID + +class MuteCommand( + private val server: Server, + private val mutedPlayers: Cache, +) : SpigotCommand { + override val label = "mute" + + override val usage = CommandHelpBuilder() // TODO + + override suspend fun run( + sender: CommandSender, + args: Args, + ) { + val player = server.getPlayer(args.playerName) + checkNotNull(player) { + "Player ${args.playerName} not found" + } + check(mutedPlayers.get(player.uniqueId) == null) { + "Player ${args.playerName} is already muted" + } + mutedPlayers.put(player.uniqueId, Unit) + + sender.sendMessage( + Component.text("Player ${args.playerName} has been muted") + .color(NamedTextColor.GRAY) + .decorate(TextDecoration.ITALIC), + ) + + player.sendMessage( + Component.text("You have been muted") + .color(NamedTextColor.RED) + .decorate(TextDecoration.ITALIC), + ) + } + + data class Args( + val playerName: String, + ) { + class Parser : CommandArgsParser { + override fun parse(args: List): Args { + if (args.isEmpty()) { + throw BadCommandUsageException() + } + return Args(playerName = args[0]) + } + } + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/mute/commands/UnmuteCommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/mute/commands/UnmuteCommand.kt new file mode 100644 index 000000000..20d2144cc --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/mute/commands/UnmuteCommand.kt @@ -0,0 +1,61 @@ +package com.projectcitybuild.pcbridge.features.mute.commands + +import com.projectcitybuild.pcbridge.support.messages.CommandHelpBuilder +import com.projectcitybuild.pcbridge.support.spigot.BadCommandUsageException +import com.projectcitybuild.pcbridge.support.spigot.CommandArgsParser +import com.projectcitybuild.pcbridge.support.spigot.SpigotCommand +import io.github.reactivecircus.cache4k.Cache +import net.kyori.adventure.text.Component +import net.kyori.adventure.text.format.NamedTextColor +import net.kyori.adventure.text.format.TextDecoration +import org.bukkit.Server +import org.bukkit.command.CommandSender +import java.util.UUID + +class UnmuteCommand( + private val server: Server, + private val mutedPlayers: Cache, +) : SpigotCommand { + override val label = "unmute" + + override val usage = CommandHelpBuilder() // TODO + + override suspend fun run( + sender: CommandSender, + args: Args, + ) { + val player = server.getPlayer(args.playerName) + checkNotNull(player) { + "Player ${args.playerName} not found" + } + check(mutedPlayers.get(player.uniqueId) != null) { + "Player ${args.playerName} is not currently muted" + } + mutedPlayers.invalidate(player.uniqueId) + + sender.sendMessage( + Component.text("Player ${args.playerName} has been unmuted") + .color(NamedTextColor.GRAY) + .decorate(TextDecoration.ITALIC), + ) + + player.sendMessage( + Component.text("You have been unmuted") + .color(NamedTextColor.LIGHT_PURPLE) + .decorate(TextDecoration.ITALIC), + ) + } + + data class Args( + val playerName: String, + ) { + class Parser : CommandArgsParser { + override fun parse(args: List): Args { + if (args.isEmpty()) { + throw BadCommandUsageException() + } + return Args(playerName = args[0]) + } + } + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/mute/listeners/MuteChatListener.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/mute/listeners/MuteChatListener.kt new file mode 100644 index 000000000..d7bd2184b --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/mute/listeners/MuteChatListener.kt @@ -0,0 +1,25 @@ +package com.projectcitybuild.pcbridge.features.mute.listeners + +import io.github.reactivecircus.cache4k.Cache +import io.papermc.paper.event.player.AsyncChatEvent +import net.kyori.adventure.text.Component +import net.kyori.adventure.text.format.NamedTextColor +import org.bukkit.event.EventHandler +import org.bukkit.event.EventPriority +import org.bukkit.event.Listener +import java.util.UUID + +class MuteChatListener( + private val mutedPlayers: Cache, +) : Listener { + @EventHandler(priority = EventPriority.HIGHEST) + fun onChat(event: AsyncChatEvent) { + if (mutedPlayers.get(event.player.uniqueId) != null) { + event.isCancelled = true + event.player.sendMessage( + Component.text("You cannot talk while muted") + .color(NamedTextColor.RED), + ) + } + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/nightvision/commands/NightVisionCommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/nightvision/commands/NightVisionCommand.kt new file mode 100644 index 000000000..1e469c1f6 --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/nightvision/commands/NightVisionCommand.kt @@ -0,0 +1,73 @@ +package com.projectcitybuild.pcbridge.features.nightvision.commands + +import com.projectcitybuild.pcbridge.support.messages.CommandHelpBuilder +import com.projectcitybuild.pcbridge.support.spigot.BadCommandUsageException +import com.projectcitybuild.pcbridge.support.spigot.CommandArgsParser +import com.projectcitybuild.pcbridge.support.spigot.SpigotCommand +import net.kyori.adventure.text.Component +import net.kyori.adventure.text.format.NamedTextColor +import net.kyori.adventure.text.format.TextDecoration +import org.bukkit.command.CommandSender +import org.bukkit.entity.Player +import org.bukkit.potion.PotionEffect +import org.bukkit.potion.PotionEffectType + +class NightVisionCommand : SpigotCommand { + override val label = "nv" + + override val usage = CommandHelpBuilder() + + override suspend fun run( + sender: CommandSender, + args: Args, + ) { + check(sender is Player) { + "Only players can use this command" + } + val duration = Integer.MAX_VALUE + val amplifier = 1 + val potionEffectType = PotionEffectType.NIGHT_VISION + val potionEffect = PotionEffect(potionEffectType, duration, amplifier) + + val toggleOn = + if (args.desiredState == null) { + !sender.hasPotionEffect(potionEffectType) + } else { + args.desiredState == true + } + + sender.removePotionEffect(potionEffectType) + + if (toggleOn) { + sender.addPotionEffect(potionEffect) + sender.sendMessage( + Component.text("NightVision toggled on. Type /nv to turn it off") + .color(NamedTextColor.GRAY) + .decorate(TextDecoration.ITALIC), + ) + } else { + sender.sendMessage( + Component.text("NightVision toggled off") + .color(NamedTextColor.GRAY) + .decorate(TextDecoration.ITALIC), + ) + } + } + + data class Args( + val desiredState: Boolean? = null, + ) { + class Parser : CommandArgsParser { + override fun parse(args: List): Args { + if (args.isEmpty()) { + return Args() + } + return when (args[0].lowercase()) { + "on" -> Args(desiredState = true) + "off" -> Args(desiredState = false) + else -> throw BadCommandUsageException() + } + } + } + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/staffchat/commands/StaffChatCommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/staffchat/commands/StaffChatCommand.kt new file mode 100644 index 000000000..cc51bd829 --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/staffchat/commands/StaffChatCommand.kt @@ -0,0 +1,56 @@ +package com.projectcitybuild.pcbridge.features.staffchat.commands + +import com.projectcitybuild.pcbridge.Permissions +import com.projectcitybuild.pcbridge.support.messages.CommandHelpBuilder +import com.projectcitybuild.pcbridge.support.spigot.BadCommandUsageException +import com.projectcitybuild.pcbridge.support.spigot.CommandArgsParser +import com.projectcitybuild.pcbridge.support.spigot.SpigotCommand +import net.kyori.adventure.text.Component +import net.kyori.adventure.text.format.NamedTextColor +import org.bukkit.Server +import org.bukkit.command.CommandSender + +class StaffChatCommand( + private val server: Server, +) : SpigotCommand { + override val label = "a" + + override val usage = CommandHelpBuilder() // TODO + + override suspend fun run( + sender: CommandSender, + args: Args, + ) { + val message = + Component.text() + .append( + Component.text("(Staff) ${sender.name}") + .color(NamedTextColor.YELLOW), + ) + .append( + Component.text(" » ") + .color(NamedTextColor.GRAY), + ) + .append( + Component.text(args.message), + ) + .build() + + server.onlinePlayers + .filter { it.hasPermission(Permissions.COMMAND_STAFF_CHAT) } + .forEach { it.sendMessage(message) } + } + + data class Args( + val message: String, + ) { + class Parser : CommandArgsParser { + override fun parse(args: List): Args { + if (args.isEmpty()) { + throw BadCommandUsageException() + } + return Args(message = args.joinToString(separator = " ")) + } + } + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/ranksync/actions/GenerateAccountVerificationURL.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/sync/actions/GenerateAccountVerificationURL.kt similarity index 61% rename from pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/ranksync/actions/GenerateAccountVerificationURL.kt rename to pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/sync/actions/GenerateAccountVerificationURL.kt index 22f575e0c..77b02379e 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/ranksync/actions/GenerateAccountVerificationURL.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/sync/actions/GenerateAccountVerificationURL.kt @@ -1,14 +1,14 @@ -package com.projectcitybuild.modules.ranksync.actions +package com.projectcitybuild.pcbridge.features.sync.actions -import com.projectcitybuild.pcbridge.core.utils.Failure -import com.projectcitybuild.pcbridge.core.utils.Result -import com.projectcitybuild.pcbridge.core.utils.Success +import com.projectcitybuild.pcbridge.features.sync.repositories.SyncRepository import com.projectcitybuild.pcbridge.http.services.pcb.AccountLinkHTTPService -import com.projectcitybuild.repositories.VerificationURLRepository +import com.projectcitybuild.pcbridge.utils.Failure +import com.projectcitybuild.pcbridge.utils.Result +import com.projectcitybuild.pcbridge.utils.Success import java.util.UUID class GenerateAccountVerificationURL( - private val verificationURLRepository: VerificationURLRepository + private val syncRepository: SyncRepository, ) { data class VerificationURL(val urlString: String) @@ -19,7 +19,7 @@ class GenerateAccountVerificationURL( suspend fun generate(playerUUID: UUID): Result { return try { - val url = verificationURLRepository.generateVerificationURL(playerUUID) + val url = syncRepository.generateVerificationURL(playerUUID) return if (url.isNullOrEmpty()) { Failure(FailureReason.EMPTY_RESPONSE) diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/sync/actions/SyncPlayerGroups.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/sync/actions/SyncPlayerGroups.kt new file mode 100644 index 000000000..f3b66a778 --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/sync/actions/SyncPlayerGroups.kt @@ -0,0 +1,27 @@ +package com.projectcitybuild.pcbridge.features.sync.actions + +import com.projectcitybuild.pcbridge.core.permissions.Permissions +import com.projectcitybuild.pcbridge.features.sync.repositories.SyncRepository +import com.projectcitybuild.pcbridge.http.responses.DonationPerk +import com.projectcitybuild.pcbridge.http.responses.Group +import java.util.UUID + +class SyncPlayerGroups( + private val permissions: Permissions, + private val syncRepository: SyncRepository, +) { + fun execute( + playerUUID: UUID, + groups: List, + donationPerks: List, + ) { + val groupSet = mutableSetOf() + groupSet.addAll( + groups.mapNotNull { it.minecraftName }, + ) + groupSet.addAll( + syncRepository.getDonorTiers(donationPerks), + ) + permissions.setUserGroups(playerUUID, groupSet.toList()) + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/sync/actions/UpdatePlayerGroups.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/sync/actions/UpdatePlayerGroups.kt new file mode 100644 index 000000000..def0e2bb9 --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/sync/actions/UpdatePlayerGroups.kt @@ -0,0 +1,36 @@ +package com.projectcitybuild.pcbridge.features.sync.actions + +import com.projectcitybuild.pcbridge.core.permissions.Permissions +import com.projectcitybuild.pcbridge.features.sync.repositories.SyncRepository +import com.projectcitybuild.pcbridge.http.services.pcb.PlayerGroupHttpService +import com.projectcitybuild.pcbridge.utils.Failure +import com.projectcitybuild.pcbridge.utils.Result +import com.projectcitybuild.pcbridge.utils.Success +import java.util.UUID + +class UpdatePlayerGroups( + private val permissions: Permissions, + private val syncRepository: SyncRepository, +) { + enum class FailureReason { + ACCOUNT_NOT_LINKED, + } + + suspend fun execute(playerUUID: UUID): Result { + val groupSet = mutableSetOf() + + try { + groupSet.addAll(syncRepository.getGroups(playerUUID = playerUUID)) + + val donorPerks = syncRepository.getDonorPerks(playerUUID) + val donorTierGroups = syncRepository.getDonorTiers(donorPerks) + groupSet.addAll(donorTierGroups) + } catch (e: PlayerGroupHttpService.NoLinkedAccountException) { + return Failure(FailureReason.ACCOUNT_NOT_LINKED) + } + + permissions.setUserGroups(playerUUID, groupSet.toList()) + + return Success(Unit) + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/sync/commands/SyncCommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/sync/commands/SyncCommand.kt new file mode 100644 index 000000000..b574ce1af --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/sync/commands/SyncCommand.kt @@ -0,0 +1,111 @@ +package com.projectcitybuild.pcbridge.features.sync.commands + +import com.projectcitybuild.pcbridge.features.sync.actions.GenerateAccountVerificationURL +import com.projectcitybuild.pcbridge.features.sync.actions.UpdatePlayerGroups +import com.projectcitybuild.pcbridge.support.messages.CommandHelpBuilder +import com.projectcitybuild.pcbridge.support.spigot.BadCommandUsageException +import com.projectcitybuild.pcbridge.support.spigot.CommandArgsParser +import com.projectcitybuild.pcbridge.support.spigot.SpigotCommand +import com.projectcitybuild.pcbridge.utils.Failure +import com.projectcitybuild.pcbridge.utils.Success +import net.kyori.adventure.text.Component +import net.kyori.adventure.text.event.ClickEvent +import net.kyori.adventure.text.event.HoverEvent +import net.kyori.adventure.text.format.NamedTextColor +import net.kyori.adventure.text.format.TextDecoration +import org.bukkit.command.CommandSender +import org.bukkit.entity.Player + +class SyncCommand( + private val generateAccountVerificationURL: GenerateAccountVerificationURL, + private val updatePlayerGroups: UpdatePlayerGroups, +) : SpigotCommand { + override val label = "sync" + + override val usage = CommandHelpBuilder() + + override suspend fun run( + sender: CommandSender, + args: Args, + ) { + check(sender is Player) { + "Only players can use this command" + } + when (args.finishSyncing) { + false -> generateVerificationURL(sender) + true -> syncGroups(sender) + } + } + + private suspend fun generateVerificationURL(player: Player) { + val result = generateAccountVerificationURL.generate(player.uniqueId) + + when (result) { + is Failure -> + when (result.reason) { + GenerateAccountVerificationURL.FailureReason.ALREADY_LINKED, + -> syncGroups(player) + + GenerateAccountVerificationURL.FailureReason.EMPTY_RESPONSE, + -> + player.sendMessage( + Component.text("Failed to generate verification URL: No URL received from server") + .color(NamedTextColor.RED), + ) + } + is Success -> + player.sendMessage( + Component.text() + .append( + Component.text("To link your account, please "), + ) + .append( + Component.text("click here") + .decorate(TextDecoration.UNDERLINED) + .decorate(TextDecoration.BOLD) + .clickEvent(ClickEvent.openUrl(result.value.urlString)) + .hoverEvent(HoverEvent.showText(Component.text(result.value.urlString))), + ) + .append( + Component.text(" and login if required"), + ), + ) + } + } + + private suspend fun syncGroups(player: Player) { + val result = updatePlayerGroups.execute(player.uniqueId) + + val message = + when (result) { + is Failure -> + when (result.reason) { + UpdatePlayerGroups.FailureReason.ACCOUNT_NOT_LINKED, + -> + Component.text("Sync failed. Did you finish registering your account?") + .color(NamedTextColor.RED) + } + is Success -> { + Component.text("Account linked! Your rank will be automatically synchronized with the PCB network") + .color(NamedTextColor.GREEN) + } + } + player.sendMessage(message) + } + + data class Args( + val finishSyncing: Boolean, + ) { + class Parser : CommandArgsParser { + override fun parse(args: List): Args { + if (args.isEmpty()) { + return Args(finishSyncing = false) + } + if (args[0] != "finish") { + throw BadCommandUsageException() + } + return Args(finishSyncing = true) + } + } + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/sync/commands/SyncOtherCommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/sync/commands/SyncOtherCommand.kt new file mode 100644 index 000000000..d6e561b8e --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/sync/commands/SyncOtherCommand.kt @@ -0,0 +1,70 @@ +package com.projectcitybuild.pcbridge.features.sync.commands + +import com.projectcitybuild.pcbridge.features.sync.actions.UpdatePlayerGroups +import com.projectcitybuild.pcbridge.support.messages.CommandHelpBuilder +import com.projectcitybuild.pcbridge.support.spigot.BadCommandUsageException +import com.projectcitybuild.pcbridge.support.spigot.CommandArgsParser +import com.projectcitybuild.pcbridge.support.spigot.SpigotCommand +import com.projectcitybuild.pcbridge.utils.Failure +import com.projectcitybuild.pcbridge.utils.Success +import net.kyori.adventure.text.Component +import net.kyori.adventure.text.format.NamedTextColor +import net.kyori.adventure.text.format.TextDecoration +import org.bukkit.Server +import org.bukkit.command.CommandSender + +class SyncOtherCommand( + private val server: Server, + private val updatePlayerGroups: UpdatePlayerGroups, +) : SpigotCommand { + override val label = "syncother" + + override val usage = CommandHelpBuilder() + + override suspend fun run( + sender: CommandSender, + args: Args, + ) { + val targetPlayer = server.getPlayer(args.targetPlayerName) + checkNotNull(targetPlayer) { + "Player ${args.targetPlayerName} not found" + } + val result = updatePlayerGroups.execute(targetPlayer.uniqueId) + when (result) { + is Failure -> + when (result.reason) { + UpdatePlayerGroups.FailureReason.ACCOUNT_NOT_LINKED, + -> + sender.sendMessage( + Component.text("Error: Player does not have a linked PCB account") + .color(NamedTextColor.RED), + ) + } + is Success -> { + sender.sendMessage( + Component.text("${targetPlayer.name} has been synchronized") + .color(NamedTextColor.GRAY) + .decorate(TextDecoration.ITALIC), + ) + targetPlayer.sendMessage( + Component.text("Your rank has been synchronized") + .color(NamedTextColor.GRAY) + .decorate(TextDecoration.ITALIC), + ) + } + } + } + + data class Args( + val targetPlayerName: String, + ) { + class Parser : CommandArgsParser { + override fun parse(args: List): Args { + if (args.isEmpty() || args.size > 1) { + throw BadCommandUsageException() + } + return Args(targetPlayerName = args[0]) + } + } + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/sync/listener/SyncRankOnJoinListener.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/sync/listener/SyncRankOnJoinListener.kt new file mode 100644 index 000000000..b15db567d --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/sync/listener/SyncRankOnJoinListener.kt @@ -0,0 +1,19 @@ +package com.projectcitybuild.pcbridge.features.sync.listener + +import com.projectcitybuild.pcbridge.features.bans.events.ConnectionPermittedEvent +import com.projectcitybuild.pcbridge.features.sync.actions.SyncPlayerGroups +import org.bukkit.event.EventHandler +import org.bukkit.event.Listener + +class SyncRankOnJoinListener( + private val syncPlayerGroups: SyncPlayerGroups, +) : Listener { + @EventHandler + fun onConnectionPermitted(event: ConnectionPermittedEvent) { + syncPlayerGroups.execute( + playerUUID = event.playerUUID, + groups = event.aggregate.account?.groups ?: emptyList(), + donationPerks = event.aggregate.donationPerks, + ) + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/sync/repositories/SyncRepository.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/sync/repositories/SyncRepository.kt new file mode 100644 index 000000000..15110f2bd --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/sync/repositories/SyncRepository.kt @@ -0,0 +1,47 @@ +package com.projectcitybuild.pcbridge.features.sync.repositories + +import com.projectcitybuild.pcbridge.core.config.Config +import com.projectcitybuild.pcbridge.core.logger.log +import com.projectcitybuild.pcbridge.http.responses.DonationPerk +import com.projectcitybuild.pcbridge.http.services.pcb.AccountLinkHTTPService +import com.projectcitybuild.pcbridge.http.services.pcb.PlayerGroupHttpService +import java.util.UUID + +class SyncRepository( + private val playerGroupHttpService: PlayerGroupHttpService, + private val accountLinkHttpService: AccountLinkHTTPService, + private val config: Config, +) { + @Throws(PlayerGroupHttpService.NoLinkedAccountException::class) + suspend fun getGroups(playerUUID: UUID): List { + return playerGroupHttpService.getGroups(playerUUID) + .mapNotNull { it.minecraftName } + } + + @Throws(PlayerGroupHttpService.NoLinkedAccountException::class) + suspend fun getDonorPerks(playerUUID: UUID): List { + return playerGroupHttpService.getDonorPerks(playerUUID) + } + + fun getDonorTiers(perks: List): List { + return perks.mapNotNull { donorPerk -> + val tierName = donorPerk.donationTier.name + + val groupNames = config.get().groups.donorTierGroupNames + when (tierName) { + "copper" -> groupNames.copper + "iron" -> groupNames.iron + "diamond" -> groupNames.diamond + else -> { + log.error { "Missing config node for donor tier: $tierName" } + null + } + } + } + } + + @Throws(AccountLinkHTTPService.AlreadyLinkedException::class) + suspend fun generateVerificationURL(playerUUID: UUID): String? { + return accountLinkHttpService.generateVerificationURL(playerUUID) + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/telemetry/listeners/TelemetryPlayerConnectListener.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/telemetry/listeners/TelemetryPlayerConnectListener.kt new file mode 100644 index 000000000..7c5e9ba37 --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/telemetry/listeners/TelemetryPlayerConnectListener.kt @@ -0,0 +1,25 @@ +package com.projectcitybuild.pcbridge.features.telemetry.listeners + +import com.projectcitybuild.pcbridge.features.telemetry.repositories.TelemetryRepository +import org.bukkit.entity.Player +import org.bukkit.event.EventHandler +import org.bukkit.event.Listener +import org.bukkit.event.player.PlayerJoinEvent +import org.bukkit.event.player.PlayerQuitEvent + +class TelemetryPlayerConnectListener( + private val telemetryRepository: TelemetryRepository, +) : Listener { + @EventHandler + suspend fun onPlayerJoin(event: PlayerJoinEvent) = seen(event.player) + + @EventHandler + suspend fun onPlayerQuit(event: PlayerQuitEvent) = seen(event.player) + + private suspend fun seen(player: Player) { + telemetryRepository.playerSeen( + playerUUID = player.uniqueId, + playerName = player.name, + ) + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/repositories/TelemetryRepository.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/telemetry/repositories/TelemetryRepository.kt similarity index 66% rename from pcbridge-spigot/src/main/kotlin/com/projectcitybuild/repositories/TelemetryRepository.kt rename to pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/telemetry/repositories/TelemetryRepository.kt index be395d367..4e2b78f8a 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/repositories/TelemetryRepository.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/telemetry/repositories/TelemetryRepository.kt @@ -1,4 +1,4 @@ -package com.projectcitybuild.repositories +package com.projectcitybuild.pcbridge.features.telemetry.repositories import com.projectcitybuild.pcbridge.http.services.pcb.TelemetryHttpService import java.util.UUID @@ -6,7 +6,10 @@ import java.util.UUID class TelemetryRepository( private val telemetryHttpService: TelemetryHttpService, ) { - suspend fun playerSeen(playerUUID: UUID, playerName: String) { + suspend fun playerSeen( + playerUUID: UUID, + playerName: String, + ) { telemetryHttpService.playerSeen( playerUUID = playerUUID, playerName = playerName, diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/utilities/commands/PCBridgeCommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/utilities/commands/PCBridgeCommand.kt new file mode 100644 index 000000000..4fb5a8253 --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/utilities/commands/PCBridgeCommand.kt @@ -0,0 +1,92 @@ +package com.projectcitybuild.pcbridge.features.utilities.commands + +import com.github.shynixn.mccoroutine.bukkit.SuspendingTabCompleter +import com.projectcitybuild.pcbridge.support.messages.CommandHelpBuilder +import com.projectcitybuild.pcbridge.support.spigot.BadCommandUsageException +import com.projectcitybuild.pcbridge.support.spigot.CommandArgsParser +import com.projectcitybuild.pcbridge.support.spigot.SpigotCommand +import com.projectcitybuild.pcbridge.support.tryValueOf +import net.kyori.adventure.text.Component +import net.kyori.adventure.text.format.TextColor +import org.bukkit.command.Command +import org.bukkit.command.CommandSender +import org.bukkit.plugin.java.JavaPlugin + +class PCBridgeCommand( + private val plugin: JavaPlugin, +) : SpigotCommand { + override val label = "pcbridge" + + override val usage = CommandHelpBuilder() // TODO + + override suspend fun run( + sender: CommandSender, + args: Args, + ) { + when (args.command) { + Args.Command.Reload -> reload(sender) + } + } + + private fun reload(sender: CommandSender) { + plugin.onDisable() + plugin.onEnable() + + val message = + Component.text() + .content("Reload complete") + .color(TextColor.color(0x75e900)) + .build() + + sender.sendMessage(message) + } + + class TabCompleter : SuspendingTabCompleter { + private val subcommands = + listOf( + "reload", + ) + + override suspend fun onTabComplete( + sender: CommandSender, + command: Command, + alias: String, + args: Array, + ): List? { + if (args.isEmpty()) { + return null + } + if (args.size == 1) { + return subcommands + .filter { it.startsWith(args[0]) } + .toMutableList() + } + return null + } + } + + data class Args( + val command: Command, + val remainingArgs: List, + ) { + enum class Command { + Reload, + } + + class Parser : CommandArgsParser { + override fun parse(args: List): Args { + if (args.isEmpty()) { + throw BadCommandUsageException() + } + val command = + tryValueOf(args[0].replaceFirstChar { it.uppercase() }) + ?: throw BadCommandUsageException() + + return Args( + command = command, + remainingArgs = args.drop(1), + ) + } + } + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/warnings/actions/GetUnacknowledgedWarnings.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warnings/actions/GetUnacknowledgedWarnings.kt similarity index 55% rename from pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/warnings/actions/GetUnacknowledgedWarnings.kt rename to pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warnings/actions/GetUnacknowledgedWarnings.kt index 902cf21ff..4f62c5f39 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/modules/moderation/warnings/actions/GetUnacknowledgedWarnings.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warnings/actions/GetUnacknowledgedWarnings.kt @@ -1,11 +1,11 @@ -package com.projectcitybuild.modules.moderation.warnings.actions +package com.projectcitybuild.pcbridge.features.warnings.actions -import com.projectcitybuild.pcbridge.core.modules.datetime.formatter.DateTimeFormatter -import com.projectcitybuild.repositories.PlayerWarningRepository +import com.projectcitybuild.pcbridge.core.datetime.DateTimeFormatter +import com.projectcitybuild.pcbridge.features.warnings.repositories.PlayerWarningRepository import java.util.UUID class GetUnacknowledgedWarnings( - private val playerWarningRepository: PlayerWarningRepository, + private val warningRepository: PlayerWarningRepository, private val dateTimeFormatter: DateTimeFormatter, ) { data class FormattedWarning( @@ -17,9 +17,9 @@ class GetUnacknowledgedWarnings( suspend fun execute( playerUUID: UUID, - playerName: String + playerName: String, ): List { - return playerWarningRepository + return warningRepository .get(playerUUID, playerName) .filter { !it.isAcknowledged } .map { @@ -27,9 +27,10 @@ class GetUnacknowledgedWarnings( id = it.id, reason = it.reason, isAcknowledged = it.isAcknowledged, - createdAt = it.createdAt.let { createdAt -> - dateTimeFormatter.convert(createdAt) - }, + createdAt = + it.createdAt.let { createdAt -> + dateTimeFormatter.convert(createdAt) + }, ) } } diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warnings/commands/WarningAcknowledgeCommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warnings/commands/WarningAcknowledgeCommand.kt new file mode 100644 index 000000000..3167148d2 --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warnings/commands/WarningAcknowledgeCommand.kt @@ -0,0 +1,37 @@ +package com.projectcitybuild.pcbridge.features.warnings.commands + +import com.projectcitybuild.pcbridge.features.warnings.repositories.PlayerWarningRepository +import com.projectcitybuild.pcbridge.support.messages.CommandHelpBuilder +import com.projectcitybuild.pcbridge.support.spigot.BadCommandUsageException +import com.projectcitybuild.pcbridge.support.spigot.CommandArgsParser +import com.projectcitybuild.pcbridge.support.spigot.SpigotCommand +import org.bukkit.command.CommandSender + +class WarningAcknowledgeCommand( + private val warningRepository: PlayerWarningRepository, +) : SpigotCommand { + override val label = "warning" + + override val usage = CommandHelpBuilder() + + override suspend fun run( + sender: CommandSender, + args: Args, + ) { + warningRepository.acknowledge(args.id) + sender.sendMessage("Warning acknowledged and hidden") + } + + data class Args( + val id: Int, + ) { + class Parser : CommandArgsParser { + override fun parse(args: List): Args { + if (args.isEmpty()) { + throw BadCommandUsageException() + } + return Args(id = args[0].toInt()) + } + } + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warnings/listeners/NotifyWarningsOnJoinListener.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warnings/listeners/NotifyWarningsOnJoinListener.kt new file mode 100644 index 000000000..e7d958991 --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warnings/listeners/NotifyWarningsOnJoinListener.kt @@ -0,0 +1,62 @@ +package com.projectcitybuild.pcbridge.features.warnings.listeners + +import com.projectcitybuild.pcbridge.features.warnings.actions.GetUnacknowledgedWarnings +import net.kyori.adventure.text.Component +import net.kyori.adventure.text.event.ClickEvent +import net.kyori.adventure.text.format.NamedTextColor +import net.kyori.adventure.text.format.TextDecoration +import org.bukkit.event.EventHandler +import org.bukkit.event.Listener +import org.bukkit.event.player.PlayerJoinEvent + +class NotifyWarningsOnJoinListener( + private val getUnacknowledgedWarnings: GetUnacknowledgedWarnings, +) : Listener { + @EventHandler + suspend fun onPlayerJoin(event: PlayerJoinEvent) { + val player = event.player + val warnings = + getUnacknowledgedWarnings.execute( + playerUUID = player.uniqueId, + playerName = player.name, + ) + if (warnings.isEmpty()) { + return + } + + val message = + Component.text() + .append( + Component.text("You have ").color(NamedTextColor.RED), + Component.text(warnings.size).decorate(TextDecoration.BOLD), + Component.text(" unacknowledged warnings").color(NamedTextColor.RED), + Component.newline(), + Component.text("---").color(NamedTextColor.GRAY), + Component.newline(), + ) + + warnings.forEach { warning -> + message.append( + Component.text(warning.reason), + Component.newline(), + Component.text("Date: ").color(NamedTextColor.GRAY), + Component.text(warning.createdAt), + Component.newline(), + Component.newline(), + Component.text("[I ACKNOWLEDGE]") + .color(NamedTextColor.GOLD) + .decorate(TextDecoration.BOLD, TextDecoration.UNDERLINED) + .clickEvent(ClickEvent.runCommand("/warning acknowledge ${warning.id}")), + Component.newline(), + Component.text("---").color(NamedTextColor.GRAY), + Component.newline(), + ) + } + message.append( + Component.text("Click the 'acknowledge' button to mark it as read and hide it") + .color(NamedTextColor.GRAY) + .decorate(TextDecoration.ITALIC), + ) + player.sendMessage(message) + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warnings/repositories/PlayerWarningRepository.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warnings/repositories/PlayerWarningRepository.kt new file mode 100644 index 000000000..8f5b0fef8 --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warnings/repositories/PlayerWarningRepository.kt @@ -0,0 +1,23 @@ +package com.projectcitybuild.pcbridge.features.warnings.repositories + +import com.projectcitybuild.pcbridge.http.responses.PlayerWarning +import com.projectcitybuild.pcbridge.http.services.pcb.PlayerWarningHttpService +import java.util.UUID + +class PlayerWarningRepository( + private val playerWarningHttpService: PlayerWarningHttpService, +) { + suspend fun get( + playerUUID: UUID, + playerName: String, + ): List { + return playerWarningHttpService.get( + playerUUID = playerUUID, + playerName = playerName, + ) + } + + suspend fun acknowledge(warningId: Int): PlayerWarning? { + return playerWarningHttpService.acknowledge(warningId) + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/Warp.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/Warp.kt new file mode 100644 index 000000000..84c125779 --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/Warp.kt @@ -0,0 +1,10 @@ +package com.projectcitybuild.pcbridge.features.warps + +import com.projectcitybuild.pcbridge.data.SerializableLocation +import java.time.LocalDateTime + +data class Warp( + val name: String, + val location: SerializableLocation, + val createdAt: LocalDateTime, +) diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/commands/WarpCommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/commands/WarpCommand.kt new file mode 100644 index 000000000..6c70d50da --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/commands/WarpCommand.kt @@ -0,0 +1,81 @@ +package com.projectcitybuild.pcbridge.features.warps.commands + +import com.projectcitybuild.pcbridge.features.warps.events.PlayerPreWarpEvent +import com.projectcitybuild.pcbridge.features.warps.repositories.WarpRepository +import com.projectcitybuild.pcbridge.support.messages.CommandHelpBuilder +import com.projectcitybuild.pcbridge.support.spigot.BadCommandUsageException +import com.projectcitybuild.pcbridge.support.spigot.CommandArgsParser +import com.projectcitybuild.pcbridge.support.spigot.SpigotCommand +import com.projectcitybuild.pcbridge.support.spigot.UnauthorizedCommandException +import net.kyori.adventure.text.Component +import net.kyori.adventure.text.format.NamedTextColor +import net.kyori.adventure.text.format.TextDecoration +import org.bukkit.Location +import org.bukkit.Server +import org.bukkit.command.CommandSender +import org.bukkit.entity.Player +import org.bukkit.event.player.PlayerTeleportEvent + +class WarpCommand( + private val warpRepository: WarpRepository, + private val server: Server, +) : SpigotCommand { + override val label = "warp" + + override val usage = CommandHelpBuilder() // TODO + + override suspend fun run( + sender: CommandSender, + args: Args, + ) { + if (!sender.hasPermission("pcbridge.warp.teleport")) { + throw UnauthorizedCommandException() + } + val player = sender as? Player + checkNotNull(player) { + "Only players can use this command" + } + val warp = warpRepository.get(name = args.warpName) + checkNotNull(warp) { + "Warp ${args.warpName} not found" + } + val world = server.getWorld(warp.location.worldName) + checkNotNull(world) { + "World $world does not exist" + } + val location = + Location( + world, + warp.location.x, + warp.location.y, + warp.location.z, + warp.location.yaw, + warp.location.pitch, + ) + server.pluginManager.callEvent( + PlayerPreWarpEvent(player), + ) + player.teleport( + location, + PlayerTeleportEvent.TeleportCause.COMMAND, + ) + sender.sendMessage( + Component.text("Warped to ${warp.name}") + .color(NamedTextColor.GRAY) + .decorate(TextDecoration.ITALIC), + ) + } + + data class Args( + val warpName: String, + ) { + class Parser : CommandArgsParser { + override fun parse(args: List): Args { + if (args.isEmpty()) { + throw BadCommandUsageException() + } + return Args(warpName = args[0]) + } + } + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/commands/WarpsCommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/commands/WarpsCommand.kt new file mode 100644 index 000000000..270f1f234 --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/commands/WarpsCommand.kt @@ -0,0 +1,148 @@ +package com.projectcitybuild.pcbridge.features.warps.commands + +import com.projectcitybuild.pcbridge.core.config.Config +import com.projectcitybuild.pcbridge.core.datetime.LocalizedTime +import com.projectcitybuild.pcbridge.features.warps.commands.warps.WarpCreateCommand +import com.projectcitybuild.pcbridge.features.warps.commands.warps.WarpDeleteCommand +import com.projectcitybuild.pcbridge.features.warps.commands.warps.WarpListCommand +import com.projectcitybuild.pcbridge.features.warps.commands.warps.WarpMoveCommand +import com.projectcitybuild.pcbridge.features.warps.commands.warps.WarpRenameCommand +import com.projectcitybuild.pcbridge.features.warps.repositories.WarpRepository +import com.projectcitybuild.pcbridge.support.messages.CommandHelpBuilder +import com.projectcitybuild.pcbridge.support.spigot.BadCommandUsageException +import com.projectcitybuild.pcbridge.support.spigot.CommandArgsParser +import com.projectcitybuild.pcbridge.support.spigot.SpigotCommand +import com.projectcitybuild.pcbridge.support.spigot.UnauthorizedCommandException +import com.projectcitybuild.pcbridge.support.tryValueOf +import org.bukkit.Server +import org.bukkit.command.CommandSender + +class WarpsCommand( + private val warpRepository: WarpRepository, + private val config: Config, + private val server: Server, + private val time: LocalizedTime, +) : SpigotCommand { + override val label = "warps" + + override val usage = + CommandHelpBuilder() + .subcommand( + label = "/warps list", + description = "shows all available warps", + permission = "pcbridge.warp.list", + ) + .subcommand( + label = "/warps create", + description = "creates a warp at the given position (or current position)", + permission = "pcbridge.warp.manage", + ) + .subcommand( + label = "/warps delete", + description = "deletes the given warp", + permission = "pcbridge.warp.manage", + ) + .subcommand( + label = "/warps move", + description = "moves an existing warp to your current location", + permission = "pcbridge.warp.manage", + ) + .subcommand( + label = "/warps rename", + description = "renames the given warp", + permission = "pcbridge.warp.manage", + ) + + override suspend fun run( + sender: CommandSender, + args: Args, + ) { + if (!sender.hasPermission("pcbridge.warp.manage") && !sender.hasPermission("pcbridge.warp.list")) { + throw UnauthorizedCommandException() + } + when (args.command) { + Args.Command.List -> + WarpListCommand( + warpRepository = warpRepository, + itemsPerPage = config.get().warps.itemsPerPage, + ).run( + sender = sender, + args = + WarpListCommand.Args.Parser() + .parse(args.remainingArgs), + ) + + Args.Command.Create -> + WarpCreateCommand( + warpRepository = warpRepository, + server = server, + time = time, + ).run( + sender = sender, + args = + WarpCreateCommand.Args.Parser() + .parse(args.remainingArgs), + ) + + Args.Command.Delete -> + WarpDeleteCommand( + warpRepository = warpRepository, + server = server, + ).run( + sender = sender, + args = + WarpDeleteCommand.Args.Parser() + .parse(args.remainingArgs), + ) + + Args.Command.Move -> + WarpMoveCommand( + warpRepository = warpRepository, + ).run( + sender = sender, + args = + WarpMoveCommand.Args.Parser() + .parse(args.remainingArgs), + ) + + Args.Command.Rename -> + WarpRenameCommand( + warpRepository = warpRepository, + ).run( + sender = sender, + args = + WarpRenameCommand.Args.Parser() + .parse(args.remainingArgs), + ) + } + } + + data class Args( + val command: Command, + val remainingArgs: List, + ) { + enum class Command { + List, + Create, + Delete, + Move, + Rename, + } + + class Parser : CommandArgsParser { + override fun parse(args: List): Args { + if (args.isEmpty()) { + throw BadCommandUsageException() + } + val command = + tryValueOf(args[0].replaceFirstChar { it.uppercase() }) + ?: throw BadCommandUsageException() + + return Args( + command = command, + remainingArgs = args.drop(1), + ) + } + } + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/commands/warps/WarpCreateCommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/commands/warps/WarpCreateCommand.kt new file mode 100644 index 000000000..558c62159 --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/commands/warps/WarpCreateCommand.kt @@ -0,0 +1,137 @@ +package com.projectcitybuild.pcbridge.features.warps.commands.warps + +import com.projectcitybuild.pcbridge.core.datetime.LocalizedTime +import com.projectcitybuild.pcbridge.data.SerializableLocation +import com.projectcitybuild.pcbridge.features.warps.Warp +import com.projectcitybuild.pcbridge.features.warps.events.WarpCreateEvent +import com.projectcitybuild.pcbridge.features.warps.repositories.WarpRepository +import com.projectcitybuild.pcbridge.support.messages.CommandHelpBuilder +import com.projectcitybuild.pcbridge.support.spigot.BadCommandUsageException +import com.projectcitybuild.pcbridge.support.spigot.CommandArgsParser +import com.projectcitybuild.pcbridge.support.spigot.SpigotCommand +import com.projectcitybuild.pcbridge.support.spigot.UnauthorizedCommandException +import net.kyori.adventure.text.Component +import net.kyori.adventure.text.format.NamedTextColor +import org.bukkit.Server +import org.bukkit.command.CommandSender +import org.bukkit.entity.Player + +class WarpCreateCommand( + private val warpRepository: WarpRepository, + private val server: Server, + private val time: LocalizedTime, +) : SpigotCommand { + override val label = "create" + + override val usage = CommandHelpBuilder() // TODO + + override suspend fun run( + sender: CommandSender, + args: Args, + ) { + if (!sender.hasPermission("pcbridge.warp.manage")) { + throw UnauthorizedCommandException() + } + val player = sender as? Player + checkNotNull(player) { + "Only players can use this command" + } + + val world = + if (args.worldName.isNullOrEmpty()) { + player.location.world + } else { + server.getWorld(args.worldName) + } + checkNotNull(world) { + "World ${args.worldName} not found" + } + + val location = + SerializableLocation( + worldName = world.name, + x = args.x ?: player.location.x, + y = args.y ?: player.location.y, + z = args.z ?: player.location.z, + yaw = args.yaw ?: player.location.yaw, + pitch = args.pitch ?: player.location.pitch, + ) + val warp = + Warp( + name = args.warpName, + location = location, + createdAt = time.now(), + ) + warpRepository.create(warp) + + server.pluginManager.callEvent(WarpCreateEvent()) + + sender.sendMessage( + Component.text("${args.warpName} warp created") + .color(NamedTextColor.GREEN), + ) + } + + data class Args( + val warpName: String, + val worldName: String?, + val x: Double?, + val y: Double?, + val z: Double?, + val yaw: Float?, + val pitch: Float?, + ) { + class Parser : CommandArgsParser { + override fun parse(args: List): Args { + if (args.isEmpty()) { + throw BadCommandUsageException() + } + val warpName = args[0] + val remainingArgs = args.drop(1) + + return Args( + warpName = warpName, + worldName = + remainingArgs + .find { it.startsWith("world:") } + ?.removePrefix("world:"), + x = + "x:".let { prefix -> + remainingArgs + .find { it.startsWith(prefix) } + ?.removePrefix(prefix) + ?.toDoubleOrNull() + }, + y = + "y:".let { prefix -> + remainingArgs + .find { it.startsWith(prefix) } + ?.removePrefix(prefix) + ?.toDoubleOrNull() + }, + z = + "z:".let { prefix -> + remainingArgs + .find { it.startsWith(prefix) } + ?.removePrefix(prefix) + ?.toDoubleOrNull() + }, + yaw = + "yaw:".let { prefix -> + remainingArgs + .find { it.startsWith(prefix) } + ?.removePrefix(prefix) + ?.toFloatOrNull() + }, + pitch = + "pitch:".let { prefix -> + remainingArgs + .find { it.startsWith(prefix) } + ?.removePrefix(prefix) + ?.toFloatOrNull() + }, + ) + } + } + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/commands/warps/WarpDeleteCommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/commands/warps/WarpDeleteCommand.kt new file mode 100644 index 000000000..a9f2baaa8 --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/commands/warps/WarpDeleteCommand.kt @@ -0,0 +1,52 @@ +package com.projectcitybuild.pcbridge.features.warps.commands.warps + +import com.projectcitybuild.pcbridge.features.warps.events.WarpDeleteEvent +import com.projectcitybuild.pcbridge.features.warps.repositories.WarpRepository +import com.projectcitybuild.pcbridge.support.messages.CommandHelpBuilder +import com.projectcitybuild.pcbridge.support.spigot.BadCommandUsageException +import com.projectcitybuild.pcbridge.support.spigot.CommandArgsParser +import com.projectcitybuild.pcbridge.support.spigot.SpigotCommand +import com.projectcitybuild.pcbridge.support.spigot.UnauthorizedCommandException +import net.kyori.adventure.text.Component +import net.kyori.adventure.text.format.NamedTextColor +import org.bukkit.Server +import org.bukkit.command.CommandSender + +class WarpDeleteCommand( + private val warpRepository: WarpRepository, + private val server: Server, +) : SpigotCommand { + override val label = "delete" + + override val usage = CommandHelpBuilder() // TODO + + override suspend fun run( + sender: CommandSender, + args: Args, + ) { + if (!sender.hasPermission("pcbridge.warp.manage")) { + throw UnauthorizedCommandException() + } + warpRepository.delete(name = args.warpName) + + server.pluginManager.callEvent(WarpDeleteEvent()) + + sender.sendMessage( + Component.text("${args.warpName} warp deleted") + .color(NamedTextColor.GREEN), + ) + } + + data class Args( + val warpName: String, + ) { + class Parser : CommandArgsParser { + override fun parse(args: List): Args { + if (args.size != 1) { + throw BadCommandUsageException() + } + return Args(warpName = args[0]) + } + } + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/commands/warps/WarpListCommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/commands/warps/WarpListCommand.kt new file mode 100644 index 000000000..3f2f75b43 --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/commands/warps/WarpListCommand.kt @@ -0,0 +1,95 @@ +package com.projectcitybuild.pcbridge.features.warps.commands.warps + +import com.projectcitybuild.pcbridge.features.warps.Warp +import com.projectcitybuild.pcbridge.features.warps.repositories.WarpRepository +import com.projectcitybuild.pcbridge.support.messages.CommandHelpBuilder +import com.projectcitybuild.pcbridge.support.messages.PaginationBuilder +import com.projectcitybuild.pcbridge.support.spigot.BadCommandUsageException +import com.projectcitybuild.pcbridge.support.spigot.CommandArgsParser +import com.projectcitybuild.pcbridge.support.spigot.SpigotCommand +import com.projectcitybuild.pcbridge.support.spigot.UnauthorizedCommandException +import net.kyori.adventure.text.Component +import net.kyori.adventure.text.event.ClickEvent +import net.kyori.adventure.text.event.HoverEvent +import net.kyori.adventure.text.format.NamedTextColor +import net.kyori.adventure.text.format.TextDecoration +import org.bukkit.command.CommandSender + +class WarpListCommand( + private val warpRepository: WarpRepository, + private val itemsPerPage: Int, +) : SpigotCommand { + override val label = "list" + + override val usage = CommandHelpBuilder() // TODO + + override suspend fun run( + sender: CommandSender, + args: Args, + ) { + if (!sender.hasPermission("pcbridge.warp.list")) { + throw UnauthorizedCommandException() + } + val page = + warpRepository.all( + limit = itemsPerPage, + page = args.page, + ) + if (page.items.isEmpty()) { + sender.sendMessage( + Component.text("No warps available") + .color(NamedTextColor.GRAY), + ) + return + } + + val message = + PaginationBuilder() + .items { (index, warp) -> + val rawCommand = "/warp ${warp.name}" + val component = + Component.text() + .content(warp.name) + .color(NamedTextColor.AQUA) + .decorate(TextDecoration.UNDERLINED) + .clickEvent(ClickEvent.runCommand(rawCommand)) + .hoverEvent(HoverEvent.showText(Component.text(rawCommand))) + + if (index < page.items.size - 1) { + component.append( + Component.text(" / ") + .color(NamedTextColor.WHITE) + .decoration(TextDecoration.UNDERLINED, false), + ) + } + component.build() + } + .build(page) + + sender.sendMessage(message) + } + + data class Args( + val page: Int, + ) { + class Parser : CommandArgsParser { + override fun parse(args: List): Args { + if (args.size > 1) { + throw BadCommandUsageException() + } + val page = + if (args.isEmpty()) { + 1 + } else { + args[0].toIntOrNull() + ?: error("Page must be a valid number") + } + + check(page > 0) { + "Page must be greater than 0" + } + return Args(page = page) + } + } + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/commands/warps/WarpMoveCommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/commands/warps/WarpMoveCommand.kt new file mode 100644 index 000000000..81776c745 --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/commands/warps/WarpMoveCommand.kt @@ -0,0 +1,55 @@ +package com.projectcitybuild.pcbridge.features.warps.commands.warps + +import com.projectcitybuild.pcbridge.data.SerializableLocation +import com.projectcitybuild.pcbridge.features.warps.repositories.WarpRepository +import com.projectcitybuild.pcbridge.support.messages.CommandHelpBuilder +import com.projectcitybuild.pcbridge.support.spigot.BadCommandUsageException +import com.projectcitybuild.pcbridge.support.spigot.CommandArgsParser +import com.projectcitybuild.pcbridge.support.spigot.SpigotCommand +import com.projectcitybuild.pcbridge.support.spigot.UnauthorizedCommandException +import net.kyori.adventure.text.Component +import net.kyori.adventure.text.format.NamedTextColor +import org.bukkit.command.CommandSender +import org.bukkit.entity.Player + +class WarpMoveCommand( + private val warpRepository: WarpRepository, +) : SpigotCommand { + override val label = "move" + + override val usage = CommandHelpBuilder() // TODO + + override suspend fun run( + sender: CommandSender, + args: Args, + ) { + if (!sender.hasPermission("pcbridge.warp.manage")) { + throw UnauthorizedCommandException() + } + val player = sender as? Player + checkNotNull(player) { + "Only players can use this command" + } + warpRepository.move( + name = args.warpName, + newLocation = SerializableLocation.fromLocation(player.location), + ) + sender.sendMessage( + Component.text("${args.warpName} warp moved") + .color(NamedTextColor.GREEN), + ) + } + + data class Args( + val warpName: String, + ) { + class Parser : CommandArgsParser { + override fun parse(args: List): Args { + if (args.size != 1) { + throw BadCommandUsageException() + } + return Args(warpName = args[0]) + } + } + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/commands/warps/WarpRenameCommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/commands/warps/WarpRenameCommand.kt new file mode 100644 index 000000000..f4c8fe053 --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/commands/warps/WarpRenameCommand.kt @@ -0,0 +1,53 @@ +package com.projectcitybuild.pcbridge.features.warps.commands.warps + +import com.projectcitybuild.pcbridge.features.warps.repositories.WarpRepository +import com.projectcitybuild.pcbridge.support.messages.CommandHelpBuilder +import com.projectcitybuild.pcbridge.support.spigot.BadCommandUsageException +import com.projectcitybuild.pcbridge.support.spigot.CommandArgsParser +import com.projectcitybuild.pcbridge.support.spigot.SpigotCommand +import com.projectcitybuild.pcbridge.support.spigot.UnauthorizedCommandException +import net.kyori.adventure.text.Component +import net.kyori.adventure.text.format.NamedTextColor +import org.bukkit.command.CommandSender + +class WarpRenameCommand( + private val warpRepository: WarpRepository, +) : SpigotCommand { + override val label = "rename" + + override val usage = CommandHelpBuilder() // TODO + + override suspend fun run( + sender: CommandSender, + args: Args, + ) { + if (!sender.hasPermission("pcbridge.warp.manage")) { + throw UnauthorizedCommandException() + } + warpRepository.rename( + oldName = args.oldName, + newName = args.newName, + ) + sender.sendMessage( + Component.text("${args.oldName} renamed to ${args.newName}") + .color(NamedTextColor.GREEN), + ) + } + + data class Args( + val oldName: String, + val newName: String, + ) { + class Parser : CommandArgsParser { + override fun parse(args: List): Args { + if (args.size != 2) { + throw BadCommandUsageException() + } + return Args( + oldName = args[0], + newName = args[1], + ) + } + } + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/events/PlayerPreWarpEvent.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/events/PlayerPreWarpEvent.kt similarity index 62% rename from pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/events/PlayerPreWarpEvent.kt rename to pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/events/PlayerPreWarpEvent.kt index 70a9ea6c7..7cc854132 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/entities/events/PlayerPreWarpEvent.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/events/PlayerPreWarpEvent.kt @@ -1,6 +1,5 @@ -package com.projectcitybuild.entities.events +package com.projectcitybuild.pcbridge.features.warps.events -import com.projectcitybuild.support.spigot.eventbroadcast.BroadcastableEvent import org.bukkit.entity.Player import org.bukkit.event.HandlerList import org.bukkit.event.Event as SpigotEvent @@ -10,18 +9,15 @@ import org.bukkit.event.Event as SpigotEvent */ class PlayerPreWarpEvent constructor( val player: Player, -) : SpigotEvent(), BroadcastableEvent { +) : SpigotEvent() { + override fun getHandlers(): HandlerList { + return HANDLERS + } companion object { private val HANDLERS = HandlerList() @JvmStatic - fun getHandlerList(): HandlerList { - return HANDLERS - } - } - - override fun getHandlers(): HandlerList { - return HANDLERS + fun getHandlerList() = HANDLERS } } diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/events/WarpCreateEvent.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/events/WarpCreateEvent.kt new file mode 100644 index 000000000..c9d92989b --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/events/WarpCreateEvent.kt @@ -0,0 +1,17 @@ +package com.projectcitybuild.pcbridge.features.warps.events + +import org.bukkit.event.HandlerList +import org.bukkit.event.Event as SpigotEvent + +class WarpCreateEvent : SpigotEvent() { + override fun getHandlers(): HandlerList { + return HANDLERS + } + + companion object { + private val HANDLERS = HandlerList() + + @JvmStatic + fun getHandlerList() = HANDLERS + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/events/WarpDeleteEvent.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/events/WarpDeleteEvent.kt new file mode 100644 index 000000000..c7c8bcd65 --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/events/WarpDeleteEvent.kt @@ -0,0 +1,17 @@ +package com.projectcitybuild.pcbridge.features.warps.events + +import org.bukkit.event.HandlerList +import org.bukkit.event.Event as SpigotEvent + +class WarpDeleteEvent : SpigotEvent() { + override fun getHandlers(): HandlerList { + return HANDLERS + } + + companion object { + private val HANDLERS = HandlerList() + + @JvmStatic + fun getHandlerList() = HANDLERS + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/repositories/WarpRepository.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/repositories/WarpRepository.kt new file mode 100644 index 000000000..f65458b5f --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/repositories/WarpRepository.kt @@ -0,0 +1,209 @@ +package com.projectcitybuild.pcbridge.features.warps.repositories + +import com.projectcitybuild.pcbridge.core.database.DatabaseSession +import com.projectcitybuild.pcbridge.data.Page +import com.projectcitybuild.pcbridge.data.SerializableLocation +import com.projectcitybuild.pcbridge.features.warps.Warp +import io.github.reactivecircus.cache4k.Cache +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext +import java.sql.Date.valueOf +import java.sql.ResultSet +import kotlin.math.ceil + +class WarpRepository( + private val db: DatabaseSession, + private val cache: Cache, +) { + suspend fun all( + limit: Int, + page: Int = 1, + ): Page = + withContext(Dispatchers.IO) { + check(page >= 1) { "Page must be greater than 0" } + + val startIndex = (page - 1) * limit + val warpCount = + db.connect { connection -> + connection.prepareStatement("SELECT COUNT(*) AS `count` FROM `warps`") + .use { it.executeQuery() } + .use { it.firstRow()?.getLong("count") } + ?: 0 + } + val warps = + db.connect { connection -> + connection.prepareStatement("SELECT * FROM `warps` ORDER BY `name` ASC LIMIT ? OFFSET ?") + .apply { + setInt(1, limit) + setInt(2, startIndex) + } + .use { it.executeQuery() } + .use { it.mapRows { row -> row.toWarp() } } + } + return@withContext Page( + items = warps, + page = page, + totalPages = ceil(warpCount.toDouble() / limit.toDouble()).toInt(), + ) + } + + suspend fun get(name: String): Warp? = + withContext(Dispatchers.IO) { + check(name.isNotEmpty()) + + db.connect { connection -> + connection.prepareStatement("SELECT * FROM `warps` WHERE `name`=? LIMIT 1") + .apply { setString(1, name) } + .use { it.executeQuery() } + .use { it.firstRow()?.toWarp() } + } + } + + suspend fun create(warp: Warp) = + withContext(Dispatchers.IO) { + val success = + db.connect { connection -> + connection.prepareStatement("INSERT INTO `warps` VALUES (?, ?, ?, ?, ?, ?, ?, ?)") + .apply { + setString(1, warp.name) + setString(2, warp.location.worldName) + setDouble(3, warp.location.x) + setDouble(4, warp.location.y) + setDouble(5, warp.location.z) + setFloat(6, warp.location.pitch) + setFloat(7, warp.location.yaw) + setDate(8, valueOf(warp.createdAt.toLocalDate())) + } + .use { it.executeUpdate() } == 1 + } + check(success) { + "Database write operation failed" + } + } + + suspend fun delete(name: String) = + withContext(Dispatchers.IO) { + val exists = + db.connect { connection -> + connection.prepareStatement("SELECT * FROM `warps` WHERE `name`=?") + .apply { setString(1, name) } + .use { it.executeQuery() } + .use { it.isBeforeFirst } + } + check(exists) { + "$name warp does not exist" + } + + val success = + db.connect { connection -> + connection.prepareStatement("DELETE `warps` WHERE `name`= ?") + .apply { setString(1, name) } + .executeUpdate() == 1 + } + check(success) { + "Database write operation failed: no affected rows" + } + } + + suspend fun rename( + oldName: String, + newName: String, + ) = withContext(Dispatchers.IO) { + val oldExists = + db.connect { connection -> + connection.prepareStatement("SELECT * FROM `warps` WHERE `name`=?") + .apply { setString(1, oldName) } + .use { it.executeQuery() } + .use { it.isBeforeFirst } + } + check(oldExists) { + "$oldName warp does not exist" + } + + val newExists = + db.connect { connection -> + connection.prepareStatement("SELECT * FROM `warps` WHERE `name`=?") + .apply { setString(1, newName) } + .use { it.executeQuery() } + .use { it.isBeforeFirst } + } + check(!newExists) { + "$newName warp already exists" + } + + val success = + db.connect { connection -> + connection.prepareStatement("UPDATE `warps` SET `name`=? WHERE `name`= ?") + .apply { + setString(1, newName) + setString(2, oldName) + } + .use { it.executeUpdate() } == 1 + } + check(success) { + "Database write operation failed: no affected rows" + } + } + + suspend fun move( + name: String, + newLocation: SerializableLocation, + ) = withContext(Dispatchers.IO) { + val exists = + db.connect { connection -> + connection.prepareStatement("SELECT * FROM `warps` WHERE `name`=?") + .apply { setString(1, name) } + .executeQuery() + .isBeforeFirst + } + check(exists) { + "$name warp does not exist" + } + + val success = + db.connect { connection -> + connection.prepareStatement("UPDATE `warps` SET `world`=?, `x`=?, `y`=?, `z`=?, `pitch`=?, `yaw`=? WHERE `name`= ?") + .apply { + setString(1, newLocation.worldName) + setDouble(2, newLocation.x) + setDouble(3, newLocation.y) + setDouble(4, newLocation.z) + setFloat(5, newLocation.yaw) + setFloat(6, newLocation.pitch) + setString(7, name) + } + .use { it.executeUpdate() } == 1 + } + check(success) { + "Database write operation failed: no affected rows" + } + } +} + +private fun ResultSet.firstRow(): ResultSet? { + if (next()) return this + return null +} + +private fun ResultSet.mapRows(transform: (ResultSet) -> T): List { + val rows = mutableListOf() + while (next()) { + rows.add(transform(this)) + } + return rows +} + +private fun ResultSet.toWarp() = + Warp( + name = getString("name"), + location = + SerializableLocation( + worldName = getString("world_name"), + x = getDouble("x"), + y = getDouble("y"), + z = getDouble("z"), + pitch = getFloat("pitch"), + yaw = getFloat("yaw"), + ), + createdAt = getTimestamp("created_at").toLocalDateTime(), + ) diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/integrations/DynmapIntegration.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/integrations/DynmapIntegration.kt new file mode 100644 index 000000000..405380d20 --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/integrations/DynmapIntegration.kt @@ -0,0 +1,109 @@ +package com.projectcitybuild.pcbridge.integrations + +import com.github.shynixn.mccoroutine.bukkit.registerSuspendingEvents +import com.projectcitybuild.pcbridge.core.config.Config +import com.projectcitybuild.pcbridge.core.errors.SentryReporter +import com.projectcitybuild.pcbridge.core.logger.log +import com.projectcitybuild.pcbridge.features.warps.events.WarpCreateEvent +import com.projectcitybuild.pcbridge.features.warps.events.WarpDeleteEvent +import com.projectcitybuild.pcbridge.features.warps.repositories.WarpRepository +import com.projectcitybuild.pcbridge.support.spigot.SpigotIntegration +import org.bukkit.event.EventHandler +import org.bukkit.event.Listener +import org.bukkit.plugin.Plugin +import org.bukkit.plugin.java.JavaPlugin +import org.dynmap.DynmapAPI + +class DynmapIntegration( + private val plugin: JavaPlugin, + private val warpRepository: WarpRepository, + private val config: Config, + sentry: SentryReporter, +) : Listener, SpigotIntegration( + pluginName = "dynmap", + pluginManager = plugin.server.pluginManager, + sentry = sentry, + ) { + class DynmapMarkerIconNotFoundException : Exception() + + private var dynmap: DynmapAPI? = null + + override suspend fun onEnable(loadedPlugin: Plugin) { + check(loadedPlugin is DynmapAPI) { + "Found dynmap plugin but cannot cast to DynmapAPI class" + } + dynmap = loadedPlugin + plugin.server.pluginManager.registerSuspendingEvents(this, plugin) + log.info { "Dynmap integration enabled" } + + updateWarpMarkers() + } + + override suspend fun onDisable() { + if (dynmap != null) { + WarpCreateEvent.getHandlerList().unregister(this) + WarpDeleteEvent.getHandlerList().unregister(this) + + dynmap = null + } + } + + @EventHandler + suspend fun onWarpCreate(event: WarpCreateEvent) = updateWarpMarkers() + + @EventHandler + suspend fun onWarpDelete(event: WarpDeleteEvent) = updateWarpMarkers() + + private suspend fun updateWarpMarkers() { + val dynmap = dynmap + if (dynmap == null) { + log.warn { "Dynmap integration disabled but attempted to draw warp markers" } + return + } + + log.debug { "Redrawing warp markers..." } + + val markerAPI = dynmap.markerAPI + + val warpMarkerSet = + markerAPI.getMarkerSet(MARKER_SET_NAME) + ?: markerAPI.createMarkerSet( + MARKER_SET_NAME, + // Name that shows up in the dynmap web interface + "Warps", + // TODO: what is this? + null, + // TODO: what is this? + false, + ) + warpMarkerSet.apply { + layerPriority = 1 + hideByDefault = false + + markers.forEach { it.deleteMarker() } + } + + val iconName = config.get().integrations.dynmap.warpIconName + val icon = + markerAPI.getMarkerIcon(iconName) + ?: throw DynmapMarkerIconNotFoundException() + + warpRepository.all(limit = 0).items.forEach { warp -> + warpMarkerSet.createMarker( + "warp.${warp.name}", + warp.name, + warp.location.worldName, + warp.location.x, + warp.location.y, + warp.location.z, + icon, + // TODO: what is this? + false, + ) + } + } + + private companion object { + const val MARKER_SET_NAME = "pcbridge" + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/integrations/EssentialsIntegration.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/integrations/EssentialsIntegration.kt new file mode 100644 index 000000000..e3a1b6ea8 --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/integrations/EssentialsIntegration.kt @@ -0,0 +1,57 @@ +package com.projectcitybuild.pcbridge.integrations + +import com.earth2me.essentials.Essentials +import com.github.shynixn.mccoroutine.bukkit.registerSuspendingEvents +import com.projectcitybuild.pcbridge.core.errors.SentryReporter +import com.projectcitybuild.pcbridge.core.logger.log +import com.projectcitybuild.pcbridge.features.warps.events.PlayerPreWarpEvent +import com.projectcitybuild.pcbridge.support.spigot.SpigotIntegration +import org.bukkit.event.EventHandler +import org.bukkit.event.Listener +import org.bukkit.plugin.Plugin +import org.bukkit.plugin.java.JavaPlugin + +class EssentialsIntegration( + private val plugin: JavaPlugin, + sentry: SentryReporter, +) : Listener, SpigotIntegration( + pluginName = "Essentials", + pluginManager = plugin.server.pluginManager, + sentry = sentry, + ) { + private var essentials: Essentials? = null + + override suspend fun onEnable(loadedPlugin: Plugin) { + check(loadedPlugin is Essentials) { + "Found Essentials plugin but cannot cast to Essentials class" + } + essentials = loadedPlugin + plugin.server.pluginManager.registerSuspendingEvents(this, plugin) + log.info { "Essentials integration enabled" } + } + + override suspend fun onDisable() { + if (essentials != null) { + PlayerPreWarpEvent.getHandlerList().unregister(this) + essentials = null + } + } + + /** + * Sets the player's current position as their last known location + * in Essentials + */ + @EventHandler + fun onPlayerPreWarp(event: PlayerPreWarpEvent) = + runCatching { + if (essentials == null) { + log.warn { "Essentials integration disabled but it's still listening to events" } + return@runCatching + } + essentials!! + .getUser(event.player) + .setLastLocation() + + log.debug { "Registered last location for ${event.player.name} with Essentials" } + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/integrations/LuckPermsIntegration.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/integrations/LuckPermsIntegration.kt new file mode 100644 index 000000000..9993fb0d5 --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/integrations/LuckPermsIntegration.kt @@ -0,0 +1,46 @@ +package com.projectcitybuild.pcbridge.integrations + +import com.projectcitybuild.pcbridge.core.logger.log +import net.luckperms.api.LuckPerms +import net.luckperms.api.LuckPermsProvider +import org.bukkit.event.Listener + +class LuckPermsIntegration( + // private val plugin: Plugin, + // private val chatGroupFormatter: ChatGroupFormatter, +) : Listener { + private var luckPerms: LuckPerms? = null + // private val eventSubscriptions: MutableList> = mutableListOf() + + fun enable() { + try { + luckPerms = LuckPermsProvider.get() + } catch (e: Exception) { + log.error { "Failed to hook into LuckPerms plugin" } + return + } + log.info { "LuckPerms integration enabled" } + + // listenForCacheInvalidation() + } + + fun disable() { + luckPerms = null + } + + // TODO + // private fun listenForCacheInvalidation() { + // eventSubscriptions.add( + // luckPerms.eventBus.subscribe(plugin, UserDataRecalculateEvent::class.java) { event -> + // chatGroupFormatter.flush(playerUUID = event.user.uniqueId) + // } + // ) + // eventSubscriptions.add( + // luckPerms.eventBus.subscribe(plugin, NodeMutateEvent::class.java) { event -> + // if (event.isGroup) { + // chatGroupFormatter.flushAllCaches() + // } + // } + // ) + // } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/support/EnumExtensions.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/support/EnumExtensions.kt new file mode 100644 index 000000000..1c42b9955 --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/support/EnumExtensions.kt @@ -0,0 +1,11 @@ +package com.projectcitybuild.pcbridge.support + +import java.lang.Enum.valueOf + +inline fun > tryValueOf(type: String): T? { + return try { + valueOf(T::class.java, type) + } catch (e: IllegalArgumentException) { + null + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/support/messages/CommandHelpBuilder.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/support/messages/CommandHelpBuilder.kt new file mode 100644 index 000000000..e978729ac --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/support/messages/CommandHelpBuilder.kt @@ -0,0 +1,54 @@ +package com.projectcitybuild.pcbridge.support.messages + +import net.kyori.adventure.text.Component +import net.kyori.adventure.text.TextComponent +import net.kyori.adventure.text.format.NamedTextColor + +class CommandHelpBuilder { + private val commands: MutableList = mutableListOf() + + data class CommandHelp( + val label: String, + val description: String, + val permission: String, + ) + + fun subcommand( + label: String, + description: String, + permission: String, + ): CommandHelpBuilder { + commands.add( + CommandHelp(label, description, permission), + ) + return this + } + + fun build(hasPermission: (String) -> Boolean): TextComponent { + return Component.text() + .appendDivider() + .also { + commands.forEach { command -> + if (hasPermission(command.permission)) { + it.append(command.asComponent()) + } + } + } + .appendDivider() + .build() + } +} + +private fun CommandHelpBuilder.CommandHelp.asComponent(): TextComponent { + return Component.text() + .append( + Component.text(label) + .color(NamedTextColor.AQUA), + ) + .append( + Component.text(" - $description") + .color(NamedTextColor.LIGHT_PURPLE), + ) + .appendNewline() + .build() +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/support/messages/PaginationBuilder.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/support/messages/PaginationBuilder.kt new file mode 100644 index 000000000..038e99a68 --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/support/messages/PaginationBuilder.kt @@ -0,0 +1,43 @@ +package com.projectcitybuild.pcbridge.support.messages + +import com.projectcitybuild.pcbridge.data.Page +import net.kyori.adventure.text.Component +import net.kyori.adventure.text.TextComponent +import net.kyori.adventure.text.format.NamedTextColor + +typealias PageItemTransformer = (IndexedValue) -> TextComponent + +class PaginationBuilder { + private var transformer: PageItemTransformer? = null + + fun items(transformer: PageItemTransformer): PaginationBuilder { + this.transformer = transformer + return this + } + + fun build(page: Page): TextComponent { + checkNotNull(transformer) + + val message = + Component.text() + .append( + Component.text("---") + .color(NamedTextColor.LIGHT_PURPLE), + ) + .append( + Component.text("Page ${page.page} of ${page.totalPages}"), + ) + .append( + Component.text("---") + .color(NamedTextColor.LIGHT_PURPLE), + ) + .appendNewline() + + for (entry in page.items.withIndex()) { + val component = transformer!!(entry) + message.append(component) + } + + return message.build() + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/support/messages/TextComponentExtensions.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/support/messages/TextComponentExtensions.kt new file mode 100644 index 000000000..b8d974db1 --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/support/messages/TextComponentExtensions.kt @@ -0,0 +1,14 @@ +package com.projectcitybuild.pcbridge.support.messages + +import net.kyori.adventure.text.Component +import net.kyori.adventure.text.TextComponent +import net.kyori.adventure.text.format.NamedTextColor +import net.kyori.adventure.text.format.TextColor + +fun TextComponent.Builder.appendDivider(color: TextColor = NamedTextColor.LIGHT_PURPLE): TextComponent.Builder { + return append( + Component.text("-----------") + .color(color) + .appendNewline(), + ) +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/support/serializable/LocalDateTimeSerializer.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/support/serializable/LocalDateTimeSerializer.kt new file mode 100644 index 000000000..7ab749aac --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/support/serializable/LocalDateTimeSerializer.kt @@ -0,0 +1,27 @@ +package com.projectcitybuild.pcbridge.support.serializable + +import kotlinx.serialization.KSerializer +import kotlinx.serialization.descriptors.PrimitiveKind +import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder +import java.time.Instant +import java.time.LocalDateTime +import java.time.ZoneId +import java.time.ZoneOffset + +object LocalDateTimeSerializer : KSerializer { + override val descriptor = PrimitiveSerialDescriptor("LocalDateTime", PrimitiveKind.LONG) + + override fun deserialize(decoder: Decoder): LocalDateTime { + val instant = Instant.ofEpochSecond(decoder.decodeLong()) + return LocalDateTime.ofInstant(instant, ZoneId.of(ZoneOffset.UTC.id)) + } + + override fun serialize( + encoder: Encoder, + value: LocalDateTime, + ) { + encoder.encodeLong(value.toEpochSecond(ZoneOffset.UTC)) + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/support/serializable/UUIDSerializer.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/support/serializable/UUIDSerializer.kt new file mode 100644 index 000000000..ce17f4723 --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/support/serializable/UUIDSerializer.kt @@ -0,0 +1,23 @@ +package com.projectcitybuild.pcbridge.support.serializable + +import kotlinx.serialization.KSerializer +import kotlinx.serialization.descriptors.PrimitiveKind +import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder +import java.util.UUID + +object UUIDSerializer : KSerializer { + override val descriptor = PrimitiveSerialDescriptor("UUID", PrimitiveKind.STRING) + + override fun deserialize(decoder: Decoder): UUID { + return UUID.fromString(decoder.decodeString()) + } + + override fun serialize( + encoder: Encoder, + value: UUID, + ) { + encoder.encodeString(value.toString()) + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/support/spigot/SpigotCommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/support/spigot/SpigotCommand.kt new file mode 100644 index 000000000..a27940f93 --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/support/spigot/SpigotCommand.kt @@ -0,0 +1,47 @@ +package com.projectcitybuild.pcbridge.support.spigot + +import com.projectcitybuild.pcbridge.support.messages.CommandHelpBuilder +import org.bukkit.command.CommandSender + +interface SpigotCommand { + val label: String + val usage: CommandHelpBuilder + + fun displayUsage(sender: CommandSender) { + sender.sendMessage( + usage.build(sender::hasPermission), + ) + } + + suspend fun run( + sender: CommandSender, + args: T, + ) +} + +/** + * Transformer class to bridge Spigot command arguments (Array) + * into a convenient data class (T) for commands to use. Provides additional + * validation and formatting if necessary. + * + * Throws [BadCommandUsageException] if expected arguments are not present + * Throws [IllegalStateException] if present arguments are invalid or malformed + */ +interface CommandArgsParser { + @Throws(IllegalStateException::class, BadCommandUsageException::class) + fun parse(args: List): T + + @Throws(IllegalStateException::class, BadCommandUsageException::class) + fun parse(args: Array): T = parse(args.toList()) +} + +/** + * Represents that the expected arguments for a command were not present + */ +class BadCommandUsageException : Exception() + +/** + * Represents that the player does not have the required permission + * to execute a command + */ +class UnauthorizedCommandException : Exception() diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/support/spigot/SpigotCommandRegistry.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/support/spigot/SpigotCommandRegistry.kt new file mode 100644 index 000000000..b5e6c5695 --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/support/spigot/SpigotCommandRegistry.kt @@ -0,0 +1,95 @@ +package com.projectcitybuild.pcbridge.support.spigot + +import com.github.shynixn.mccoroutine.bukkit.SuspendingCommandExecutor +import com.github.shynixn.mccoroutine.bukkit.SuspendingTabCompleter +import com.github.shynixn.mccoroutine.bukkit.setSuspendingExecutor +import com.github.shynixn.mccoroutine.bukkit.setSuspendingTabCompleter +import com.projectcitybuild.pcbridge.core.errors.SentryReporter +import net.kyori.adventure.text.Component +import net.kyori.adventure.text.format.NamedTextColor +import org.bukkit.command.Command +import org.bukkit.command.CommandSender +import org.bukkit.plugin.java.JavaPlugin +import java.lang.IllegalStateException + +class SpigotCommandRegistry( + private val plugin: JavaPlugin, + private val sentry: SentryReporter, +) { + private val registered: MutableSet = mutableSetOf() + + fun register( + handler: SpigotCommand, + argsParser: CommandArgsParser, + tabCompleter: SuspendingTabCompleter? = null, + ) { + val label = handler.label + check(!registered.contains(label)) { + "$label command already registered" + } + val pluginCommand = plugin.getCommand(label) + checkNotNull(pluginCommand) { + "$label command is not found. Did you forget to add it to plugin.yml?" + } + pluginCommand.setSuspendingExecutor( + object : SuspendingCommandExecutor { + override suspend fun onCommand( + sender: CommandSender, + command: Command, + label: String, + args: Array, + ): Boolean { + runCatching { + handler.run( + sender = sender, + args = argsParser.parse(args), + ) + }.onFailure { + when (it) { + is IllegalStateException -> { + sender.sendMessage( + Component.text("Error: ${it.localizedMessage}") + .color(NamedTextColor.RED), + ) + } + is BadCommandUsageException -> { + handler.displayUsage(sender) + } + is UnauthorizedCommandException -> { + sender.sendMessage( + Component.text("Error: You do not have permission to use this command") + .color(NamedTextColor.RED), + ) + } + else -> { + sender.sendMessage( + Component.text("Error: Something went wrong") + .color(NamedTextColor.RED), + ) + sentry.report(it) + throw it + } + } + } + return true + } + }, + ) + registered.add(label) + + if (tabCompleter != null) { + // TODO: also wrap this + pluginCommand.setSuspendingTabCompleter(tabCompleter) + } + } + + fun unregisterAll() { + registered.forEach { label -> + plugin.getCommand(label)?.apply { + setExecutor(null) + tabCompleter = null + } + } + registered.clear() + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/support/spigot/SpigotIntegration.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/support/spigot/SpigotIntegration.kt new file mode 100644 index 000000000..6d3f617a3 --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/support/spigot/SpigotIntegration.kt @@ -0,0 +1,31 @@ +package com.projectcitybuild.pcbridge.support.spigot + +import com.projectcitybuild.pcbridge.core.errors.SentryReporter +import com.projectcitybuild.pcbridge.core.logger.log +import org.bukkit.plugin.Plugin +import org.bukkit.plugin.PluginManager + +abstract class SpigotIntegration( + private val pluginName: String, + private val pluginManager: PluginManager, + private val sentry: SentryReporter, +) { + protected abstract suspend fun onEnable(loadedPlugin: Plugin) + + protected abstract suspend fun onDisable() + + suspend fun enable() = + runCatching { + val integratedPlugin = pluginManager.getPlugin(pluginName) + if (integratedPlugin == null) { + log.warn { "Cannot find dynmap plugin. Disabling marker integration" } + return@runCatching + } + onEnable(integratedPlugin) + }.onFailure { + log.error { "Failed to enable Dynmap integration: ${it.localizedMessage}" } + sentry.report(it) + } + + suspend fun disable() = onDisable() +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/support/spigot/SpigotListenerRegistry.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/support/spigot/SpigotListenerRegistry.kt new file mode 100644 index 000000000..851b95df3 --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/support/spigot/SpigotListenerRegistry.kt @@ -0,0 +1,20 @@ +package com.projectcitybuild.pcbridge.support.spigot + +import com.github.shynixn.mccoroutine.bukkit.registerSuspendingEvents +import org.bukkit.event.HandlerList +import org.bukkit.event.Listener +import org.bukkit.plugin.java.JavaPlugin + +class SpigotListenerRegistry( + private val plugin: JavaPlugin, +) { + fun register(vararg listeners: Listener) { + listeners.forEach { + plugin.server.pluginManager.registerSuspendingEvents(it, plugin) + } + } + + fun unregisterAll() { + HandlerList.unregisterAll(plugin) + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/spigot/SpigotNamespace.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/support/spigot/SpigotNamespace.kt similarity index 76% rename from pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/spigot/SpigotNamespace.kt rename to pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/support/spigot/SpigotNamespace.kt index 21e1a13df..f6b0ee4ff 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/spigot/SpigotNamespace.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/support/spigot/SpigotNamespace.kt @@ -1,4 +1,4 @@ -package com.projectcitybuild.support.spigot +package com.projectcitybuild.pcbridge.support.spigot import org.bukkit.NamespacedKey import org.bukkit.plugin.java.JavaPlugin @@ -7,4 +7,4 @@ class SpigotNamespace( plugin: JavaPlugin, ) { val invisibleKey = NamespacedKey(plugin, "invisible") -} \ No newline at end of file +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/spigot/SpigotTimer.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/support/spigot/SpigotTimer.kt similarity index 52% rename from pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/spigot/SpigotTimer.kt rename to pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/support/spigot/SpigotTimer.kt index ac93e9593..426751f53 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/spigot/SpigotTimer.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/support/spigot/SpigotTimer.kt @@ -1,27 +1,28 @@ -package com.projectcitybuild.support.spigot +package com.projectcitybuild.pcbridge.support.spigot -import com.projectcitybuild.pcbridge.core.contracts.PlatformTimer -import com.projectcitybuild.pcbridge.core.utils.Cancellable -import org.bukkit.plugin.Plugin +import com.projectcitybuild.pcbridge.utils.Cancellable +import org.bukkit.plugin.java.JavaPlugin import org.bukkit.scheduler.BukkitTask import java.util.concurrent.TimeUnit +// TODO: replace these with coroutines + delay later class SpigotTimer( - private val plugin: Plugin, -) : PlatformTimer { + private val plugin: JavaPlugin, +) { private val tasks: HashMap = hashMapOf() - override fun scheduleOnce( + fun scheduleOnce( identifier: String, delay: Long, unit: TimeUnit, work: () -> Unit, ): Cancellable { - val task = plugin.server.scheduler.runTaskLater( - plugin, - work, - unit.toSeconds(delay), - ) + val task = + plugin.server.scheduler.runTaskLater( + plugin, + work, + unit.toSeconds(delay), + ) tasks[identifier] = task return Cancellable { @@ -29,19 +30,21 @@ class SpigotTimer( } } - override fun scheduleRepeating( + fun scheduleRepeating( identifier: String, delay: Long, repeatingInterval: Long, unit: TimeUnit, work: () -> Unit, ): Cancellable { - val task = plugin.server.scheduler.runTaskTimer( - plugin, - work, - unit.toSeconds(delay), - unit.toSeconds(repeatingInterval) * 20, // Expects to be given in ticks (20 ticks per second) - ) + val task = + plugin.server.scheduler.runTaskTimer( + plugin, + work, + unit.toSeconds(delay), + // Expects to be given in ticks (20 ticks per second) + unit.toSeconds(repeatingInterval) * 20, + ) tasks[identifier] = task return Cancellable { @@ -49,7 +52,7 @@ class SpigotTimer( } } - override fun cancel(identifier: String) { + fun cancel(identifier: String) { val task = tasks[identifier] if (task != null) { task.cancel() @@ -57,7 +60,7 @@ class SpigotTimer( } } - override fun cancelAll() { + fun cancelAll() { plugin.server.scheduler.cancelTasks(plugin) } } diff --git a/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/utils/Cancellable.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/utils/Cancellable.kt similarity index 90% rename from pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/utils/Cancellable.kt rename to pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/utils/Cancellable.kt index c204b4939..a4c8bd5a0 100644 --- a/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/utils/Cancellable.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/utils/Cancellable.kt @@ -1,4 +1,4 @@ -package com.projectcitybuild.pcbridge.core.utils +package com.projectcitybuild.pcbridge.utils import java.util.concurrent.locks.ReentrantLock diff --git a/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/utils/Result.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/utils/Result.kt similarity index 81% rename from pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/utils/Result.kt rename to pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/utils/Result.kt index e3c38ec26..dd6b09732 100644 --- a/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/utils/Result.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/utils/Result.kt @@ -1,6 +1,7 @@ -package com.projectcitybuild.pcbridge.core.utils +package com.projectcitybuild.pcbridge.utils sealed class Result data class Success(val value: Success) : Result() + data class Failure(val reason: Failure) : Result() diff --git a/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/utils/extensions/StringExtensions.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/utils/extensions/StringExtensions.kt similarity index 83% rename from pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/utils/extensions/StringExtensions.kt rename to pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/utils/extensions/StringExtensions.kt index 06bd7cad6..3ab1add40 100644 --- a/pcbridge-core/src/main/kotlin/com/projectcitybuild/pcbridge/core/utils/extensions/StringExtensions.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/utils/extensions/StringExtensions.kt @@ -1,4 +1,4 @@ -package com.projectcitybuild.pcbridge.core.utils.extensions +package com.projectcitybuild.pcbridge.utils.extensions import java.util.regex.Pattern diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/repositories/ChatBadgeRepository.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/repositories/ChatBadgeRepository.kt deleted file mode 100644 index 3cefb107e..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/repositories/ChatBadgeRepository.kt +++ /dev/null @@ -1,20 +0,0 @@ -package com.projectcitybuild.repositories - -import com.projectcitybuild.pcbridge.http.responses.Badge -import java.util.UUID - -class ChatBadgeRepository { - private val cache: MutableMap> = mutableMapOf() - - fun put(playerUUID: UUID, badges: List) { - cache[playerUUID] = badges - } - - fun get(playerUUID: UUID): List { - return cache[playerUUID] ?: emptyList() - } - - fun remove(playerUUID: UUID) { - cache.remove(playerUUID) - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/repositories/CurrencyRepository.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/repositories/CurrencyRepository.kt deleted file mode 100644 index 939d654e9..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/repositories/CurrencyRepository.kt +++ /dev/null @@ -1,82 +0,0 @@ -package com.projectcitybuild.repositories - -import com.projectcitybuild.pcbridge.http.services.pcb.CurrencyHttpService -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch -import java.time.LocalDateTime -import java.util.UUID -import java.util.concurrent.ConcurrentHashMap -import kotlin.math.max - -class CurrencyRepository( - private val currencyHttpService: CurrencyHttpService, -) { - private data class CachedBalance( - val balance: Int, - val fetchedAt: LocalDateTime, - ) - - private val balanceCache = ConcurrentHashMap() - private val fetchQueue = ConcurrentHashMap() - - private fun fetchBalanceInBackground(playerUUID: UUID) { - if (fetchQueue[playerUUID] != null) { - return - } - fetchQueue[playerUUID] = true - - CoroutineScope(Dispatchers.IO).launch { - val balance = currencyHttpService.get( - playerUUID = playerUUID, - ) - balanceCache.set( - key = playerUUID, - value = CachedBalance( - balance = balance?.balance ?: 0, - fetchedAt = LocalDateTime.now(), - ) - ) - fetchQueue.remove(playerUUID) - } - } - - fun getBalance(playerUUID: UUID): Int { - // GadgetsMenu not only hits this method a LOT, but expects the - // value to be returned synchronously. We need to queue balance - // fetches in the background and sacrifice real-time balances - val staleDate = LocalDateTime.now().minusSeconds(20) - val cachedBalance = balanceCache[playerUUID] - - if (cachedBalance == null || cachedBalance.fetchedAt.isBefore(staleDate)) { - fetchBalanceInBackground(playerUUID) - } - if (cachedBalance == null) { - // No balance was ever fetched, but we can't do anything about that... - return 0 - } - return cachedBalance.balance - } - - fun deduct(playerUUID: UUID, amount: Int, reason: String): Boolean { - val cachedBalance = balanceCache[playerUUID] - if (cachedBalance == null || cachedBalance.balance - amount < 0) { - return false - } - CoroutineScope(Dispatchers.IO).launch { - currencyHttpService.deduct( - playerUUID = playerUUID, - amount = amount, - reason = reason, - ) - balanceCache.set( - key = playerUUID, - value = CachedBalance( - balance = max(0, (balanceCache[playerUUID]?.balance ?: 0) - amount), - fetchedAt = LocalDateTime.now(), - ) - ) - } - return true - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/repositories/PlayerConfigRepository.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/repositories/PlayerConfigRepository.kt deleted file mode 100644 index 7299174d6..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/repositories/PlayerConfigRepository.kt +++ /dev/null @@ -1,75 +0,0 @@ -package com.projectcitybuild.repositories - -import com.projectcitybuild.entities.PlayerConfig -import com.projectcitybuild.libs.database.DataSource -import com.projectcitybuild.libs.playercache.PlayerConfigCache -import java.time.LocalDateTime -import java.util.UUID - -class PlayerConfigRepository( - private val cache: PlayerConfigCache, - private val dataSource: DataSource -) { - fun get(uuid: UUID): PlayerConfig? { - val cachedPlayer = cache.get(uuid) - if (cachedPlayer != null) { - return cachedPlayer - } - - val row = dataSource.database().getFirstRow( - "SELECT * FROM players WHERE `uuid`=(?) LIMIT 1", - uuid.toString() - ) - if (row != null) { - val deserializedPlayer = PlayerConfig( - id = row.get("id"), - uuid = UUID.fromString(row.get("uuid")), - isMuted = row.get("is_muted"), - isChatBadgeDisabled = row.get("is_badge_disabled"), - firstSeen = row.get("first_seen"), - ) - cache.put(uuid, deserializedPlayer) - return deserializedPlayer - } - - return null - } - - fun add( - uuid: UUID, - isMuted: Boolean, - isChatBadgeDisabled: Boolean, - firstSeen: LocalDateTime, - ): PlayerConfig { - val lastInsertedId = dataSource.database().executeInsert( - "INSERT INTO players VALUES (NULL, ?, ?, ?, ?)", - uuid.toString(), - isMuted, - isChatBadgeDisabled, - firstSeen, - ) - val playerConfig = PlayerConfig( - id = lastInsertedId, - uuid = uuid, - isMuted = isMuted, - isChatBadgeDisabled = isChatBadgeDisabled, - firstSeen = firstSeen, - ) - cache.put(uuid, playerConfig) - - return playerConfig - } - - fun save(player: PlayerConfig) { - cache.put(player.uuid, player) - - dataSource.database().executeUpdate( - "UPDATE players SET `uuid` = ?, `is_muted` = ?, `is_badge_disabled` = ?, `first_seen` = ? WHERE `id`= ?", - player.uuid.toString(), - player.isMuted, - player.isChatBadgeDisabled, - player.firstSeen, - player.id, - ) - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/repositories/PlayerGroupRepository.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/repositories/PlayerGroupRepository.kt deleted file mode 100644 index e02ebcb9b..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/repositories/PlayerGroupRepository.kt +++ /dev/null @@ -1,39 +0,0 @@ -package com.projectcitybuild.repositories - -import com.projectcitybuild.entities.ConfigData -import com.projectcitybuild.pcbridge.core.modules.config.Config -import com.projectcitybuild.pcbridge.core.contracts.PlatformLogger -import com.projectcitybuild.pcbridge.http.services.pcb.PlayerGroupHttpService -import java.util.UUID - -class PlayerGroupRepository( - private val playerGroupHttpService: PlayerGroupHttpService, - private val config: Config, - private val logger: PlatformLogger, -) { - @Throws(PlayerGroupHttpService.NoLinkedAccountException::class) - suspend fun getGroups(playerUUID: UUID): List { - return playerGroupHttpService.getGroups(playerUUID) - .mapNotNull { it.minecraftName } - } - - @Throws(PlayerGroupHttpService.NoLinkedAccountException::class) - suspend fun getDonorTiers(playerUUID: UUID): List { - val perks = playerGroupHttpService.getDonorPerks(playerUUID) - - return perks.mapNotNull { donorPerk -> - val tierName = donorPerk.donationTier.name - - val groupNames = config.get().groups.donorTierGroupNames - when (tierName) { - "copper" -> groupNames.copper - "iron" -> groupNames.iron - "diamond" -> groupNames.diamond - else -> { - logger.severe("Missing config node for donor tier: $tierName") - null - } - } - } - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/repositories/PlayerWarningRepository.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/repositories/PlayerWarningRepository.kt deleted file mode 100644 index eb1fc320f..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/repositories/PlayerWarningRepository.kt +++ /dev/null @@ -1,36 +0,0 @@ -package com.projectcitybuild.repositories - -import com.projectcitybuild.pcbridge.http.responses.PlayerWarning -import com.projectcitybuild.pcbridge.http.services.pcb.PlayerWarningHttpService -import java.util.UUID - -class PlayerWarningRepository( - private val playerWarningHttpService: PlayerWarningHttpService, -) { - suspend fun get(playerUUID: UUID, playerName: String): List { - return playerWarningHttpService.get( - playerUUID = playerUUID, - playerName = playerName, - ) - } - - suspend fun create( - warnedPlayerUUID: UUID, - warnedPlayerName: String, - warnerPlayerUUID: UUID, - warnerPlayerName: String, - reason: String, - ): PlayerWarning? { - return playerWarningHttpService.create( - warnedPlayerUUID = warnedPlayerUUID, - warnedPlayerName = warnedPlayerName, - warnerPlayerUUID = warnerPlayerUUID, - warnerPlayerName = warnerPlayerName, - reason = reason, - ) - } - - suspend fun acknowledge(warningId: Int): PlayerWarning? { - return playerWarningHttpService.acknowledge(warningId) - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/repositories/ScheduledAnnouncementsRepository.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/repositories/ScheduledAnnouncementsRepository.kt deleted file mode 100644 index f6a3eefc1..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/repositories/ScheduledAnnouncementsRepository.kt +++ /dev/null @@ -1,32 +0,0 @@ -package com.projectcitybuild.repositories - -import com.projectcitybuild.entities.ConfigData -import com.projectcitybuild.pcbridge.core.modules.config.Config -import com.projectcitybuild.pcbridge.core.modules.filecache.FileCache - -data class ScheduledAnnouncements( - val lastBroadcastIndex: Int, -) - -class ScheduledAnnouncementsRepository( - private val config: Config, - private val fileCache: FileCache, -) { - private var lastBroadcastIndex: Int? = null - - fun getNextAnnouncement(): String { - val lastIndex = lastBroadcastIndex - ?: fileCache.get()?.lastBroadcastIndex - ?: -1 - - val announcements = config.get().announcements.messages - - val index = (lastIndex + 1) % announcements.size - lastBroadcastIndex = index - fileCache.put( - ScheduledAnnouncements(lastBroadcastIndex = index), - ) - - return announcements[index] - } -} \ No newline at end of file diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/repositories/VerificationURLRepository.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/repositories/VerificationURLRepository.kt deleted file mode 100644 index d67095a85..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/repositories/VerificationURLRepository.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.projectcitybuild.repositories - -import com.projectcitybuild.pcbridge.http.services.pcb.AccountLinkHTTPService -import java.util.UUID -import kotlin.jvm.Throws - -class VerificationURLRepository( - private val accountLinkHTTPService: AccountLinkHTTPService, -) { - @Throws(AccountLinkHTTPService.AlreadyLinkedException::class) - suspend fun generateVerificationURL(playerUUID: UUID): String? { - return accountLinkHTTPService.generateVerificationURL(playerUUID) - } -} \ No newline at end of file diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/repositories/WarpRepository.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/repositories/WarpRepository.kt deleted file mode 100644 index 01f880f8c..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/repositories/WarpRepository.kt +++ /dev/null @@ -1,103 +0,0 @@ -package com.projectcitybuild.repositories - -import com.projectcitybuild.entities.SerializableLocation -import com.projectcitybuild.entities.Warp -import com.projectcitybuild.libs.database.DataSource - -class WarpRepository( - private val dataSource: DataSource, -) { - private val nameCache: MutableList = mutableListOf() - private var hasBuiltNameCache = false - - fun exists(name: String): Boolean { - return first(name) != null - } - - fun first(name: String): Warp? { - return dataSource.database() - .getFirstRow("SELECT * FROM `warps` WHERE `name`= ? LIMIT 1", name) - ?.let { row -> - Warp( - name = row.get("name"), - location = SerializableLocation( - worldName = row.get("world_name"), - x = row.get("x"), - y = row.get("y"), - z = row.get("z"), - pitch = row.get("pitch"), - yaw = row.get("yaw"), - ), - createdAt = row.get("created_at"), - ) - } - } - - fun names(): List { - if (hasBuiltNameCache) { - return nameCache - } - return dataSource.database() - .getResults("SELECT `name` FROM `warps` ORDER BY `name` ASC") - .map { row -> row.getString("name") } - .also { warpNames -> - nameCache.addAll(warpNames) - nameCache.sort() - hasBuiltNameCache = true - } - } - - fun all(): List { - return dataSource.database() - .getResults("SELECT * FROM `warps` ORDER BY `name` ASC") - .map { row -> - Warp( - name = row.get("name"), - location = SerializableLocation( - worldName = row.get("world_name"), - x = row.get("x"), - y = row.get("y"), - z = row.get("z"), - pitch = row.get("pitch"), - yaw = row.get("yaw"), - ), - createdAt = row.get("created_at"), - ) - } - .also { - nameCache.clear() - nameCache.addAll(it.map { warp -> warp.name }) - nameCache.sort() - hasBuiltNameCache = true - } - } - - fun add(warp: Warp) { - dataSource.database().executeInsert( - "INSERT INTO `warps` VALUES (?, ?, ?, ?, ?, ?, ?, ?)", - warp.name, - warp.location.worldName, - warp.location.x, - warp.location.y, - warp.location.z, - warp.location.pitch, - warp.location.yaw, - warp.createdAt, - ) - - nameCache.clear() - hasBuiltNameCache = false - } - - fun delete(name: String) { - dataSource.database() - .executeUpdate("DELETE FROM `warps` WHERE `name`= ?", name) - - nameCache.remove(name) - } - - fun flush() { - nameCache.clear() - hasBuiltNameCache = false - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/commandapi/SuspendingExecutors.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/commandapi/SuspendingExecutors.kt deleted file mode 100644 index 65f474928..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/commandapi/SuspendingExecutors.kt +++ /dev/null @@ -1,22 +0,0 @@ -package com.projectcitybuild.support.commandapi - -import com.github.shynixn.mccoroutine.bukkit.launch -import dev.jorel.commandapi.CommandAPICommand -import dev.jorel.commandapi.executors.CommandArguments -import dev.jorel.commandapi.executors.PlayerCommandExecutor -import org.bukkit.entity.Player -import org.bukkit.plugin.java.JavaPlugin - -/** - * Same as `executesPlayer` but with Kotlin coroutines support - */ -fun CommandAPICommand.suspendExecutesPlayer( - plugin: JavaPlugin, - executor: suspend (sender: Player, args: CommandArguments) -> Unit, -): CommandAPICommand { - return executesPlayer(PlayerCommandExecutor { player, args -> - plugin.launch { - executor(player, args) - } - }) -} \ No newline at end of file diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/commandapi/ToggleOption.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/commandapi/ToggleOption.kt deleted file mode 100644 index 432004693..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/commandapi/ToggleOption.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.projectcitybuild.support.commandapi - -enum class ToggleOption { - ON, - OFF, - UNSPECIFIED, -} \ No newline at end of file diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/modules/ModuleRegisterDSL.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/modules/ModuleRegisterDSL.kt deleted file mode 100644 index 946034aa7..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/modules/ModuleRegisterDSL.kt +++ /dev/null @@ -1,27 +0,0 @@ -package com.projectcitybuild.support.modules - -import com.projectcitybuild.DependencyContainer -import com.projectcitybuild.support.spigot.listeners.SpigotListener -import com.projectcitybuild.support.spigot.listeners.SpigotListenerRegistry -import dev.jorel.commandapi.CommandAPICommand -import org.bukkit.event.Event - -class ModuleRegisterDSL( - private val listenerRegistry: SpigotListenerRegistry, - val container: DependencyContainer, -) { - fun command(label: String, declaration: ModuleCommandBuilder) { - val command = CommandAPICommand(label) - declaration(command) - command.register() - } - - fun listener(listener: SpigotListener) { - listenerRegistry.register(listener) - } -} - -private typealias ModuleCommandBuilder = CommandAPICommand.() -> Unit -private typealias ModuleBuilder = ModuleRegisterDSL.() -> Unit - -typealias ModuleDeclaration = (ModuleBuilder) -> Unit diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/modules/PluginModule.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/modules/PluginModule.kt deleted file mode 100644 index e8450ae73..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/modules/PluginModule.kt +++ /dev/null @@ -1,6 +0,0 @@ -package com.projectcitybuild.support.modules - -interface PluginModule { - fun register(module: ModuleDeclaration) - fun unregister() {} -} \ No newline at end of file diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/spigot/SpigotLogger.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/spigot/SpigotLogger.kt deleted file mode 100644 index 1f7c1c962..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/spigot/SpigotLogger.kt +++ /dev/null @@ -1,29 +0,0 @@ -package com.projectcitybuild.support.spigot - -import com.projectcitybuild.pcbridge.core.contracts.PlatformLogger -import java.util.logging.Logger - -class SpigotLogger( - private val logger: Logger, -) : PlatformLogger { - - override fun verbose(message: String) { - logger.info(message) // spigot doesn't log FINEST level properly - } - - override fun debug(message: String) { - logger.info(message) // spigot doesn't log FINE level properly - } - - override fun info(message: String) { - logger.info(message) - } - - override fun warning(message: String) { - logger.warning(message) - } - - override fun severe(message: String) { - logger.severe(message) - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/spigot/SpigotScheduler.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/spigot/SpigotScheduler.kt deleted file mode 100644 index c06609421..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/spigot/SpigotScheduler.kt +++ /dev/null @@ -1,30 +0,0 @@ -package com.projectcitybuild.support.spigot - -import com.projectcitybuild.pcbridge.core.contracts.PlatformScheduler -import com.projectcitybuild.pcbridge.core.utils.AsyncTask -import com.projectcitybuild.pcbridge.core.utils.Cancellable -import org.bukkit.plugin.java.JavaPlugin - -class SpigotScheduler( - private val plugin: JavaPlugin, -) : PlatformScheduler { - - override fun async(task: ((T) -> Unit) -> Unit): AsyncTask { - // Bukkit/Spigot performs Asynchronous units of work via their internal Scheduler - return AsyncTask { resolve -> - val runnable = Runnable { - task { result -> resolve(result) } - } - val bukkitTask = plugin.server.scheduler.runTaskAsynchronously(plugin, runnable) - - Cancellable { - bukkitTask.cancel() - } - } - } - - override fun sync(task: () -> Unit) { - val runnable = Runnable { task() } - plugin.server.scheduler.scheduleSyncDelayedTask(plugin, runnable) - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/spigot/SpigotServer.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/spigot/SpigotServer.kt deleted file mode 100644 index 3dca23ece..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/spigot/SpigotServer.kt +++ /dev/null @@ -1,52 +0,0 @@ -package com.projectcitybuild.support.spigot - -import net.md_5.bungee.api.ChatColor -import net.md_5.bungee.api.chat.TextComponent -import org.bukkit.Server -import org.bukkit.entity.Player -import org.bukkit.inventory.Inventory -import java.util.UUID - -class SpigotServer( - private val server: Server, -) { - enum class KickContext { - FATAL, - } - - fun kickByName(playerName: String, reason: String, context: KickContext) { - val caseInsensitiveName = playerName.lowercase() - - server.onlinePlayers - .firstOrNull { it.name.lowercase() == caseInsensitiveName } - ?.kickPlayer(makeKickMessage(reason, context)) - } - - fun kickByUUID(playerUUID: UUID, reason: String, context: KickContext) { - server.getPlayer(playerUUID) - ?.kickPlayer(makeKickMessage(reason, context)) - } - - fun kickByIP(ip: String, reason: String, context: KickContext) { - server.onlinePlayers - .firstOrNull { it.address.toString() == ip } - ?.kickPlayer(makeKickMessage(reason, context)) - } - - private fun makeKickMessage(message: String, context: KickContext): String { - return when (context) { - KickContext.FATAL -> - TextComponent(message).apply { - color = ChatColor.RED - } - }.toLegacyText() - } - - fun broadcastMessage(message: TextComponent) { - server.broadcastMessage(message.toLegacyText()) - } - - fun createInventory(owner: Player, size: Int, title: String): Inventory { - return server.createInventory(owner, size, title) - } -} \ No newline at end of file diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/spigot/eventbroadcast/BroadcastableEvent.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/spigot/eventbroadcast/BroadcastableEvent.kt deleted file mode 100644 index 63c565fc9..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/spigot/eventbroadcast/BroadcastableEvent.kt +++ /dev/null @@ -1,3 +0,0 @@ -package com.projectcitybuild.support.spigot.eventbroadcast - -interface BroadcastableEvent diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/spigot/eventbroadcast/LocalEventBroadcaster.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/spigot/eventbroadcast/LocalEventBroadcaster.kt deleted file mode 100644 index 63c2ef0b4..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/spigot/eventbroadcast/LocalEventBroadcaster.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.projectcitybuild.support.spigot.eventbroadcast - -interface LocalEventBroadcaster { - - /** - * Broadcasts an event to all listeners on the current server - * - * @param event The event to broadcast - */ - fun emit(event: BroadcastableEvent) -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/spigot/eventbroadcast/SpigotLocalEventBroadcaster.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/spigot/eventbroadcast/SpigotLocalEventBroadcaster.kt deleted file mode 100644 index 600e7f071..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/spigot/eventbroadcast/SpigotLocalEventBroadcaster.kt +++ /dev/null @@ -1,20 +0,0 @@ -package com.projectcitybuild.support.spigot.eventbroadcast - -import com.projectcitybuild.pcbridge.core.contracts.PlatformScheduler -import org.bukkit.Bukkit -import org.bukkit.event.Event - -class SpigotLocalEventBroadcaster( - private val scheduler: PlatformScheduler, -): LocalEventBroadcaster { - - override fun emit(event: BroadcastableEvent) { - if (event !is Event) { - throw Exception("Cannot cast event to Spigot Event [$event]") - } - // TODO: refactor this to not be blocking - scheduler.sync { - Bukkit.getPluginManager().callEvent(event) - } - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/spigot/listeners/SpigotListener.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/spigot/listeners/SpigotListener.kt deleted file mode 100644 index 47beb75d5..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/spigot/listeners/SpigotListener.kt +++ /dev/null @@ -1,8 +0,0 @@ -package com.projectcitybuild.support.spigot.listeners - -import org.bukkit.event.Event -import org.bukkit.event.Listener - -interface SpigotListener: Listener { - suspend fun handle(event: T) -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/spigot/listeners/SpigotListenerRegistry.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/spigot/listeners/SpigotListenerRegistry.kt deleted file mode 100644 index 9f6640a94..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/spigot/listeners/SpigotListenerRegistry.kt +++ /dev/null @@ -1,22 +0,0 @@ -package com.projectcitybuild.support.spigot.listeners - -import com.github.shynixn.mccoroutine.bukkit.registerSuspendingEvents -import com.projectcitybuild.pcbridge.core.contracts.PlatformLogger -import org.bukkit.event.Event -import org.bukkit.event.HandlerList -import org.bukkit.plugin.java.JavaPlugin - -class SpigotListenerRegistry( - private val plugin: JavaPlugin, - private val logger: PlatformLogger -) { - fun register(listener: SpigotListener) { - plugin.server.pluginManager.registerSuspendingEvents(listener, plugin) - logger.verbose("Registered listener ${listener::class.simpleName}") - } - - fun unregisterAll() { - HandlerList.unregisterAll() - logger.verbose("Unregistered all listeners") - } -} \ No newline at end of file diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/textcomponent/ChatMessageReceiver.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/textcomponent/ChatMessageReceiver.kt deleted file mode 100644 index 25d1c232a..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/textcomponent/ChatMessageReceiver.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.projectcitybuild.support.textcomponent - -import net.md_5.bungee.api.chat.BaseComponent - -interface ChatMessageReceiver { - fun sendMessage(component: BaseComponent) -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/textcomponent/MessageSender.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/textcomponent/MessageSender.kt deleted file mode 100644 index bf19dc06f..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/textcomponent/MessageSender.kt +++ /dev/null @@ -1,56 +0,0 @@ -package com.projectcitybuild.support.textcomponent - -import net.md_5.bungee.api.ChatColor -import net.md_5.bungee.api.chat.TextComponent - -class MessageSender( - private val receiver: ChatMessageReceiver -) { - fun error(message: String) { - receiver.sendMessage( - TextComponent() - .add("▐ Error: ") { it.color = ChatColor.RED } - .add(message) { it.color = ChatColor.WHITE } - ) - } - - fun success(message: String) { - receiver.sendMessage( - TextComponent() - .add("▐ ") { it.color = ChatColor.GREEN } - .add(message) { it.color = ChatColor.WHITE } - ) - } - - fun info(message: String, isMultiLine: Boolean = false) { - val messagesByLineBreak = if (isMultiLine) message.split("\n") else listOf(message) - - // Ensure that strings that wrap onto the next line also have the - // symbols at the start - val maxLineLength = 53 - val startSymbolLength = 3 - val messagesByLine = messagesByLineBreak.flatMap { it.chunked(maxLineLength - startSymbolLength) } - - val tc = TextComponent() - messagesByLine.forEachIndexed { index, string -> - tc - .add("▐ ") { it.color = ChatColor.GRAY } - .add(string) { it.color = ChatColor.WHITE } - - if (index < messagesByLine.count()) { - tc.add("\n") - } - } - - receiver.sendMessage(tc) - } - - fun action(message: String) { - receiver.sendMessage( - TextComponent(message).also { - it.color = ChatColor.GRAY - it.isItalic = true - } - ) - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/textcomponent/SpigotChatReceiver.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/textcomponent/SpigotChatReceiver.kt deleted file mode 100644 index 75ef72110..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/textcomponent/SpigotChatReceiver.kt +++ /dev/null @@ -1,22 +0,0 @@ -package com.projectcitybuild.support.textcomponent - -import net.md_5.bungee.api.chat.BaseComponent -import org.bukkit.command.CommandSender -import org.bukkit.entity.Player - -private class SpigotChatReceiver(private val player: Player) : ChatMessageReceiver { - - override fun sendMessage(component: BaseComponent) { - player.spigot().sendMessage(component) - } -} - -fun Player.send(): MessageSender { - - return MessageSender(SpigotChatReceiver(this)) -} - -fun CommandSender.send(): MessageSender { - - return MessageSender(SpigotChatReceiver(this as Player)) -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/textcomponent/TextComponentBuilder.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/textcomponent/TextComponentBuilder.kt deleted file mode 100644 index d28186257..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/support/textcomponent/TextComponentBuilder.kt +++ /dev/null @@ -1,44 +0,0 @@ -package com.projectcitybuild.support.textcomponent - -import net.md_5.bungee.api.chat.BaseComponent -import net.md_5.bungee.api.chat.TextComponent - -fun TextComponent.add(component: BaseComponent?, config: ((BaseComponent) -> Unit)? = null): TextComponent { - if (component == null) return this - - this.addExtra( - component.also { - config?.invoke(it) - } - ) - return this -} - -fun TextComponent.add(message: String, config: ((TextComponent) -> Unit)? = null): TextComponent { - this.addExtra( - TextComponent(message).also { - config?.invoke(it) - } - ) - return this -} - -fun TextComponent.addIf(condition: Boolean, message: String, config: ((TextComponent) -> Unit)? = null): TextComponent { - if (!condition) return this - add(message, config) - return this -} - -fun TextComponent.add(number: Int, config: ((TextComponent) -> Unit)? = null): TextComponent { - return add(number.toString(), config) -} - -fun TextComponent.add(collection: List): TextComponent { - collection.forEach { this.addExtra(it) } - return this -} - -fun TextComponent.add(collection: Array): TextComponent { - collection.forEach { this.addExtra(it) } - return this -} diff --git a/pcbridge-spigot/src/main/resources/plugin.yml b/pcbridge-spigot/src/main/resources/plugin.yml index daac4086f..a925142ed 100644 --- a/pcbridge-spigot/src/main/resources/plugin.yml +++ b/pcbridge-spigot/src/main/resources/plugin.yml @@ -1,11 +1,45 @@ -main: com.projectcitybuild.PCBridge name: PCBridge +main: com.projectcitybuild.pcbridge.Plugin +website: https://github.com/projectcitybuild/PCBridge author: Andy -version: 5.1.0 +version: 6.0.0 +api-version: 1.20 + softdepend: - LuckPerms - dynmap - - GadgetsMenu - Essentials -api-version: 1.16 \ No newline at end of file +commands: + a: + permission: pcbridge.chat.staff_channel + ban: + permission: pcbridge.ban.ban + banip: + permission: pcbridge.ban.banip + checkban: + permission: pcbridge.ban.check + mute: + permission: pcbridge.chat.mute + pcbridge: + permission: pcbridge.utils + invisframe: + permission: pcbridge.build.invisframe + nv: + permission: pcbridge.build.nightvision + sync: + permission: pcbridge.sync.login + syncother: + permission: pcbridge.sync.other + unban: + permission: pcbridge.ban.ban + unbanip: + permission: pcbridge.ban.banip + unmute: + permission: pcbridge.chat.mute + warp: + permission: pcbridge.warps.teleport + warps: + permission: pcbridge.warps.list + warning: + permission: pcbridge.warning.acknowledge \ No newline at end of file diff --git a/pcbridge-spigot/test/com/projectcitybuild/libs/errorreporting/ErrorReporterTest.kt b/pcbridge-spigot/test/com/projectcitybuild/libs/errorreporting/ErrorReporterTest.kt deleted file mode 100644 index 44b5d48c3..000000000 --- a/pcbridge-spigot/test/com/projectcitybuild/libs/errorreporting/ErrorReporterTest.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.projectcitybuild.libs.errorreporting - -import org.junit.jupiter.api.BeforeEach -import org.junit.jupiter.api.Test -import org.mockito.Mockito.mock -import org.mockito.kotlin.verify - -class ErrorReporterTest { - - private lateinit var output: ErrorOutput - - @BeforeEach - fun setUp() { - output = mock(ErrorOutput::class.java) - } - - @Test - fun `calls start() of registered outputs`() { - val errorReporter = ErrorReporter(outputs = listOf(output)) - errorReporter.start() - - verify(output).start() - } - - @Test - fun `calls report() of registered outputs`() { - val throwable = mock(Throwable::class.java) - val errorReporter = ErrorReporter(outputs = listOf(output)) - errorReporter.report(throwable) - - verify(output).report(throwable) - } -} diff --git a/pcbridge-spigot/test/com/projectcitybuild/libs/nameguesser/NameGuesserTest.kt b/pcbridge-spigot/test/com/projectcitybuild/libs/nameguesser/NameGuesserTest.kt deleted file mode 100644 index 2f4c6b850..000000000 --- a/pcbridge-spigot/test/com/projectcitybuild/libs/nameguesser/NameGuesserTest.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.projectcitybuild.libs.nameguesser - -import org.junit.jupiter.api.Assertions.assertEquals -import org.junit.jupiter.api.Test - -class NameGuesserTest { - - @Test - fun `guessClosest should return exact match first`() { - val nameGuesser = NameGuesser() - val result = nameGuesser.guessClosest( - "te", - listOf( - "test", - "tes", - "te", - "t", - ) - ) - assertEquals("te", result) - } - - @Test - fun `guessClosest should return closest match`() { - val nameGuesser = NameGuesser() - val result = nameGuesser.guessClosest( - "te", - listOf( - "test", - "tes", - "t", - ) - ) - assertEquals("tes", result) - } - - @Test - fun `guessClosest should not return middle-of-string match`() { - val nameGuesser = NameGuesser() - val result = nameGuesser.guessClosest( - "name", - listOf( - "test-name", - "name-test", - "test-test-name", - ) - ) - assertEquals("name-test", result) - } -} diff --git a/pcbridge-spigot/test/com/projectcitybuild/modules/announcements/actions/StartAnnouncementTimerTest.kt b/pcbridge-spigot/test/com/projectcitybuild/modules/announcements/actions/StartAnnouncementTimerTest.kt deleted file mode 100644 index 858176232..000000000 --- a/pcbridge-spigot/test/com/projectcitybuild/modules/announcements/actions/StartAnnouncementTimerTest.kt +++ /dev/null @@ -1,58 +0,0 @@ -package com.projectcitybuild.modules.announcements.actions - -import com.projectcitybuild.entities.ConfigData -import com.projectcitybuild.mock -import com.projectcitybuild.pcbridge.core.contracts.PlatformTimer -import com.projectcitybuild.pcbridge.core.modules.config.Config -import com.projectcitybuild.repositories.ScheduledAnnouncementsRepository -import com.projectcitybuild.support.spigot.SpigotServer -import net.md_5.bungee.api.chat.TextComponent -import org.junit.jupiter.api.Test -import org.mockito.Mockito.mock -import org.mockito.kotlin.* -import java.util.concurrent.TimeUnit - -class StartAnnouncementTimerTest { - @Test - fun `broadcasts messages on a timer`() { - val repository = mock(ScheduledAnnouncementsRepository::class.java) - whenever(repository.getNextAnnouncement()).thenReturn( - "message1", - "message2", - ) - - val config = mock>() - whenever(config.get()).thenReturn( - ConfigData.default.copy( - announcements = ConfigData.default.announcements.copy( - intervalInMins = 5, - ) - ) - ) - - val timer = mock(PlatformTimer::class.java) - val server = mock(SpigotServer::class.java) - - val action = StartAnnouncementTimer( - repository, - config, - timer, - server, - ) - action.start() - - argumentCaptor<() -> Unit>().apply { - verify(timer).scheduleRepeating(any(), eq(0), eq(5), eq(TimeUnit.MINUTES), capture()) - firstValue() - firstValue() - } - - val order = inOrder(server) - order.verify(server).broadcastMessage( - TextComponent("message1") - ) - order.verify(server).broadcastMessage( - TextComponent("message2") - ) - } -} \ No newline at end of file diff --git a/pcbridge-spigot/test/com/projectcitybuild/modules/buildtools/nightvision/commands/NightVisionCommandTest.kt b/pcbridge-spigot/test/com/projectcitybuild/modules/buildtools/nightvision/commands/NightVisionCommandTest.kt deleted file mode 100644 index 118a56a55..000000000 --- a/pcbridge-spigot/test/com/projectcitybuild/modules/buildtools/nightvision/commands/NightVisionCommandTest.kt +++ /dev/null @@ -1,82 +0,0 @@ -package com.projectcitybuild.modules.buildtools.nightvision.commands - -import com.projectcitybuild.support.commandapi.ToggleOption -import kotlinx.coroutines.test.runTest -import org.bukkit.entity.Player -import org.bukkit.potion.PotionEffect -import org.bukkit.potion.PotionEffectType -import org.junit.jupiter.api.BeforeEach -import org.junit.jupiter.api.Test -import org.mockito.Mockito -import org.mockito.kotlin.never -import org.mockito.kotlin.verify -import org.mockito.kotlin.whenever - -class NightVisionCommandTest { - private lateinit var player: Player - - private val potionEffect: PotionEffect - get() { - val duration = Integer.MAX_VALUE - val amplifier = 1 - - return PotionEffect( - PotionEffectType.NIGHT_VISION, - duration, - amplifier, - ) - } - - @BeforeEach - fun setUp() { - player = Mockito.mock(Player::class.java) - - whenever(player.spigot()).thenReturn(Mockito.mock(Player.Spigot::class.java)) - } - - @Test - fun `forces on nightvision when specified`() = runTest { - NightVisionCommand().execute( - player = player, - desiredState = ToggleOption.ON, - ) - verify(player).removePotionEffect(PotionEffectType.NIGHT_VISION) - verify(player).addPotionEffect(potionEffect) - } - - @Test - fun `forces off nightvision when specified`() = runTest { - NightVisionCommand().execute( - player = player, - desiredState = ToggleOption.OFF, - ) - verify(player).removePotionEffect(PotionEffectType.NIGHT_VISION) - verify(player, never()).addPotionEffect(potionEffect) - } - - @Test - fun `toggles on nightvision if no effect`() = runTest { - whenever(player.hasPotionEffect(PotionEffectType.NIGHT_VISION)) - .thenReturn(false) - - NightVisionCommand().execute( - player = player, - desiredState = ToggleOption.UNSPECIFIED, - ) - verify(player).removePotionEffect(PotionEffectType.NIGHT_VISION) - verify(player).addPotionEffect(potionEffect) - } - - @Test - fun `toggles off nightvision if already has effect`() = runTest { - whenever(player.hasPotionEffect(PotionEffectType.NIGHT_VISION)) - .thenReturn(true) - - NightVisionCommand().execute( - player = player, - desiredState = ToggleOption.UNSPECIFIED, - ) - verify(player).removePotionEffect(PotionEffectType.NIGHT_VISION) - verify(player, never()).addPotionEffect(potionEffect) - } -} \ No newline at end of file diff --git a/pcbridge-spigot/test/com/projectcitybuild/modules/chat/commands/BadgeCommandTest.kt b/pcbridge-spigot/test/com/projectcitybuild/modules/chat/commands/BadgeCommandTest.kt deleted file mode 100644 index b346ee9c4..000000000 --- a/pcbridge-spigot/test/com/projectcitybuild/modules/chat/commands/BadgeCommandTest.kt +++ /dev/null @@ -1,108 +0,0 @@ -package com.projectcitybuild.modules.chat.commands - -import com.projectcitybuild.entities.PlayerConfig -import com.projectcitybuild.repositories.PlayerConfigRepository -import com.projectcitybuild.support.commandapi.ToggleOption -import org.bukkit.entity.Player -import org.junit.jupiter.api.Assertions.assertEquals -import org.junit.jupiter.api.BeforeEach -import org.junit.jupiter.api.Test -import org.mockito.Mockito.mock -import org.mockito.kotlin.argumentCaptor -import org.mockito.kotlin.verify -import org.mockito.kotlin.whenever -import java.time.LocalDateTime -import java.util.UUID - -class BadgeCommandTest { - private lateinit var playerConfigRepository: PlayerConfigRepository - private lateinit var player: Player - private lateinit var command: BadgeCommand - - private fun makePlayerConfig(isBadgeOff: Boolean): PlayerConfig { - return PlayerConfig( - id = 123, - uuid = UUID.randomUUID(), - isMuted = false, - isChatBadgeDisabled = isBadgeOff, - firstSeen = LocalDateTime.now(), - ) - } - - @BeforeEach - fun setUp() { - playerConfigRepository = mock(PlayerConfigRepository::class.java) - player = mock(Player::class.java) - command = BadgeCommand(playerConfigRepository) - - whenever(player.spigot()).thenReturn(mock(Player.Spigot::class.java)) - } - - @Test - fun `forces badge off if specified`() { - val initialConfig = makePlayerConfig(isBadgeOff = false) - val uuid = UUID.randomUUID() - whenever(player.uniqueId).thenReturn(uuid) - whenever(playerConfigRepository.get(uuid)).thenReturn(initialConfig) - - command.execute( - commandSender = player, - desiredState = ToggleOption.OFF, - ) - argumentCaptor().apply { - verify(playerConfigRepository).save(capture()) - assertEquals(initialConfig.copy(isChatBadgeDisabled = true), firstValue) - } - } - - @Test - fun `forces badge on if specified`() { - val initialConfig = makePlayerConfig(isBadgeOff = true) - val uuid = UUID.randomUUID() - whenever(player.uniqueId).thenReturn(uuid) - whenever(playerConfigRepository.get(uuid)).thenReturn(initialConfig) - - command.execute( - commandSender = player, - desiredState = ToggleOption.ON, - ) - argumentCaptor().apply { - verify(playerConfigRepository).save(capture()) - assertEquals(initialConfig.copy(isChatBadgeDisabled = false), firstValue) - } - } - - @Test - fun `toggles badge off if unspecified`() { - val initialConfig = makePlayerConfig(isBadgeOff = false) - val uuid = UUID.randomUUID() - whenever(player.uniqueId).thenReturn(uuid) - whenever(playerConfigRepository.get(uuid)).thenReturn(initialConfig) - - command.execute( - commandSender = player, - desiredState = ToggleOption.UNSPECIFIED, - ) - argumentCaptor().apply { - verify(playerConfigRepository).save(capture()) - assertEquals(initialConfig.copy(isChatBadgeDisabled = true), firstValue) - } - } - - @Test - fun `toggles badge on if unspecified`() { - val initialConfig = makePlayerConfig(isBadgeOff = true) - val uuid = UUID.randomUUID() - whenever(player.uniqueId).thenReturn(uuid) - whenever(playerConfigRepository.get(uuid)).thenReturn(initialConfig) - - command.execute( - commandSender = player, - desiredState = ToggleOption.UNSPECIFIED, - ) - argumentCaptor().apply { - verify(playerConfigRepository).save(capture()) - assertEquals(initialConfig.copy(isChatBadgeDisabled = false), firstValue) - } - } -} \ No newline at end of file diff --git a/pcbridge-spigot/test/com/projectcitybuild/modules/chat/listeners/EmojiChatListenerTest.kt b/pcbridge-spigot/test/com/projectcitybuild/modules/chat/listeners/EmojiChatListenerTest.kt deleted file mode 100644 index f304698ba..000000000 --- a/pcbridge-spigot/test/com/projectcitybuild/modules/chat/listeners/EmojiChatListenerTest.kt +++ /dev/null @@ -1,58 +0,0 @@ -package com.projectcitybuild.modules.chat.listeners - -import kotlinx.coroutines.test.runTest -import org.bukkit.entity.Player -import org.bukkit.event.player.AsyncPlayerChatEvent -import org.junit.jupiter.api.Assertions.assertEquals -import org.junit.jupiter.api.Test -import org.mockito.Mockito.mock - -class EmojiChatListenerTest { - - @Test - fun `replaces every supported emoji`() = runTest { - mapOf( - Pair(":skull:", "☠"), - Pair(":heart:", "❤"), - Pair(":fire:", "\uD83D\uDD25"), - Pair(":tm:", "™"), - ).forEach { (original, expected) -> - val async = true - val sender = mock(Player::class.java) - val recipients = emptySet() - - val event = AsyncPlayerChatEvent(async, sender, original, recipients) - EmojiChatListener().handle(event) - - assertEquals(expected, event.message) - } - } - - @Test - fun `replaces supported emojis in all patterns without case sensitivity`() = runTest { - mapOf( - Pair(":SKULL:", "☠"), - Pair(":sKuLl:", "☠"), - Pair(":skull:", "☠"), - Pair(":skull::skull:", "☠☠"), - Pair(":skull:test", "☠test"), - Pair(":skull:test:skull:", "☠test☠"), - Pair(":skull::skull:test:skull:", "☠☠test☠"), - Pair(":skull: :skull: ", "☠ ☠ "), - Pair("skull:", "skull:"), - Pair(":skull", ":skull"), - Pair("skull", "skull"), - Pair(":skull::heart:", "☠❤"), - Pair(":skull: :heart:", "☠ ❤"), - ).forEach { (original, expected) -> - val async = true - val sender = mock(Player::class.java) - val recipients = emptySet() - - val event = AsyncPlayerChatEvent(async, sender, original, recipients) - EmojiChatListener().handle(event) - - assertEquals(expected, event.message) - } - } -} diff --git a/pcbridge-spigot/test/com/projectcitybuild/modules/chat/listeners/SyncBadgesOnJoinListenerTest.kt b/pcbridge-spigot/test/com/projectcitybuild/modules/chat/listeners/SyncBadgesOnJoinListenerTest.kt deleted file mode 100644 index 8268ed900..000000000 --- a/pcbridge-spigot/test/com/projectcitybuild/modules/chat/listeners/SyncBadgesOnJoinListenerTest.kt +++ /dev/null @@ -1,32 +0,0 @@ -package com.projectcitybuild.modules.chat.listeners - -import com.projectcitybuild.entities.events.ConnectionPermittedEvent -import com.projectcitybuild.pcbridge.http.responses.Aggregate -import com.projectcitybuild.pcbridge.http.responses.Badge -import com.projectcitybuild.repositories.ChatBadgeRepository -import kotlinx.coroutines.test.runTest -import org.junit.jupiter.api.Test -import org.mockito.Mockito.mock -import org.mockito.Mockito.verify -import java.util.UUID - -class SyncBadgesOnJoinListenerTest { - - @Test - fun `should set badges for player`() = runTest { - val badges = listOf( - Badge(displayName = "badge1"), - Badge(displayName = "badge2"), - Badge(displayName = "badge3"), - ) - val aggregate = Aggregate(badges = badges) - val uuid = UUID.randomUUID() - val event = ConnectionPermittedEvent(aggregate, uuid) - - val chatBadgeRepository = mock(ChatBadgeRepository::class.java) - - SyncBadgesOnJoinListener(chatBadgeRepository).handle(event) - - verify(chatBadgeRepository).put(uuid, badges) - } -} diff --git a/pcbridge-spigot/test/com/projectcitybuild/modules/joinmessages/listeners/AnnounceJoinListenerTest.kt b/pcbridge-spigot/test/com/projectcitybuild/modules/joinmessages/listeners/AnnounceJoinListenerTest.kt deleted file mode 100644 index e5376b184..000000000 --- a/pcbridge-spigot/test/com/projectcitybuild/modules/joinmessages/listeners/AnnounceJoinListenerTest.kt +++ /dev/null @@ -1,55 +0,0 @@ -package com.projectcitybuild.modules.joinmessages.listeners - -import com.projectcitybuild.entities.ConfigData -import com.projectcitybuild.modules.joinmessages.PlayerJoinTimeCache -import com.projectcitybuild.pcbridge.core.modules.config.Config -import com.projectcitybuild.support.spigot.SpigotServer -import kotlinx.coroutines.test.runTest -import net.md_5.bungee.api.chat.TextComponent -import org.bukkit.entity.Player -import org.bukkit.event.player.PlayerJoinEvent -import org.junit.jupiter.api.BeforeEach -import org.junit.jupiter.api.Test -import org.mockito.Mockito.mock -import org.mockito.Mockito.verify -import org.mockito.kotlin.whenever -import java.util.* - -class AnnounceJoinListenerTest { - private lateinit var player: Player - private lateinit var server: SpigotServer - private lateinit var playerJoinTimeCache: PlayerJoinTimeCache - private lateinit var config: Config - - @BeforeEach - fun setUp() { - player = mock(Player::class.java) - server = mock(SpigotServer::class.java) - playerJoinTimeCache = mock(PlayerJoinTimeCache::class.java) - config = mock() - } - - @Test - fun `broadcasts join message set in config`() = runTest { - whenever(player.name).thenReturn("player_name") - whenever(player.uniqueId).thenReturn(UUID.randomUUID()) - - whenever(config.get()).thenReturn(ConfigData.default.copy( - messages = ConfigData.default.messages.copy( - join = "%name% joined the server", - ), - )) - - val event = PlayerJoinEvent(player, "join message") - AnnounceJoinListener( - server, - config, - playerJoinTimeCache, - ).handle(event) - - verify(server).broadcastMessage( - TextComponent("player_name joined the server") - ) - } -} - diff --git a/pcbridge-spigot/test/com/projectcitybuild/modules/joinmessages/listeners/AnnounceQuitListenerTest.kt b/pcbridge-spigot/test/com/projectcitybuild/modules/joinmessages/listeners/AnnounceQuitListenerTest.kt deleted file mode 100644 index 13b0045cc..000000000 --- a/pcbridge-spigot/test/com/projectcitybuild/modules/joinmessages/listeners/AnnounceQuitListenerTest.kt +++ /dev/null @@ -1,127 +0,0 @@ -package com.projectcitybuild.modules.joinmessages.listeners - -import com.projectcitybuild.entities.ConfigData -import com.projectcitybuild.modules.joinmessages.PlayerJoinTimeCache -import com.projectcitybuild.pcbridge.core.modules.config.Config -import com.projectcitybuild.pcbridge.core.modules.datetime.time.Time -import com.projectcitybuild.support.spigot.SpigotServer -import kotlinx.coroutines.test.runTest -import net.md_5.bungee.api.chat.TextComponent -import org.bukkit.entity.Player -import org.bukkit.event.player.PlayerQuitEvent -import org.junit.jupiter.api.BeforeEach -import org.junit.jupiter.api.Test -import org.mockito.Mockito.mock -import org.mockito.Mockito.verify -import org.mockito.kotlin.whenever -import java.time.LocalDateTime -import java.util.UUID - -class AnnounceQuitListenerTest { - private lateinit var player: Player - private lateinit var server: SpigotServer - private lateinit var playerJoinTimeCache: PlayerJoinTimeCache - private lateinit var config: Config - private lateinit var time: Time - - @BeforeEach - fun setUp() { - player = mock(Player::class.java) - server = mock(SpigotServer::class.java) - playerJoinTimeCache = mock(PlayerJoinTimeCache::class.java) - config = mock() - time = mock(Time::class.java) - } - - @Test - fun `broadcasts quit message set in config`() = runTest { - val uuid = UUID.randomUUID() - val joinTime = LocalDateTime.of(2023, 9, 16, 0, 0) - val now = LocalDateTime.of(2023, 9, 16, 1, 30) - - whenever(time.now()).thenReturn(now) - whenever(player.name).thenReturn("player_name") - whenever(player.uniqueId).thenReturn(uuid) - whenever(playerJoinTimeCache.get(uuid)).thenReturn(joinTime) - whenever(config.get()).thenReturn(ConfigData.default.copy( - messages = ConfigData.default.messages.copy( - leave = "%name% left the server (online for %time_online%)", - ), - )) - - val event = PlayerQuitEvent(player, "quit message") - AnnounceQuitListener( - server, - config, - playerJoinTimeCache, - time, - ).handle(event) - - verify(server).broadcastMessage( - TextComponent("player_name left the server (online for 1 hour)") - ) - } - - - @Test - fun `shows highest time unit for connection time`() = runTest { - listOf( - Pair( - LocalDateTime.of(2023, 9, 17, 2, 0), - "26 hours", - ), - Pair( - LocalDateTime.of(2023, 9, 16, 2, 15), - "2 hours", - ), - Pair( - LocalDateTime.of(2023, 9, 16, 1, 30), - "1 hour", - ), - Pair( - LocalDateTime.of(2023, 9, 16, 0, 30), - "30 mins", - ), - Pair( - LocalDateTime.of(2023, 9, 16, 0, 1), - "1 min", - ), - Pair( - LocalDateTime.of(2023, 9, 16, 0, 0, 30), - "30 secs", - ), - Pair( - LocalDateTime.of(2023, 9, 16, 0, 0, 1), - "1 sec", - ), - ).forEach { pair -> - val now = pair.first - val expectedTime = pair.second - val uuid = UUID.randomUUID() - - val joinTime = LocalDateTime.of(2023, 9, 16, 0, 0) - whenever(time.now()).thenReturn(now) - whenever(player.name).thenReturn("player_name") - whenever(player.uniqueId).thenReturn(uuid) - whenever(playerJoinTimeCache.get(uuid)).thenReturn(joinTime) - whenever(config.get()).thenReturn(ConfigData.default.copy( - messages = ConfigData.default.messages.copy( - leave = "%name% left the server (online for %time_online%)", - ), - )) - - val event = PlayerQuitEvent(player, "quit message") - AnnounceQuitListener( - server, - config, - playerJoinTimeCache, - time, - ).handle(event) - - verify(server).broadcastMessage( - TextComponent("player_name left the server (online for $expectedTime)") - ) - } - } -} - diff --git a/pcbridge-spigot/test/com/projectcitybuild/modules/joinmessages/listeners/FirstTimeJoinListenerTest.kt b/pcbridge-spigot/test/com/projectcitybuild/modules/joinmessages/listeners/FirstTimeJoinListenerTest.kt deleted file mode 100644 index 27ce0686d..000000000 --- a/pcbridge-spigot/test/com/projectcitybuild/modules/joinmessages/listeners/FirstTimeJoinListenerTest.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.projectcitybuild.modules.joinmessages.listeners - -import com.projectcitybuild.entities.ConfigData -import com.projectcitybuild.entities.events.FirstTimeJoinEvent -import com.projectcitybuild.pcbridge.core.contracts.PlatformLogger -import com.projectcitybuild.pcbridge.core.modules.config.Config -import com.projectcitybuild.support.spigot.SpigotServer -import kotlinx.coroutines.test.runTest -import net.md_5.bungee.api.chat.TextComponent -import org.bukkit.entity.Player -import org.junit.jupiter.api.BeforeEach -import org.junit.jupiter.api.Test -import org.mockito.Mockito.mock -import org.mockito.Mockito.verify -import org.mockito.kotlin.whenever - -class FirstTimeJoinListenerTest { - private lateinit var player: Player - private lateinit var server: SpigotServer - private lateinit var config: Config - - @BeforeEach - fun setUp() { - player = mock(Player::class.java) - server = mock(SpigotServer::class.java) - config = mock() - } - - @Test - fun `broadcasts first time join message set in config`() = runTest { - whenever(player.name).thenReturn("player_name") - whenever(config.get()).thenReturn(ConfigData.default.copy( - messages = ConfigData.default.messages.copy( - firstTimeJoin = "Welcome %name% to the server", - ), - )) - - val event = FirstTimeJoinEvent(player) - FirstTimeJoinListener( - server, - config, - mock(PlatformLogger::class.java), - ).handle(event) - - verify(server).broadcastMessage( - TextComponent("Welcome player_name to the server") - ) - } -} - diff --git a/pcbridge-spigot/test/com/projectcitybuild/modules/joinmessages/listeners/ServerOverviewJoinListenerTest.kt b/pcbridge-spigot/test/com/projectcitybuild/modules/joinmessages/listeners/ServerOverviewJoinListenerTest.kt deleted file mode 100644 index 290214969..000000000 --- a/pcbridge-spigot/test/com/projectcitybuild/modules/joinmessages/listeners/ServerOverviewJoinListenerTest.kt +++ /dev/null @@ -1,46 +0,0 @@ -package com.projectcitybuild.modules.joinmessages.listeners - -import com.projectcitybuild.entities.ConfigData -import com.projectcitybuild.pcbridge.core.modules.config.Config -import kotlinx.coroutines.test.runTest -import net.md_5.bungee.api.chat.TextComponent -import org.bukkit.entity.Player -import org.bukkit.event.player.PlayerJoinEvent -import org.junit.jupiter.api.BeforeEach -import org.junit.jupiter.api.Test -import org.mockito.Mockito.mock -import org.mockito.Mockito.verify -import org.mockito.kotlin.whenever - -class ServerOverviewJoinListenerTest { - private lateinit var player: Player - private lateinit var spigotPlayer: Player.Spigot - private lateinit var config: Config - - @BeforeEach - fun setUp() { - player = mock(Player::class.java) - spigotPlayer = mock(Player.Spigot::class.java) - config = mock() - - whenever(player.spigot()).thenReturn(spigotPlayer) - } - - @Test - fun `sends welcome message set in config`() = runTest { - val welcomeMessage = "welcome message" - whenever(config.get()).thenReturn(ConfigData.default.copy( - messages = ConfigData.default.messages.copy( - welcome = welcomeMessage, - ), - )) - - val event = PlayerJoinEvent(player, "join message") - ServerOverviewJoinListener(config).handle(event) - - verify(player.spigot()).sendMessage( - TextComponent(welcomeMessage) - ) - } -} - diff --git a/pcbridge-spigot/test/com/projectcitybuild/modules/moderation/bans/actions/AuthoriseConnectionTest.kt b/pcbridge-spigot/test/com/projectcitybuild/modules/moderation/bans/actions/AuthoriseConnectionTest.kt deleted file mode 100644 index 2c866b60e..000000000 --- a/pcbridge-spigot/test/com/projectcitybuild/modules/moderation/bans/actions/AuthoriseConnectionTest.kt +++ /dev/null @@ -1,89 +0,0 @@ -package com.projectcitybuild.modules.moderation.bans.actions - -import com.projectcitybuild.modules.moderation.bans.actions.AuthoriseConnection -import com.projectcitybuild.pcbridge.http.responses.Aggregate -import com.projectcitybuild.pcbridge.http.responses.IPBan -import com.projectcitybuild.pcbridge.http.responses.PlayerBan -import kotlinx.coroutines.test.runTest -import org.junit.jupiter.api.Assertions.assertEquals -import org.junit.jupiter.api.BeforeEach -import org.junit.jupiter.api.Test -import java.time.LocalDate -import java.time.ZoneId - -class AuthoriseConnectionTest { - - private lateinit var useCase: AuthoriseConnection - - @BeforeEach - fun setUp() { - useCase = AuthoriseConnection() - } - - @Test - fun `should deny if player is banned`() = runTest { - val ban = PlayerBan() - val result = useCase.execute( - Aggregate(playerBan = ban) - ) - assertEquals( - AuthoriseConnection.ConnectResult.Denied( - AuthoriseConnection.Ban.UUID(ban) - ), - result, - ) - } - - @Test - fun `should not deny if player ban is inactive`() = runTest { - val ban = PlayerBan( - unbannedAt = LocalDate.now().atStartOfDay(ZoneId.systemDefault()).toEpochSecond() - ) - val result = useCase.execute( - Aggregate(playerBan = ban) - ) - assertEquals( - AuthoriseConnection.ConnectResult.Allowed, - result, - ) - } - - @Test - fun `should deny if IP is banned`() = runTest { - val ban = IPBan() - val result = useCase.execute( - Aggregate(ipBan = ban) - ) - assertEquals( - AuthoriseConnection.ConnectResult.Denied( - AuthoriseConnection.Ban.IP(ban) - ), - result, - ) - } - - @Test - fun `should not deny if IP ban is inactive`() = runTest { - val ban = IPBan( - unbannedAt = LocalDate.now().atStartOfDay(ZoneId.systemDefault()).toEpochSecond() - ) - val result = useCase.execute( - Aggregate(ipBan = ban) - ) - assertEquals( - AuthoriseConnection.ConnectResult.Allowed, - result, - ) - } - - @Test - fun `should allow if not banned`() = runTest { - val result = useCase.execute( - Aggregate(playerBan = null, ipBan = null) - ) - assertEquals( - AuthoriseConnection.ConnectResult.Allowed, - result, - ) - } -} diff --git a/pcbridge-spigot/test/com/projectcitybuild/modules/moderation/bans/actions/BanIPTest.kt b/pcbridge-spigot/test/com/projectcitybuild/modules/moderation/bans/actions/BanIPTest.kt deleted file mode 100644 index 703e74537..000000000 --- a/pcbridge-spigot/test/com/projectcitybuild/modules/moderation/bans/actions/BanIPTest.kt +++ /dev/null @@ -1,112 +0,0 @@ -package com.projectcitybuild.modules.moderation.bans.actions - -import com.projectcitybuild.pcbridge.core.utils.Failure -import com.projectcitybuild.pcbridge.core.utils.Success -import com.projectcitybuild.pcbridge.http.services.pcb.IPBanHttpService -import com.projectcitybuild.repositories.IPBanRepository -import com.projectcitybuild.support.spigot.SpigotServer -import kotlinx.coroutines.test.runTest -import org.junit.jupiter.api.Assertions.assertEquals -import org.junit.jupiter.api.BeforeEach -import org.junit.jupiter.api.Test -import org.mockito.ArgumentMatchers.anyString -import org.mockito.Mockito.mock -import org.mockito.Mockito.verify -import org.mockito.kotlin.any -import org.mockito.kotlin.eq -import org.mockito.kotlin.whenever -import java.util.UUID - -class BanIPTest { - - private lateinit var useCase: BanIP - private lateinit var ipBanRepository: IPBanRepository - private lateinit var server: SpigotServer - - @BeforeEach - fun setUp() { - ipBanRepository = mock(IPBanRepository::class.java) - server = mock(SpigotServer::class.java) - - useCase = BanIP( - ipBanRepository, - server, - ) - } - - @Test - fun `should fail if IP is already banned`() = runTest { - val ip = "127.0.0.1" - - whenever(ipBanRepository.ban(eq(ip), any(), any(), any())) - .thenThrow(IPBanHttpService.IPAlreadyBannedException::class.java) - - val result = useCase.execute( - ip = ip, - bannerUUID = UUID.randomUUID(), - bannerName = "name", - reason = "reason", - ) - - assertEquals(Failure(BanIP.FailureReason.IP_ALREADY_BANNED), result) - } - - @Test - fun `should fail if IP is invalid`() = runTest { - arrayOf( - "text", - "1234", - ).forEach { invalidIP -> - val result = useCase.execute( - ip = invalidIP, - bannerUUID = UUID.randomUUID(), - bannerName = "name", - reason = "reason", - ) - assertEquals(Failure(BanIP.FailureReason.INVALID_IP), result) - } - } - - @Test - fun `should ban valid IP`() = runTest { - val ips = arrayOf( - "127.0.0.1", - "/127.0.0.1:1234", // This should get sanitized - ) - ips.forEach { ip -> - val uuid = UUID.randomUUID() - val result = useCase.execute( - ip = ip, - bannerUUID = uuid, - bannerName = "name", - reason = "reason", - ) - verify(ipBanRepository).ban( - ip = "127.0.0.1", - bannerUUID = uuid, - bannerName = "name", - reason = "reason", - ) - assertEquals(Success(Unit), result) - } - } - - @Test - fun `should kick player if online`() = runTest { - val ip = "127.0.0.1" - - val result = useCase.execute( - ip = ip, - bannerUUID = UUID.randomUUID(), - bannerName = "name", - reason = "reason", - ) - - verify(server).kickByIP( - eq(ip), - anyString(), - eq(SpigotServer.KickContext.FATAL), - ) - assertEquals(Success(Unit), result) - } -} diff --git a/pcbridge-spigot/test/com/projectcitybuild/modules/moderation/bans/actions/BanUUIDTest.kt b/pcbridge-spigot/test/com/projectcitybuild/modules/moderation/bans/actions/BanUUIDTest.kt deleted file mode 100644 index 00057da55..000000000 --- a/pcbridge-spigot/test/com/projectcitybuild/modules/moderation/bans/actions/BanUUIDTest.kt +++ /dev/null @@ -1,108 +0,0 @@ -package com.projectcitybuild.modules.moderation.bans.actions - -import com.projectcitybuild.pcbridge.core.utils.Failure -import com.projectcitybuild.pcbridge.http.services.pcb.UUIDBanHttpService -import com.projectcitybuild.repositories.PlayerBanRepository -import com.projectcitybuild.repositories.PlayerUUIDRepository -import com.projectcitybuild.support.spigot.SpigotServer -import kotlinx.coroutines.test.runTest -import org.junit.jupiter.api.Assertions.assertEquals -import org.junit.jupiter.api.BeforeEach -import org.junit.jupiter.api.Test -import org.mockito.ArgumentMatchers.anyString -import org.mockito.Mockito.mock -import org.mockito.Mockito.times -import org.mockito.Mockito.verify -import org.mockito.kotlin.any -import org.mockito.kotlin.eq -import org.mockito.kotlin.whenever -import java.util.UUID - -class BanUUIDTest { - - private lateinit var useCase: BanUUID - - private lateinit var playerBanRepository: PlayerBanRepository - private lateinit var playerUUIDRepository: PlayerUUIDRepository - private lateinit var server: SpigotServer - - @BeforeEach - fun setUp() { - playerBanRepository = mock(PlayerBanRepository::class.java) - playerUUIDRepository = mock(PlayerUUIDRepository::class.java) - server = mock(SpigotServer::class.java) - - useCase = BanUUID( - playerBanRepository, - playerUUIDRepository, - server, - ) - } - - @Test - fun `ban should fail when player doesn't exist`() = runTest { - val playerName = "banned_player" - - whenever(playerUUIDRepository.get(playerName)).thenReturn(null) - - val result = useCase.ban(playerName, null, "staff_player", null) - - assertEquals(result, Failure(BanUUID.FailureReason.PlayerDoesNotExist)) - } - - @Test - fun `ban should fail when player is already banned`() = runTest { - val playerName = "banned_player" - val playerUUID = UUID.randomUUID() - val staffName = "staff_player" - val staffUUID = UUID.randomUUID() - - whenever(playerUUIDRepository.get(playerName)).thenReturn(playerUUID) - whenever(playerBanRepository.ban(playerUUID, playerName, staffUUID, staffName, null)) - .thenThrow(UUIDBanHttpService.UUIDAlreadyBannedException()) - - val result = useCase.ban(playerName, staffUUID, staffName, null) - - assertEquals(result, Failure(BanUUID.FailureReason.PlayerAlreadyBanned)) - } - - @Test - fun `ban should pass input to ban repository`() = runTest { - val playerName = "banned_player" - val playerUUID = UUID.randomUUID() - val staffUUID = UUID.randomUUID() - val staffName = "staff_player" - val reason = "reason" - - whenever(playerUUIDRepository.get(playerName)).thenReturn(playerUUID) - - useCase.ban(playerName, staffUUID, "staff_player", reason) - - verify(playerBanRepository, times(1)) - .ban(playerUUID, playerName, staffUUID, staffName, reason) - } - - @Test - fun `ban should be broadcasted to all online players`() = runTest { - val playerName = "banned_player" - - whenever(playerUUIDRepository.get(playerName)).thenReturn(UUID.randomUUID()) - - useCase.ban(playerName, UUID.randomUUID(), "staff_player", "reason") - - verify(server).broadcastMessage(any()) - } - - @Test - fun `ban should kick the online player`() = runTest { - val playerName = "banned_player" - val playerUUID = UUID.randomUUID() - - whenever(playerUUIDRepository.get(playerName)).thenReturn(playerUUID) - - useCase.ban(playerName, UUID.randomUUID(), "staff_player", "reason") - - verify(server, times(1)) - .kickByUUID(eq(playerUUID), anyString(), eq(SpigotServer.KickContext.FATAL)) - } -} diff --git a/pcbridge-spigot/test/com/projectcitybuild/modules/moderation/bans/actions/CheckBanUUIDTest.kt b/pcbridge-spigot/test/com/projectcitybuild/modules/moderation/bans/actions/CheckBanUUIDTest.kt deleted file mode 100644 index bc798ad20..000000000 --- a/pcbridge-spigot/test/com/projectcitybuild/modules/moderation/bans/actions/CheckBanUUIDTest.kt +++ /dev/null @@ -1,116 +0,0 @@ -package com.projectcitybuild.modules.moderation.bans.actions - -import com.projectcitybuild.pcbridge.core.modules.datetime.formatter.DateTimeFormatterImpl -import com.projectcitybuild.pcbridge.core.utils.Failure -import com.projectcitybuild.pcbridge.core.utils.Success -import com.projectcitybuild.pcbridge.http.responses.PlayerBan -import com.projectcitybuild.repositories.PlayerBanRepository -import com.projectcitybuild.repositories.PlayerUUIDRepository -import kotlinx.coroutines.test.runTest -import org.junit.jupiter.api.Assertions.assertEquals -import org.junit.jupiter.api.BeforeEach -import org.junit.jupiter.api.Test -import org.mockito.Mockito.mock -import org.mockito.kotlin.whenever -import java.time.ZoneId -import java.util.Locale -import java.util.UUID - -class CheckBanUUIDTest { - - private lateinit var useCase: CheckUUIDBan - - private lateinit var playerBanRepository: PlayerBanRepository - private lateinit var playerUUIDRepository: PlayerUUIDRepository - - @BeforeEach - fun setUp() { - playerBanRepository = mock(PlayerBanRepository::class.java) - playerUUIDRepository = mock(PlayerUUIDRepository::class.java) - - useCase = CheckUUIDBan( - playerBanRepository, - playerUUIDRepository, - DateTimeFormatterImpl.mock(), - ) - } - - @Test - fun `getBan should fail when player doesn't exist`() = runTest { - val playerName = "banned_player" - - whenever(playerUUIDRepository.get(playerName)).thenReturn(null) - - val result = useCase.getBan(playerName) - - assertEquals(result, Failure(CheckUUIDBan.FailureReason.PLAYER_DOES_NOT_EXIST)) - } - - @Test - fun `getBan should return a ban record with no expiry date`() = runTest { - val playerName = "banned_player" - val playerUUID = UUID.randomUUID() - val staffUUID = UUID.randomUUID() - - whenever(playerUUIDRepository.get(playerName)).thenReturn(playerUUID) - whenever(playerBanRepository.get(playerUUID)).thenReturn( - PlayerBan( - id = 1, - serverId = 2, - bannedPlayerId = playerUUID.toString(), - bannedPlayerAlias = playerName, - bannerPlayerId = staffUUID.toString(), - reason = "griefing", - expiresAt = null, - createdAt = 1642953972, - updatedAt = 1642953972, - unbannedAt = null, - unbannerPlayerId = null, - unbanType = null, - ) - ) - - val result = useCase.getBan(playerName) - val expected = CheckUUIDBan.BanRecord( - reason = "griefing", - dateOfBan = "Jan 23, 2022, 4:06:12 PM", - expiryDate = "Never" - ) - - assertEquals(Success(expected), result) - } - - @Test - fun `getBan should return a ban record with an expiry date`() = runTest { - val playerName = "banned_player" - val playerUUID = UUID.randomUUID() - val staffUUID = UUID.randomUUID() - - whenever(playerUUIDRepository.get(playerName)).thenReturn(playerUUID) - whenever(playerBanRepository.get(playerUUID)).thenReturn( - PlayerBan( - id = 1, - serverId = 2, - bannedPlayerId = playerUUID.toString(), - bannedPlayerAlias = playerName, - bannerPlayerId = staffUUID.toString(), - reason = "griefing", - expiresAt = 1643108765, - createdAt = 1642953972, - updatedAt = 1642953972, - unbannedAt = null, - unbannerPlayerId = null, - unbanType = null, - ) - ) - - val result = useCase.getBan(playerName) - val expected = CheckUUIDBan.BanRecord( - reason = "griefing", - dateOfBan = "Jan 23, 2022, 4:06:12 PM", - expiryDate = "Jan 25, 2022, 11:06:05 AM" - ) - - assertEquals(Success(expected), result) - } -} diff --git a/pcbridge-spigot/test/com/projectcitybuild/modules/moderation/bans/actions/UnbanIPTest.kt b/pcbridge-spigot/test/com/projectcitybuild/modules/moderation/bans/actions/UnbanIPTest.kt deleted file mode 100644 index aa37a5afe..000000000 --- a/pcbridge-spigot/test/com/projectcitybuild/modules/moderation/bans/actions/UnbanIPTest.kt +++ /dev/null @@ -1,80 +0,0 @@ -package com.projectcitybuild.modules.moderation.bans.actions - -import com.projectcitybuild.pcbridge.core.utils.Failure -import com.projectcitybuild.pcbridge.core.utils.Success -import com.projectcitybuild.pcbridge.http.services.pcb.IPBanHttpService -import com.projectcitybuild.repositories.IPBanRepository -import kotlinx.coroutines.test.runTest -import org.junit.jupiter.api.Assertions.assertEquals -import org.junit.jupiter.api.BeforeEach -import org.junit.jupiter.api.Test -import org.mockito.Mockito.mock -import org.mockito.Mockito.verify -import org.mockito.kotlin.any -import org.mockito.kotlin.eq -import org.mockito.kotlin.whenever -import java.util.UUID - -class UnbanIPTest { - - private lateinit var useCase: UnbanIP - private lateinit var ipBanRepository: IPBanRepository - - @BeforeEach - fun setUp() { - ipBanRepository = mock(IPBanRepository::class.java) - useCase = UnbanIP(ipBanRepository) - } - - @Test - fun `should fail if IP is not banned`() = runTest { - val ip = "127.0.0.1" - - whenever(ipBanRepository.unban(eq(ip), any(), any())) - .thenThrow(IPBanHttpService.IPNotBannedException::class.java) - - val result = useCase.execute( - ip = ip, - unbannerUUID = UUID.randomUUID(), - unbannerName = "name", - ) - assertEquals(Failure(UnbanIP.FailureReason.IP_NOT_BANNED), result) - } - - @Test - fun `should fail if IP is invalid`() = runTest { - arrayOf( - "text", - "1234", - ).forEach { invalidIP -> - val result = useCase.execute( - ip = invalidIP, - unbannerUUID = UUID.randomUUID(), - unbannerName = "name", - ) - assertEquals(Failure(UnbanIP.FailureReason.INVALID_IP), result) - } - } - - @Test - fun `should unban valid IP`() = runTest { - val uuid = UUID.randomUUID() - val ips = arrayOf( - "127.0.0.1", - "/127.0.0.1:1234", // This should get sanitized - ) - ips.forEach { ip -> - val result = useCase.execute( - ip = ip, - unbannerUUID = uuid, - unbannerName = "name", - ) - verify(ipBanRepository).unban( - ip = "127.0.0.1", - unbannerUUID = uuid, - unbannerName = "name", - ) - assertEquals(Success(Unit), result) - } - } -} diff --git a/pcbridge-spigot/test/com/projectcitybuild/modules/moderation/bans/actions/UnbanUUIDTest.kt b/pcbridge-spigot/test/com/projectcitybuild/modules/moderation/bans/actions/UnbanUUIDTest.kt deleted file mode 100644 index c07ecb7ff..000000000 --- a/pcbridge-spigot/test/com/projectcitybuild/modules/moderation/bans/actions/UnbanUUIDTest.kt +++ /dev/null @@ -1,90 +0,0 @@ -package com.projectcitybuild.modules.moderation.bans.actions - -import com.projectcitybuild.pcbridge.core.utils.Failure -import com.projectcitybuild.pcbridge.http.services.pcb.UUIDBanHttpService -import com.projectcitybuild.repositories.PlayerBanRepository -import com.projectcitybuild.repositories.PlayerUUIDRepository -import kotlinx.coroutines.test.runTest -import org.bukkit.Server -import org.junit.jupiter.api.Assertions.assertEquals -import org.junit.jupiter.api.BeforeEach -import org.junit.jupiter.api.Test -import org.mockito.Mockito.mock -import org.mockito.Mockito.times -import org.mockito.Mockito.verify -import org.mockito.kotlin.any -import org.mockito.kotlin.whenever -import java.util.UUID - -class UnbanUUIDTest { - - private lateinit var useCase: UnbanUUID - - private lateinit var playerBanRepository: PlayerBanRepository - private lateinit var playerUUIDRepository: PlayerUUIDRepository - private lateinit var server: Server - - @BeforeEach - fun setUp() { - playerBanRepository = mock(PlayerBanRepository::class.java) - playerUUIDRepository = mock(PlayerUUIDRepository::class.java) - server = mock(Server::class.java) - - useCase = UnbanUUID( - playerBanRepository, - playerUUIDRepository, - server, - ) - } - - @Test - fun `unban should fail when player doesn't exist`() = runTest { - val playerName = "banned_player" - - whenever(playerUUIDRepository.get(playerName)).thenReturn(null) - - val result = useCase.unban(playerName, null) - - assertEquals(result, Failure(UnbanUUID.FailureReason.PlayerDoesNotExist)) - } - - @Test - fun `unban should fail when player is not banned`() = runTest { - val playerName = "banned_player" - val playerUUID = UUID.randomUUID() - val staffUUID = UUID.randomUUID() - - whenever(playerUUIDRepository.get(playerName)).thenReturn(playerUUID) - whenever(playerBanRepository.unban(playerUUID, staffUUID)) - .thenThrow(UUIDBanHttpService.UUIDNotBannedException()) - - val result = useCase.unban(playerName, staffUUID) - - assertEquals(result, Failure(UnbanUUID.FailureReason.PlayerNotBanned)) - } - - @Test - fun `unban should pass input to ban repository`() = runTest { - val playerName = "banned_player" - val playerUUID = UUID.randomUUID() - val staffUUID = UUID.randomUUID() - - whenever(playerUUIDRepository.get(playerName)).thenReturn(playerUUID) - - useCase.unban(playerName, staffUUID) - - verify(playerBanRepository, times(1)) - .unban(playerUUID, staffUUID) - } - - @Test - fun `unban should be broadcasted to all online players`() = runTest { - val playerName = "banned_player" - - whenever(playerUUIDRepository.get(playerName)).thenReturn(UUID.randomUUID()) - - useCase.unban(playerName, UUID.randomUUID()) - - verify(server).broadcastMessage(any()) - } -} diff --git a/pcbridge-spigot/test/com/projectcitybuild/modules/moderation/mute/actions/MutePlayerTest.kt b/pcbridge-spigot/test/com/projectcitybuild/modules/moderation/mute/actions/MutePlayerTest.kt deleted file mode 100644 index b7a253aab..000000000 --- a/pcbridge-spigot/test/com/projectcitybuild/modules/moderation/mute/actions/MutePlayerTest.kt +++ /dev/null @@ -1,63 +0,0 @@ -package com.projectcitybuild.modules.moderation.mute.actions - -import com.projectcitybuild.entities.PlayerConfig -import com.projectcitybuild.modules.moderation.mutes.actions.MutePlayer -import com.projectcitybuild.repositories.PlayerConfigRepository -import org.junit.jupiter.api.Assertions.assertEquals -import org.junit.jupiter.api.BeforeEach -import org.junit.jupiter.api.Test -import org.mockito.Mockito.mock -import org.mockito.kotlin.argumentCaptor -import org.mockito.kotlin.verify -import org.mockito.kotlin.whenever -import java.time.LocalDateTime -import java.util.UUID - -class MutePlayerTest { - private lateinit var playerConfigRepository: PlayerConfigRepository - - @BeforeEach - fun setUp() { - playerConfigRepository = mock(PlayerConfigRepository::class.java) - } - - @Test - fun `sets the given player's config to muted`() { - val uuid = UUID.randomUUID() - val config = PlayerConfig( - id = 123, - uuid = uuid, - isMuted = false, - isChatBadgeDisabled = false, - firstSeen = LocalDateTime.now(), - ) - whenever(playerConfigRepository.get(uuid)).thenReturn(config) - - MutePlayer(playerConfigRepository).execute(uuid, shouldMute = true) - - argumentCaptor().apply { - verify(playerConfigRepository).save(capture()) - assertEquals(config.copy(isMuted = true), firstValue) - } - } - - @Test - fun `sets the given player's config to unmuted`() { - val uuid = UUID.randomUUID() - val config = PlayerConfig( - id = 123, - uuid = uuid, - isMuted = true, - isChatBadgeDisabled = false, - firstSeen = LocalDateTime.now(), - ) - whenever(playerConfigRepository.get(uuid)).thenReturn(config) - - MutePlayer(playerConfigRepository).execute(uuid, shouldMute = false) - - argumentCaptor().apply { - verify(playerConfigRepository).save(capture()) - assertEquals(config.copy(isMuted = false), firstValue) - } - } -} \ No newline at end of file diff --git a/pcbridge-spigot/test/com/projectcitybuild/modules/moderation/staffchat/commands/ACommandTest.kt b/pcbridge-spigot/test/com/projectcitybuild/modules/moderation/staffchat/commands/ACommandTest.kt deleted file mode 100644 index b20bf8ead..000000000 --- a/pcbridge-spigot/test/com/projectcitybuild/modules/moderation/staffchat/commands/ACommandTest.kt +++ /dev/null @@ -1,48 +0,0 @@ -package com.projectcitybuild.modules.moderation.staffchat.commands - -import com.projectcitybuild.entities.Permissions -import net.md_5.bungee.api.chat.TextComponent -import org.bukkit.Server -import org.bukkit.entity.Player -import org.junit.jupiter.api.Assertions.assertTrue -import org.junit.jupiter.api.BeforeEach -import org.junit.jupiter.api.Test -import org.mockito.Mockito.mock -import org.mockito.kotlin.argumentCaptor -import org.mockito.kotlin.verify -import org.mockito.kotlin.verifyNoInteractions -import org.mockito.kotlin.whenever - -class ACommandTest { - private lateinit var server: Server - - @BeforeEach - fun setUp() { - server = mock(Server::class.java) - } - - @Test - fun `only players with permission receive staff messages`() { - val regularPlayerChat = mock(Player.Spigot::class.java) - val regularPlayer = mock(Player::class.java).also { - whenever(it.hasPermission(Permissions.COMMAND_STAFF_CHAT)).thenReturn(false) - whenever(it.spigot()).thenReturn(regularPlayerChat) - } - val staffPlayerChat = mock(Player.Spigot::class.java) - val staffPlayer = mock(Player::class.java).also { - whenever(it.hasPermission(Permissions.COMMAND_STAFF_CHAT)).thenReturn(true) - whenever(it.spigot()).thenReturn(staffPlayerChat) - } - whenever(server.onlinePlayers).thenReturn(listOf(regularPlayer, staffPlayer)) - - val message = "test message" - val sender = mock(Player::class.java) - ACommand(server).execute(sender, message) - - argumentCaptor().apply { - verify(staffPlayerChat).sendMessage(capture()) - assertTrue(firstValue.toString().contains(message)) - } - verifyNoInteractions(regularPlayerChat) - } -} \ No newline at end of file diff --git a/pcbridge-spigot/test/com/projectcitybuild/modules/pluginutils/listeners/CheckBanOnConnectListenerTest.kt b/pcbridge-spigot/test/com/projectcitybuild/modules/pluginutils/listeners/CheckBanOnConnectListenerTest.kt deleted file mode 100644 index 719b28c8a..000000000 --- a/pcbridge-spigot/test/com/projectcitybuild/modules/pluginutils/listeners/CheckBanOnConnectListenerTest.kt +++ /dev/null @@ -1,135 +0,0 @@ -package com.projectcitybuild.modules.pluginutils.listeners - -import com.projectcitybuild.entities.events.ConnectionPermittedEvent -import com.projectcitybuild.libs.errorreporting.ErrorReporter -import com.projectcitybuild.modules.moderation.bans.actions.AuthoriseConnection -import com.projectcitybuild.modules.moderation.bans.listeners.CheckBanOnConnectListener -import com.projectcitybuild.pcbridge.core.contracts.PlatformLogger -import com.projectcitybuild.pcbridge.core.modules.datetime.formatter.DateTimeFormatterImpl -import com.projectcitybuild.pcbridge.http.responses.Aggregate -import com.projectcitybuild.pcbridge.http.responses.IPBan -import com.projectcitybuild.pcbridge.http.responses.PlayerBan -import com.projectcitybuild.repositories.AggregateRepository -import com.projectcitybuild.support.spigot.eventbroadcast.LocalEventBroadcaster -import kotlinx.coroutines.test.runTest -import org.bukkit.event.player.AsyncPlayerPreLoginEvent -import org.junit.jupiter.api.Assertions.assertEquals -import org.junit.jupiter.api.BeforeEach -import org.junit.jupiter.api.Test -import org.mockito.ArgumentMatchers.any -import org.mockito.ArgumentMatchers.anyString -import org.mockito.ArgumentMatchers.eq -import org.mockito.Mockito.mock -import org.mockito.Mockito.never -import org.mockito.Mockito.verify -import org.mockito.kotlin.argumentCaptor -import org.mockito.kotlin.whenever -import java.net.InetAddress -import java.util.UUID - -class CheckBanOnConnectListenerTest { - private lateinit var aggregateRepository: AggregateRepository - private lateinit var authoriseConnection: AuthoriseConnection - private lateinit var localEventBroadcaster: LocalEventBroadcaster - private lateinit var errorReporter: ErrorReporter - private lateinit var listener: CheckBanOnConnectListener - - @BeforeEach - fun setUp() { - aggregateRepository = mock(AggregateRepository::class.java) - authoriseConnection = mock(AuthoriseConnection::class.java) - localEventBroadcaster = mock(LocalEventBroadcaster::class.java) - errorReporter = mock(ErrorReporter::class.java) - - listener = CheckBanOnConnectListener( - aggregateRepository, - authoriseConnection, - mock(PlatformLogger::class.java), - DateTimeFormatterImpl.mock(), - errorReporter, - localEventBroadcaster, - ) - } - - private fun loginEvent(uuid: UUID, ip: String = "127.0.0.1"): AsyncPlayerPreLoginEvent { - val socketAddress = mock(InetAddress::class.java).also { - whenever(it.toString()).thenReturn(ip) - } - return mock(AsyncPlayerPreLoginEvent::class.java).also { - whenever(it.address).thenReturn(socketAddress) - whenever(it.uniqueId).thenReturn(uuid) - } - } - - @Test - fun `cancels login event if player is banned`() = runTest { - arrayOf( - AuthoriseConnection.Ban.UUID(PlayerBan()), - AuthoriseConnection.Ban.IP(IPBan()), - ).forEach { ban -> - val uuid = UUID.randomUUID() - val ip = "127.0.0.1" - val event = loginEvent(uuid, ip) - - whenever(aggregateRepository.get(uuid, ip)) - .thenReturn(Aggregate()) - - whenever(authoriseConnection.execute(Aggregate())) - .thenReturn(AuthoriseConnection.ConnectResult.Denied(ban)) - - listener.handle(event) - - verify(event).disallow(eq(AsyncPlayerPreLoginEvent.Result.KICK_BANNED), anyString()) - } - } - - @Test - fun `does not cancel login event if player is not banned`() = runTest { - val uuid = UUID.randomUUID() - val ip = "127.0.0.1" - val event = loginEvent(uuid, ip) - - whenever(aggregateRepository.get(uuid, ip)) - .thenReturn(Aggregate()) - - whenever(authoriseConnection.execute(Aggregate())) - .thenReturn(null) - - listener.handle(event) - - verify(event, never()).disallow(any(AsyncPlayerPreLoginEvent.Result::class.java), any()) - } - - @Test - fun `cancels login event if cannot fetch ban`() = runTest { - val uuid = UUID.randomUUID() - val ip = "127.0.0.1" - val event = loginEvent(uuid, ip) - - whenever(aggregateRepository.get(uuid, ip)) - .thenThrow(Exception::class.java) - - listener.handle(event) - - verify(event).disallow(eq(AsyncPlayerPreLoginEvent.Result.KICK_OTHER), anyString()) - } - - @Test - fun `emits ConnectionPermittedEvent if not banned`() = runTest { - val uuid = UUID.randomUUID() - val ip = "127.0.0.1" - val event = loginEvent(uuid, ip) - val aggregate = Aggregate() - - whenever(aggregateRepository.get(uuid, ip)) - .thenReturn(aggregate) - - listener.handle(event) - - argumentCaptor().apply { - verify(localEventBroadcaster).emit(capture()) - assertEquals(aggregate, firstValue.aggregate) - assertEquals(uuid, firstValue.playerUUID) - } - } -} diff --git a/pcbridge-spigot/test/com/projectcitybuild/modules/ranksync/actions/GenerateAccountVerificationURLTest.kt b/pcbridge-spigot/test/com/projectcitybuild/modules/ranksync/actions/GenerateAccountVerificationURLTest.kt deleted file mode 100644 index f640e4697..000000000 --- a/pcbridge-spigot/test/com/projectcitybuild/modules/ranksync/actions/GenerateAccountVerificationURLTest.kt +++ /dev/null @@ -1,78 +0,0 @@ -package com.projectcitybuild.modules.ranksync.actions - -import com.projectcitybuild.pcbridge.core.utils.Failure -import com.projectcitybuild.pcbridge.core.utils.Success -import com.projectcitybuild.pcbridge.http.services.pcb.AccountLinkHTTPService -import com.projectcitybuild.repositories.VerificationURLRepository -import kotlinx.coroutines.test.runTest -import org.junit.jupiter.api.Assertions.assertEquals -import org.junit.jupiter.api.BeforeEach -import org.junit.jupiter.api.Test -import org.mockito.Mockito.mock -import org.mockito.kotlin.whenever -import java.util.UUID - -class GenerateAccountVerificationURLTest { - - private lateinit var verificationURLRepository: VerificationURLRepository - private lateinit var useCase: GenerateAccountVerificationURL - - @BeforeEach - fun setUp() { - verificationURLRepository = mock(VerificationURLRepository::class.java) - - useCase = GenerateAccountVerificationURL( - verificationURLRepository, - ) - } - - @Test - fun `should return verification URL if available`() = runTest { - val playerUUID = UUID.randomUUID() - val url = "https://pcbmc.co" - - whenever(verificationURLRepository.generateVerificationURL(playerUUID)) - .thenReturn(url) - - val result = useCase.generate(playerUUID) - - val expectedURL = GenerateAccountVerificationURL.VerificationURL(url) - assertEquals(result, Success(expectedURL)) - } - - @Test - fun `should return failure if verification URL is null`() = runTest { - val playerUUID = UUID.randomUUID() - - whenever(verificationURLRepository.generateVerificationURL(playerUUID)) - .thenReturn(null) - - val result = useCase.generate(playerUUID) - - assertEquals(result, Failure(GenerateAccountVerificationURL.FailureReason.EMPTY_RESPONSE)) - } - - @Test - fun `should return failure if verification URL is empty`() = runTest { - val playerUUID = UUID.randomUUID() - - whenever(verificationURLRepository.generateVerificationURL(playerUUID)) - .thenReturn("") - - val result = useCase.generate(playerUUID) - - assertEquals(result, Failure(GenerateAccountVerificationURL.FailureReason.EMPTY_RESPONSE)) - } - - @Test - fun `should return failure if account already linked`() = runTest { - val playerUUID = UUID.randomUUID() - - whenever(verificationURLRepository.generateVerificationURL(playerUUID)) - .thenThrow(AccountLinkHTTPService.AlreadyLinkedException::class.java) - - val result = useCase.generate(playerUUID) - - assertEquals(result, Failure(GenerateAccountVerificationURL.FailureReason.ALREADY_LINKED)) - } -} diff --git a/pcbridge-spigot/test/com/projectcitybuild/modules/ranksync/actions/SyncPlayerGroupsWithAggregateTest.kt b/pcbridge-spigot/test/com/projectcitybuild/modules/ranksync/actions/SyncPlayerGroupsWithAggregateTest.kt deleted file mode 100644 index f0c105b81..000000000 --- a/pcbridge-spigot/test/com/projectcitybuild/modules/ranksync/actions/SyncPlayerGroupsWithAggregateTest.kt +++ /dev/null @@ -1,80 +0,0 @@ -package com.projectcitybuild.modules.ranksync.actions - -import com.projectcitybuild.entities.ConfigData -import com.projectcitybuild.pcbridge.core.modules.config.Config -import com.projectcitybuild.libs.permissions.Permissions -import com.projectcitybuild.pcbridge.core.contracts.PlatformLogger -import com.projectcitybuild.pcbridge.http.responses.Account -import com.projectcitybuild.pcbridge.http.responses.Aggregate -import com.projectcitybuild.pcbridge.http.responses.DonationPerk -import com.projectcitybuild.pcbridge.http.responses.DonationTier -import com.projectcitybuild.pcbridge.http.responses.Group -import kotlinx.coroutines.test.runTest -import org.junit.jupiter.api.BeforeEach -import org.junit.jupiter.api.Test -import org.mockito.Mock -import org.mockito.Mockito.mock -import org.mockito.Mockito.verify -import org.mockito.MockitoAnnotations -import org.mockito.kotlin.whenever -import java.util.UUID - -class SyncPlayerGroupsWithAggregateTest { - - @Mock - private lateinit var permissions: Permissions - - @Mock - private lateinit var config: Config - - private lateinit var useCase: SyncPlayerGroupsWithAggregate - - @BeforeEach - fun setUp() { - MockitoAnnotations.openMocks(this) - - useCase = SyncPlayerGroupsWithAggregate( - permissions = permissions, - config = config, - logger = mock(PlatformLogger::class.java), - ) - } - - @Test - fun `should set groups for player`() = runTest { - val account = Account( - groups = listOf( - Group(minecraftName = "group1"), - Group(minecraftName = "group2"), - ) - ) - val donorPerk = DonationPerk(donationTier = DonationTier(name = "copper")) - val aggregate = Aggregate(account = account, donationPerks = listOf(donorPerk)) - val uuid = UUID.randomUUID() - - whenever(config.get()).thenReturn(ConfigData.default.copy( - groups = ConfigData.default.groups.copy( - donorTierGroupNames = ConfigData.Groups.DonorTierGroupNames( - copper = "tier1", - iron = "tier2", - diamond = "tier3", - ), - ), - )) - - useCase.execute(uuid, aggregate) - - verify(permissions).setUserGroups(uuid, listOf("group1", "group2", "tier1")) - } - - @Test - fun `should set groups to nothing for guests`() = runTest { - val account = Account(groups = emptyList()) - val aggregate = Aggregate(account = account, donationPerks = emptyList()) - val uuid = UUID.randomUUID() - - useCase.execute(uuid, aggregate) - - verify(permissions).setUserGroups(uuid, listOf()) - } -} diff --git a/pcbridge-spigot/test/com/projectcitybuild/modules/ranksync/actions/UpdatePlayerGroupsTest.kt b/pcbridge-spigot/test/com/projectcitybuild/modules/ranksync/actions/UpdatePlayerGroupsTest.kt deleted file mode 100644 index 2307f4a47..000000000 --- a/pcbridge-spigot/test/com/projectcitybuild/modules/ranksync/actions/UpdatePlayerGroupsTest.kt +++ /dev/null @@ -1,68 +0,0 @@ -package com.projectcitybuild.modules.ranksync.actions - -import com.projectcitybuild.libs.permissions.Permissions -import com.projectcitybuild.pcbridge.core.utils.Failure -import com.projectcitybuild.pcbridge.core.utils.Success -import com.projectcitybuild.pcbridge.http.services.pcb.PlayerGroupHttpService -import com.projectcitybuild.repositories.PlayerGroupRepository -import kotlinx.coroutines.test.runTest -import org.junit.jupiter.api.Assertions.assertEquals -import org.junit.jupiter.api.BeforeEach -import org.junit.jupiter.api.Test -import org.mockito.Mockito.mock -import org.mockito.kotlin.any -import org.mockito.kotlin.verify -import org.mockito.kotlin.verifyNoInteractions -import org.mockito.kotlin.whenever -import java.util.UUID - -class UpdatePlayerGroupsTest { - - private lateinit var useCase: UpdatePlayerGroups - - private lateinit var permissions: Permissions - private lateinit var playerGroupRepository: PlayerGroupRepository - - @BeforeEach - fun setUp() { - permissions = mock(Permissions::class.java) - playerGroupRepository = mock(PlayerGroupRepository::class.java) - - useCase = UpdatePlayerGroups( - permissions, - playerGroupRepository, - ) - } - - @Test - fun `should assign player to groups and donor tiers`() = runTest { - val playerUUID = UUID.randomUUID() - - whenever(playerGroupRepository.getGroups(any())).thenReturn( - listOf("group1", "group2") - ) - whenever(playerGroupRepository.getDonorTiers(any())).thenReturn( - listOf("donor_tier1") - ) - - val result = useCase.execute(playerUUID) - - verify(permissions).setUserGroups(playerUUID, listOf("group1", "group2", "donor_tier1")) - assertEquals(result, Success(Unit)) - } - - @Test - fun `should return failure if account not linked`() = runTest { - val playerUUID = UUID.randomUUID() - - whenever(playerGroupRepository.getGroups(any())).thenThrow( - PlayerGroupHttpService.NoLinkedAccountException::class.java - ) - whenever(playerGroupRepository.getDonorTiers(any())).thenReturn(emptyList()) - - val result = useCase.execute(playerUUID) - - verifyNoInteractions(permissions) - assertEquals(result, Failure(UpdatePlayerGroups.FailureReason.ACCOUNT_NOT_LINKED)) - } -} diff --git a/pcbridge-spigot/test/com/projectcitybuild/modules/warps/actions/CreateWarpTest.kt b/pcbridge-spigot/test/com/projectcitybuild/modules/warps/actions/CreateWarpTest.kt deleted file mode 100644 index cb7b40787..000000000 --- a/pcbridge-spigot/test/com/projectcitybuild/modules/warps/actions/CreateWarpTest.kt +++ /dev/null @@ -1,82 +0,0 @@ -package com.projectcitybuild.modules.warps.actions - -import com.projectcitybuild.entities.SerializableLocation -import com.projectcitybuild.entities.Warp -import com.projectcitybuild.pcbridge.core.modules.datetime.time.Time -import com.projectcitybuild.pcbridge.core.utils.Failure -import com.projectcitybuild.pcbridge.core.utils.Success -import com.projectcitybuild.repositories.WarpRepository -import com.projectcitybuild.support.spigot.eventbroadcast.LocalEventBroadcaster -import kotlinx.coroutines.test.runTest -import org.junit.jupiter.api.Assertions.assertEquals -import org.junit.jupiter.api.BeforeEach -import org.junit.jupiter.api.Test -import org.mockito.Mockito.mock -import org.mockito.Mockito.times -import org.mockito.Mockito.verify -import org.mockito.kotlin.any -import org.mockito.kotlin.whenever -import java.time.LocalDateTime - -class CreateWarpTest { - private lateinit var useCase: CreateWarp - - private lateinit var warpRepository: WarpRepository - private lateinit var localEventBroadcaster: LocalEventBroadcaster - private lateinit var time: Time - - @BeforeEach - fun setUp() { - warpRepository = mock(WarpRepository::class.java) - localEventBroadcaster = mock(LocalEventBroadcaster::class.java) - time = mock(Time::class.java) - - useCase = CreateWarp(warpRepository, localEventBroadcaster, time) - } - - @Test - fun `should fail if warp already exists`() = runTest { - val warpName = "warp" - whenever(warpRepository.exists(warpName)).thenReturn(true) - - val result = useCase.createWarp(warpName, SerializableLocation()) - - assertEquals(result, Failure(CreateWarp.FailureReason.WARP_ALREADY_EXISTS)) - } - - @Test - fun `should create new warp`() = runTest { - val warpName = "warp" - val location = SerializableLocation() - val now = LocalDateTime.now() - - whenever(warpRepository.exists(warpName)).thenReturn(false) - whenever(time.now()).thenReturn(now) - - val result = useCase.createWarp(warpName, location) - - val expectedWarp = Warp( - warpName, - location, - now, - ) - - verify(warpRepository, times(1)).add(expectedWarp) - assertEquals(result, Success(Unit)) - } - - @Test - fun `should emit an event when a warp is created`() = runTest { - val warpName = "warp" - val location = SerializableLocation() - val now = LocalDateTime.now() - - whenever(warpRepository.exists(warpName)).thenReturn(false) - whenever(time.now()).thenReturn(now) - - val result = useCase.createWarp(warpName, location) - - verify(localEventBroadcaster).emit(any()) - assertEquals(result, Success(Unit)) - } -} diff --git a/pcbridge-spigot/test/com/projectcitybuild/modules/warps/actions/DeleteWarpTest.kt b/pcbridge-spigot/test/com/projectcitybuild/modules/warps/actions/DeleteWarpTest.kt deleted file mode 100644 index 8093200a9..000000000 --- a/pcbridge-spigot/test/com/projectcitybuild/modules/warps/actions/DeleteWarpTest.kt +++ /dev/null @@ -1,63 +0,0 @@ -package com.projectcitybuild.modules.warps.actions - -import com.projectcitybuild.pcbridge.core.utils.Failure -import com.projectcitybuild.pcbridge.core.utils.Success -import com.projectcitybuild.repositories.WarpRepository -import com.projectcitybuild.support.spigot.eventbroadcast.LocalEventBroadcaster -import kotlinx.coroutines.test.runTest -import org.junit.jupiter.api.Assertions.assertEquals -import org.junit.jupiter.api.BeforeEach -import org.junit.jupiter.api.Test -import org.mockito.Mockito.mock -import org.mockito.Mockito.times -import org.mockito.Mockito.verify -import org.mockito.kotlin.any -import org.mockito.kotlin.whenever - -class DeleteWarpTest { - - private lateinit var useCase: DeleteWarp - - private lateinit var warpRepository: WarpRepository - private lateinit var localEventBroadcaster: LocalEventBroadcaster - - @BeforeEach - fun setUp() { - warpRepository = mock(WarpRepository::class.java) - localEventBroadcaster = mock(LocalEventBroadcaster::class.java) - - useCase = DeleteWarp(warpRepository, localEventBroadcaster) - } - - @Test - fun `should fail if warp doesn't exists`() = runTest { - val warpName = "warp" - whenever(warpRepository.exists(warpName)).thenReturn(false) - - val result = useCase.deleteWarp(warpName) - - assertEquals(result, Failure(DeleteWarp.FailureReason.WARP_NOT_FOUND)) - } - - @Test - fun `should delete existing warp`() = runTest { - val warpName = "warp" - whenever(warpRepository.exists(warpName)).thenReturn(true) - - val result = useCase.deleteWarp(warpName) - - verify(warpRepository, times(1)).delete(warpName) - assertEquals(result, Success(Unit)) - } - - @Test - fun `should emit an event when a warp is deleted`() = runTest { - val warpName = "warp" - whenever(warpRepository.exists(warpName)).thenReturn(true) - - val result = useCase.deleteWarp(warpName) - - verify(localEventBroadcaster).emit(any()) - assertEquals(result, Success(Unit)) - } -} diff --git a/pcbridge-spigot/test/com/projectcitybuild/modules/warps/actions/GetWarpListTest.kt b/pcbridge-spigot/test/com/projectcitybuild/modules/warps/actions/GetWarpListTest.kt deleted file mode 100644 index 04814fdcd..000000000 --- a/pcbridge-spigot/test/com/projectcitybuild/modules/warps/actions/GetWarpListTest.kt +++ /dev/null @@ -1,97 +0,0 @@ -package com.projectcitybuild.modules.warps.actions - -import com.projectcitybuild.entities.ConfigData -import com.projectcitybuild.pcbridge.core.modules.config.Config -import com.projectcitybuild.repositories.WarpRepository -import kotlinx.coroutines.test.runTest -import org.junit.jupiter.api.Assertions.assertEquals -import org.junit.jupiter.api.Assertions.assertTrue -import org.junit.jupiter.api.BeforeEach -import org.junit.jupiter.api.Test -import org.mockito.Mock -import org.mockito.Mockito.mock -import org.mockito.MockitoAnnotations -import org.mockito.kotlin.whenever - -class GetWarpListTest { - - @Mock - private lateinit var config: Config - - private lateinit var useCase: GetWarpList - - private val warpRepository = mock(WarpRepository::class.java) - - @BeforeEach - fun setUp() { - MockitoAnnotations.openMocks(this) - - useCase = GetWarpList( - warpRepository, - config, - ) - } - - @Test - fun `should return all warps sorted`() = runTest { - val warps = listOf("b", "c", "a",) - whenever(warpRepository.names()).thenReturn(warps) - whenever(config.get()).thenReturn(ConfigData.default.copy( - warps = ConfigData.Warps(itemsPerPage = warps.size), - )) - - val received = useCase.getList(page = 1) - val expected = listOf("a", "b", "c") - - assertEquals(expected, received?.warps) - } - - @Test - fun `should return all warps when less than page max`() = runTest { - val warps = MutableList(3) { index -> "warp_$index" } - - whenever(warpRepository.names()).thenReturn(warps) - whenever(config.get()).thenReturn(ConfigData.default.copy( - warps = ConfigData.Warps(itemsPerPage = 3), - )) - - val received = useCase.getList(page = 1) - - warps.forEach { - assertTrue(received!!.warps.contains(it)) - } - assertEquals(warps.size, received?.warps?.size) - assertEquals(1, received?.currentPage) - assertEquals(1, received?.totalPages) - } - - @Test - fun `should return warps paginated when more than page max`() = runTest { - val warps = MutableList(5) { index -> "warp_$index" } - - whenever(warpRepository.names()).thenReturn(warps) - whenever(config.get()).thenReturn(ConfigData.default.copy( - warps = ConfigData.Warps(itemsPerPage = 2), - )) - - val firstPage = useCase.getList(page = 1) - assertEquals(listOf("warp_0", "warp_1"), firstPage?.warps) - assertEquals(1, firstPage?.currentPage) - assertEquals(3, firstPage?.totalPages) - - val secondPage = useCase.getList(page = 2) - assertEquals(listOf("warp_2", "warp_3"), secondPage?.warps) - assertEquals(2, secondPage?.currentPage) - assertEquals(3, secondPage?.totalPages) - - val thirdPage = useCase.getList(page = 3) - assertEquals(listOf("warp_4"), thirdPage?.warps) - assertEquals(3, thirdPage?.currentPage) - assertEquals(3, thirdPage?.totalPages) - - val fourthPage = useCase.getList(page = 4) - assertEquals(listOf("warp_4"), fourthPage?.warps) - assertEquals(3, fourthPage?.currentPage) - assertEquals(3, fourthPage?.totalPages) - } -} diff --git a/pcbridge-spigot/test/com/projectcitybuild/modules/warps/actions/TeleportToWarpTest.kt b/pcbridge-spigot/test/com/projectcitybuild/modules/warps/actions/TeleportToWarpTest.kt deleted file mode 100644 index f18606baa..000000000 --- a/pcbridge-spigot/test/com/projectcitybuild/modules/warps/actions/TeleportToWarpTest.kt +++ /dev/null @@ -1,105 +0,0 @@ -package com.projectcitybuild.modules.warps.actions - -import com.projectcitybuild.entities.Warp -import com.projectcitybuild.libs.nameguesser.NameGuesser -import com.projectcitybuild.pcbridge.core.contracts.PlatformLogger -import com.projectcitybuild.pcbridge.core.utils.Failure -import com.projectcitybuild.pcbridge.core.utils.Success -import com.projectcitybuild.repositories.WarpRepository -import com.projectcitybuild.support.spigot.eventbroadcast.LocalEventBroadcaster -import kotlinx.coroutines.test.runTest -import org.bukkit.Location -import org.bukkit.Server -import org.bukkit.World -import org.bukkit.entity.Player -import org.junit.jupiter.api.Assertions.assertEquals -import org.junit.jupiter.api.BeforeEach -import org.junit.jupiter.api.Test -import org.mockito.ArgumentMatchers.anyString -import org.mockito.Mockito.mock -import org.mockito.kotlin.any -import org.mockito.kotlin.verify -import org.mockito.kotlin.whenever - -class TeleportToWarpTest { - - private lateinit var useCase: TeleportToWarp - - private lateinit var warpRepository: WarpRepository - private lateinit var nameGuesser: NameGuesser - private lateinit var server: Server - private lateinit var player: Player - - @BeforeEach - fun setUp() { - warpRepository = mock(WarpRepository::class.java) - nameGuesser = mock(NameGuesser::class.java) - server = mock(Server::class.java) - - player = mock(Player::class.java).also { - whenever(it.location).thenReturn(mock(Location::class.java)) - } - - useCase = TeleportToWarp( - warpRepository = warpRepository, - nameGuesser = nameGuesser, - logger = mock(PlatformLogger::class.java), - localEventBroadcaster = mock(LocalEventBroadcaster::class.java), - server = server, - ) - } - - @Test - fun `should fail if warp doesn't exist`() = runTest { - whenever(warpRepository.names()).thenReturn(emptyList()) - - val result = useCase.warp(player, "warp") - - assertEquals(result, Failure(TeleportToWarp.FailureReason.WARP_NOT_FOUND)) - } - - @Test - fun `should fail if world not found`() = runTest { - val warpName = "warp" - val warp = Warp(name = warpName) - - whenever(warpRepository.names()).thenReturn(listOf(warp.name)) - whenever(warpRepository.first(warpName)).thenReturn(warp) - whenever(nameGuesser.guessClosest(any(), any())).thenReturn(warpName) - whenever(server.getWorld(anyString())).thenReturn(null) - - val result = useCase.warp(player, warpName) - - assertEquals(result, Failure(TeleportToWarp.FailureReason.WORLD_NOT_FOUND)) - } - - @Test - fun `should teleport player if possible`() = runTest { - val warpName = "warp" - val warp = Warp(name = warpName) - val world = mock(World::class.java) - - whenever(warpRepository.names()).thenReturn(listOf(warp.name)) - whenever(warpRepository.first(warpName)).thenReturn(warp) - whenever(nameGuesser.guessClosest(any(), any())).thenReturn(warpName) - whenever(server.getWorld(warp.location.worldName)).thenReturn(world) - - val result = useCase.warp(player, warpName) - - verify(player).teleport( - Location( - world, - warp.location.x, - warp.location.y, - warp.location.z, - warp.location.yaw, - warp.location.pitch, - ) - ) - - assertEquals( - Success(TeleportToWarp.Warp(warpName = warp.name)), - result, - ) - } -} diff --git a/pcbridge-spigot/test/com/projectcitybuild/Mock.kt b/pcbridge-spigot/test/com/projectcitybuild/pcbridge/Mockito.kt similarity index 83% rename from pcbridge-spigot/test/com/projectcitybuild/Mock.kt rename to pcbridge-spigot/test/com/projectcitybuild/pcbridge/Mockito.kt index 43df24685..5aeb61f1d 100644 --- a/pcbridge-spigot/test/com/projectcitybuild/Mock.kt +++ b/pcbridge-spigot/test/com/projectcitybuild/pcbridge/Mockito.kt @@ -1,4 +1,4 @@ -package com.projectcitybuild +package com.projectcitybuild.pcbridge import org.mockito.Mockito @@ -10,4 +10,4 @@ import org.mockito.Mockito * val myClass = mock>() * ``` */ -inline fun mock(): T = Mockito.mock(T::class.java)!! \ No newline at end of file +inline fun mock(): T = Mockito.mock(T::class.java)!! diff --git a/pcbridge-core/src/test/kotlin/com/projectcitybuild/pcbridge/core/modules/datetime/formatter/DateTimeFormatterImplTest.kt b/pcbridge-spigot/test/com/projectcitybuild/pcbridge/datetime/DateTimeFormatterTest.kt similarity index 56% rename from pcbridge-core/src/test/kotlin/com/projectcitybuild/pcbridge/core/modules/datetime/formatter/DateTimeFormatterImplTest.kt rename to pcbridge-spigot/test/com/projectcitybuild/pcbridge/datetime/DateTimeFormatterTest.kt index b97cf6a83..3261862b5 100644 --- a/pcbridge-core/src/test/kotlin/com/projectcitybuild/pcbridge/core/modules/datetime/formatter/DateTimeFormatterImplTest.kt +++ b/pcbridge-spigot/test/com/projectcitybuild/pcbridge/datetime/DateTimeFormatterTest.kt @@ -1,19 +1,20 @@ -package com.projectcitybuild.pcbridge.core.modules.datetime.formatter +package com.projectcitybuild.pcbridge.datetime +import com.projectcitybuild.pcbridge.core.datetime.DateTimeFormatter import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Test import java.time.ZoneId import java.time.format.FormatStyle import java.util.Locale -class DateTimeFormatterImplTest { - +class DateTimeFormatterTest { @Test fun `convert formats timestamp with correct locale and timezone`() { - val formatter = DateTimeFormatterImpl( - Locale.forLanguageTag("en-us"), - ZoneId.of("UTC"), - ) + val formatter = + DateTimeFormatter( + Locale.forLanguageTag("en-us"), + ZoneId.of("UTC"), + ) val result = formatter.convert(1642961224, FormatStyle.MEDIUM) assertEquals("Jan 23, 2022, 6:07:04 PM", result) diff --git a/pcbridge-core/src/test/kotlin/com/projectcitybuild/pcbridge/core/modules/datetime/time/LocalizedTimeTest.kt b/pcbridge-spigot/test/com/projectcitybuild/pcbridge/datetime/LocalizedTimeTest.kt similarity index 67% rename from pcbridge-core/src/test/kotlin/com/projectcitybuild/pcbridge/core/modules/datetime/time/LocalizedTimeTest.kt rename to pcbridge-spigot/test/com/projectcitybuild/pcbridge/datetime/LocalizedTimeTest.kt index 0f2d0b366..c583bf70d 100644 --- a/pcbridge-core/src/test/kotlin/com/projectcitybuild/pcbridge/core/modules/datetime/time/LocalizedTimeTest.kt +++ b/pcbridge-spigot/test/com/projectcitybuild/pcbridge/datetime/LocalizedTimeTest.kt @@ -1,5 +1,6 @@ -package com.projectcitybuild.pcbridge.core.modules.datetime.time +package com.projectcitybuild.pcbridge.datetime +import com.projectcitybuild.pcbridge.core.datetime.LocalizedTime import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Test import java.time.Clock @@ -7,16 +8,16 @@ import java.time.LocalDate import java.time.ZoneOffset class LocalizedTimeTest { - @Test fun `returns current time based on given clock`() { val zoneId = ZoneOffset.UTC val fixedDate = LocalDate.of(2023, 7, 15).atStartOfDay().atZone(zoneId) - val clock = Clock.fixed( - fixedDate.toInstant(), - zoneId, - ) + val clock = + Clock.fixed( + fixedDate.toInstant(), + zoneId, + ) val result = LocalizedTime(clock).now() assertEquals(fixedDate.toLocalDateTime(), result) diff --git a/pcbridge-spigot/test/com/projectcitybuild/utils/SanitizerTest.kt b/pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/bans/SanitizerTest.kt similarity index 88% rename from pcbridge-spigot/test/com/projectcitybuild/utils/SanitizerTest.kt rename to pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/bans/SanitizerTest.kt index e8842f766..f8dbd084a 100644 --- a/pcbridge-spigot/test/com/projectcitybuild/utils/SanitizerTest.kt +++ b/pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/bans/SanitizerTest.kt @@ -1,10 +1,9 @@ -package com.projectcitybuild.utils +package com.projectcitybuild.pcbridge.features.bans import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Test class SanitizerTest { - @Test fun `sanitize ip should strip slashes and ports`() { arrayOf( diff --git a/pcbridge-core/src/test/kotlin/com/projectcitybuild/pcbridge/core/utils/helpers/ValidIPTest.kt b/pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/bans/ValidIPTest.kt similarity index 85% rename from pcbridge-core/src/test/kotlin/com/projectcitybuild/pcbridge/core/utils/helpers/ValidIPTest.kt rename to pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/bans/ValidIPTest.kt index 9d1926096..21e375239 100644 --- a/pcbridge-core/src/test/kotlin/com/projectcitybuild/pcbridge/core/utils/helpers/ValidIPTest.kt +++ b/pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/bans/ValidIPTest.kt @@ -1,4 +1,4 @@ -package com.projectcitybuild.pcbridge.core.utils.helpers +package com.projectcitybuild.pcbridge.features.bans import org.junit.jupiter.api.Assertions.assertFalse import org.junit.jupiter.api.Assertions.assertTrue @@ -14,7 +14,7 @@ class ValidIPTest { "255.255.255.255", ).forEach { string -> assertTrue( - isValidIP(string) + isValidIP(string), ) } } @@ -31,8 +31,8 @@ class ValidIPTest { "a.b.c.d", ).forEach { string -> assertFalse( - isValidIP(string) + isValidIP(string), ) } } -} \ No newline at end of file +} diff --git a/pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/bans/actions/AuthoriseConnectionTest.kt b/pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/bans/actions/AuthoriseConnectionTest.kt new file mode 100644 index 000000000..3530c0746 --- /dev/null +++ b/pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/bans/actions/AuthoriseConnectionTest.kt @@ -0,0 +1,99 @@ +package com.projectcitybuild.pcbridge.features.bans.actions + +import com.projectcitybuild.pcbridge.http.responses.Aggregate +import com.projectcitybuild.pcbridge.http.responses.IPBan +import com.projectcitybuild.pcbridge.http.responses.PlayerBan +import kotlinx.coroutines.test.runTest +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import java.time.LocalDate +import java.time.ZoneId + +class AuthoriseConnectionTest { + private lateinit var useCase: AuthoriseConnection + + @BeforeEach + fun setUp() { + useCase = AuthoriseConnection() + } + + @Test + fun `should deny if player is banned`() = + runTest { + val ban = PlayerBan() + val result = + useCase.execute( + Aggregate(playerBan = ban), + ) + assertEquals( + AuthoriseConnection.ConnectResult.Denied( + AuthoriseConnection.Ban.UUID(ban), + ), + result, + ) + } + + @Test + fun `should not deny if player ban is inactive`() = + runTest { + val ban = + PlayerBan( + unbannedAt = LocalDate.now().atStartOfDay(ZoneId.systemDefault()).toEpochSecond(), + ) + val result = + useCase.execute( + Aggregate(playerBan = ban), + ) + assertEquals( + AuthoriseConnection.ConnectResult.Allowed, + result, + ) + } + + @Test + fun `should deny if IP is banned`() = + runTest { + val ban = IPBan() + val result = + useCase.execute( + Aggregate(ipBan = ban), + ) + assertEquals( + AuthoriseConnection.ConnectResult.Denied( + AuthoriseConnection.Ban.IP(ban), + ), + result, + ) + } + + @Test + fun `should not deny if IP ban is inactive`() = + runTest { + val ban = + IPBan( + unbannedAt = LocalDate.now().atStartOfDay(ZoneId.systemDefault()).toEpochSecond(), + ) + val result = + useCase.execute( + Aggregate(ipBan = ban), + ) + assertEquals( + AuthoriseConnection.ConnectResult.Allowed, + result, + ) + } + + @Test + fun `should allow if not banned`() = + runTest { + val result = + useCase.execute( + Aggregate(playerBan = null, ipBan = null), + ) + assertEquals( + AuthoriseConnection.ConnectResult.Allowed, + result, + ) + } +} diff --git a/pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/bans/actions/BanIPTest.kt b/pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/bans/actions/BanIPTest.kt new file mode 100644 index 000000000..9e8b80dd4 --- /dev/null +++ b/pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/bans/actions/BanIPTest.kt @@ -0,0 +1,131 @@ +package com.projectcitybuild.pcbridge.features.bans.actions + +import com.projectcitybuild.pcbridge.features.bans.repositories.IPBanRepository +import com.projectcitybuild.pcbridge.http.services.pcb.IPBanHttpService +import com.projectcitybuild.pcbridge.utils.Failure +import com.projectcitybuild.pcbridge.utils.Success +import kotlinx.coroutines.test.runTest +import org.bukkit.Server +import org.bukkit.entity.Player +import org.bukkit.event.player.PlayerKickEvent +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import org.mockito.Mockito.mock +import org.mockito.Mockito.verify +import org.mockito.kotlin.any +import org.mockito.kotlin.eq +import org.mockito.kotlin.verifyNoInteractions +import org.mockito.kotlin.whenever +import java.net.InetSocketAddress +import java.util.UUID + +class BanIPTest { + private lateinit var useCase: BanIP + private lateinit var ipBanRepository: IPBanRepository + private lateinit var server: Server + + @BeforeEach + fun setUp() { + ipBanRepository = mock(IPBanRepository::class.java) + server = mock(Server::class.java) + + useCase = + BanIP( + ipBanRepository, + server, + ) + } + + @Test + fun `should fail if IP is already banned`() = + runTest { + val ip = "127.0.0.1" + + whenever(ipBanRepository.ban(eq(ip), any(), any(), any())) + .thenThrow(IPBanHttpService.IPAlreadyBannedException::class.java) + + val result = + useCase.execute( + ip = ip, + bannerUUID = UUID.randomUUID(), + bannerName = "name", + reason = "reason", + ) + + assertEquals(Failure(BanIP.FailureReason.IP_ALREADY_BANNED), result) + } + + @Test + fun `should fail if IP is invalid`() = + runTest { + arrayOf( + "text", + "1234", + ).forEach { invalidIP -> + val result = + useCase.execute( + ip = invalidIP, + bannerUUID = UUID.randomUUID(), + bannerName = "name", + reason = "reason", + ) + assertEquals(Failure(BanIP.FailureReason.INVALID_IP), result) + } + } + + @Test + fun `should ban valid IP`() = + runTest { + arrayOf( + "127.0.0.1", + "/127.0.0.1:1234", + ).forEach { ip -> + val uuid = UUID.randomUUID() + val result = + useCase.execute( + ip = ip, + bannerUUID = uuid, + bannerName = "name", + reason = "reason", + ) + verify(ipBanRepository).ban( + ip = "127.0.0.1", + bannerUUID = uuid, + bannerName = "name", + reason = "reason", + ) + assertEquals(Success(Unit), result) + } + } + + @Test + fun `should kick player if online`() = + runTest { + val otherPlayer = mockPlayer(ip = "127.0.0.2") + val targetPlayer = mockPlayer(ip = "127.0.0.1") + whenever(server.onlinePlayers).thenReturn( + listOf(targetPlayer, otherPlayer), + ) + + useCase.execute( + ip = "127.0.0.1", + bannerUUID = UUID.randomUUID(), + bannerName = "name", + reason = "reason", + ) + + verify(targetPlayer).kick(any(), eq(PlayerKickEvent.Cause.BANNED)) + verifyNoInteractions(otherPlayer) + } +} + +private fun mockPlayer(ip: String): Player { + val address = mock(InetSocketAddress::class.java) + val player = mock(Player::class.java) + + whenever(address.toString()).thenReturn(ip) + whenever(player.address).thenReturn(address) + + return player +} diff --git a/pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/bans/actions/BanUUIDTest.kt b/pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/bans/actions/BanUUIDTest.kt new file mode 100644 index 000000000..6fce3d214 --- /dev/null +++ b/pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/bans/actions/BanUUIDTest.kt @@ -0,0 +1,84 @@ +package com.projectcitybuild.pcbridge.features.bans.actions + +import com.projectcitybuild.pcbridge.features.bans.repositories.PlayerBanRepository +import com.projectcitybuild.pcbridge.features.bans.repositories.PlayerUUIDRepository +import com.projectcitybuild.pcbridge.http.services.pcb.UUIDBanHttpService +import com.projectcitybuild.pcbridge.utils.Failure +import kotlinx.coroutines.test.runTest +import org.bukkit.Server +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import org.mockito.Mockito.mock +import org.mockito.Mockito.times +import org.mockito.Mockito.verify +import org.mockito.kotlin.whenever +import java.util.UUID + +class BanUUIDTest { + private lateinit var useCase: BanUUID + + private lateinit var playerBanRepository: PlayerBanRepository + private lateinit var playerUUIDRepository: PlayerUUIDRepository + private lateinit var server: Server + + @BeforeEach + fun setUp() { + playerBanRepository = mock(PlayerBanRepository::class.java) + playerUUIDRepository = mock(PlayerUUIDRepository::class.java) + server = mock(Server::class.java) + + useCase = + BanUUID( + playerBanRepository, + playerUUIDRepository, + server, + ) + } + + @Test + fun `ban should fail when player doesn't exist`() = + runTest { + val playerName = "banned_player" + + whenever(playerUUIDRepository.get(playerName)).thenReturn(null) + + val result = useCase.ban(playerName, null, "staff_player", null) + + assertEquals(result, Failure(BanUUID.FailureReason.PlayerDoesNotExist)) + } + + @Test + fun `ban should fail when player is already banned`() = + runTest { + val playerName = "banned_player" + val playerUUID = UUID.randomUUID() + val staffName = "staff_player" + val staffUUID = UUID.randomUUID() + + whenever(playerUUIDRepository.get(playerName)).thenReturn(playerUUID) + whenever(playerBanRepository.ban(playerUUID, playerName, staffUUID, staffName, null)) + .thenThrow(UUIDBanHttpService.UUIDAlreadyBannedException()) + + val result = useCase.ban(playerName, staffUUID, staffName, null) + + assertEquals(result, Failure(BanUUID.FailureReason.PlayerAlreadyBanned)) + } + + @Test + fun `ban should pass input to ban repository`() = + runTest { + val playerName = "banned_player" + val playerUUID = UUID.randomUUID() + val staffUUID = UUID.randomUUID() + val staffName = "staff_player" + val reason = "reason" + + whenever(playerUUIDRepository.get(playerName)).thenReturn(playerUUID) + + useCase.ban(playerName, staffUUID, "staff_player", reason) + + verify(playerBanRepository, times(1)) + .ban(playerUUID, playerName, staffUUID, staffName, reason) + } +} diff --git a/pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/bans/actions/CheckBanUUIDTest.kt b/pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/bans/actions/CheckBanUUIDTest.kt new file mode 100644 index 000000000..ead01cb36 --- /dev/null +++ b/pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/bans/actions/CheckBanUUIDTest.kt @@ -0,0 +1,128 @@ +package com.projectcitybuild.pcbridge.features.bans.actions + +import com.projectcitybuild.pcbridge.core.datetime.DateTimeFormatter +import com.projectcitybuild.pcbridge.features.bans.repositories.PlayerBanRepository +import com.projectcitybuild.pcbridge.features.bans.repositories.PlayerUUIDRepository +import com.projectcitybuild.pcbridge.http.responses.PlayerBan +import com.projectcitybuild.pcbridge.utils.Failure +import com.projectcitybuild.pcbridge.utils.Success +import kotlinx.coroutines.test.runTest +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import org.mockito.Mockito.mock +import org.mockito.kotlin.whenever +import java.time.ZoneId +import java.util.Locale +import java.util.UUID + +class CheckBanUUIDTest { + private lateinit var useCase: CheckUUIDBan + + private lateinit var playerBanRepository: PlayerBanRepository + private lateinit var playerUUIDRepository: PlayerUUIDRepository + private lateinit var dateTimeFormatter: DateTimeFormatter + + @BeforeEach + fun setUp() { + playerBanRepository = mock(PlayerBanRepository::class.java) + playerUUIDRepository = mock(PlayerUUIDRepository::class.java) + + dateTimeFormatter = + DateTimeFormatter( + Locale.forLanguageTag("en-us"), + ZoneId.of("UTC"), + ) + + useCase = + CheckUUIDBan( + playerBanRepository, + playerUUIDRepository, + dateTimeFormatter, + ) + } + + @Test + fun `getBan should fail when player doesn't exist`() = + runTest { + val playerName = "banned_player" + + whenever(playerUUIDRepository.get(playerName)).thenReturn(null) + + val result = useCase.getBan(playerName) + + assertEquals(result, Failure(CheckUUIDBan.FailureReason.PLAYER_DOES_NOT_EXIST)) + } + + @Test + fun `getBan should return a ban record with no expiry date`() = + runTest { + val playerName = "banned_player" + val playerUUID = UUID.randomUUID() + val staffUUID = UUID.randomUUID() + + whenever(playerUUIDRepository.get(playerName)).thenReturn(playerUUID) + whenever(playerBanRepository.get(playerUUID)).thenReturn( + PlayerBan( + id = 1, + serverId = 2, + bannedPlayerId = playerUUID.toString(), + bannedPlayerAlias = playerName, + bannerPlayerId = staffUUID.toString(), + reason = "griefing", + expiresAt = null, + createdAt = 1642953972, + updatedAt = 1642953972, + unbannedAt = null, + unbannerPlayerId = null, + unbanType = null, + ), + ) + + val result = useCase.getBan(playerName) + val expected = + CheckUUIDBan.BanRecord( + reason = "griefing", + dateOfBan = "Jan 23, 2022, 4:06:12 PM", + expiryDate = "Never", + ) + + assertEquals(Success(expected), result) + } + + @Test + fun `getBan should return a ban record with an expiry date`() = + runTest { + val playerName = "banned_player" + val playerUUID = UUID.randomUUID() + val staffUUID = UUID.randomUUID() + + whenever(playerUUIDRepository.get(playerName)).thenReturn(playerUUID) + whenever(playerBanRepository.get(playerUUID)).thenReturn( + PlayerBan( + id = 1, + serverId = 2, + bannedPlayerId = playerUUID.toString(), + bannedPlayerAlias = playerName, + bannerPlayerId = staffUUID.toString(), + reason = "griefing", + expiresAt = 1643108765, + createdAt = 1642953972, + updatedAt = 1642953972, + unbannedAt = null, + unbannerPlayerId = null, + unbanType = null, + ), + ) + + val result = useCase.getBan(playerName) + val expected = + CheckUUIDBan.BanRecord( + reason = "griefing", + dateOfBan = "Jan 23, 2022, 4:06:12 PM", + expiryDate = "Jan 25, 2022, 11:06:05 AM", + ) + + assertEquals(Success(expected), result) + } +} diff --git a/pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/bans/actions/UnbanIPTest.kt b/pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/bans/actions/UnbanIPTest.kt new file mode 100644 index 000000000..a749392e3 --- /dev/null +++ b/pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/bans/actions/UnbanIPTest.kt @@ -0,0 +1,84 @@ +package com.projectcitybuild.pcbridge.features.bans.actions + +import com.projectcitybuild.pcbridge.features.bans.repositories.IPBanRepository +import com.projectcitybuild.pcbridge.http.services.pcb.IPBanHttpService +import com.projectcitybuild.pcbridge.utils.Failure +import com.projectcitybuild.pcbridge.utils.Success +import kotlinx.coroutines.test.runTest +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import org.mockito.Mockito.mock +import org.mockito.Mockito.verify +import org.mockito.kotlin.any +import org.mockito.kotlin.eq +import org.mockito.kotlin.whenever +import java.util.UUID + +class UnbanIPTest { + private lateinit var useCase: UnbanIP + private lateinit var ipBanRepository: IPBanRepository + + @BeforeEach + fun setUp() { + ipBanRepository = mock(IPBanRepository::class.java) + useCase = UnbanIP(ipBanRepository) + } + + @Test + fun `should fail if IP is not banned`() = + runTest { + val ip = "127.0.0.1" + + whenever(ipBanRepository.unban(eq(ip), any(), any())) + .thenThrow(IPBanHttpService.IPNotBannedException::class.java) + + val result = + useCase.execute( + ip = ip, + unbannerUUID = UUID.randomUUID(), + unbannerName = "name", + ) + assertEquals(Failure(UnbanIP.FailureReason.IP_NOT_BANNED), result) + } + + @Test + fun `should fail if IP is invalid`() = + runTest { + arrayOf( + "text", + "1234", + ).forEach { invalidIP -> + val result = + useCase.execute( + ip = invalidIP, + unbannerUUID = UUID.randomUUID(), + unbannerName = "name", + ) + assertEquals(Failure(UnbanIP.FailureReason.INVALID_IP), result) + } + } + + @Test + fun `should unban valid IP`() = + runTest { + val uuid = UUID.randomUUID() + arrayOf( + "127.0.0.1", + "/127.0.0.1:1234", + ).forEach { ip -> + val result = + useCase.execute( + ip = ip, + unbannerUUID = uuid, + unbannerName = "name", + ) + verify(ipBanRepository).unban( + ip = "127.0.0.1", + unbannerUUID = uuid, + unbannerName = "name", + ) + assertEquals(Success(Unit), result) + } + } +} diff --git a/pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/bans/actions/UnbanUUIDTest.kt b/pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/bans/actions/UnbanUUIDTest.kt new file mode 100644 index 000000000..74ecb9724 --- /dev/null +++ b/pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/bans/actions/UnbanUUIDTest.kt @@ -0,0 +1,77 @@ +package com.projectcitybuild.pcbridge.features.bans.actions + +import com.projectcitybuild.pcbridge.features.bans.repositories.PlayerBanRepository +import com.projectcitybuild.pcbridge.features.bans.repositories.PlayerUUIDRepository +import com.projectcitybuild.pcbridge.http.services.pcb.UUIDBanHttpService +import com.projectcitybuild.pcbridge.utils.Failure +import kotlinx.coroutines.test.runTest +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import org.mockito.Mockito.mock +import org.mockito.Mockito.times +import org.mockito.Mockito.verify +import org.mockito.kotlin.whenever +import java.util.UUID + +class UnbanUUIDTest { + private lateinit var useCase: UnbanUUID + + private lateinit var playerBanRepository: PlayerBanRepository + private lateinit var playerUUIDRepository: PlayerUUIDRepository + + @BeforeEach + fun setUp() { + playerBanRepository = mock(PlayerBanRepository::class.java) + playerUUIDRepository = mock(PlayerUUIDRepository::class.java) + + useCase = + UnbanUUID( + playerBanRepository, + playerUUIDRepository, + ) + } + + @Test + fun `unban should fail when player doesn't exist`() = + runTest { + val playerName = "banned_player" + + whenever(playerUUIDRepository.get(playerName)).thenReturn(null) + + val result = useCase.unban(playerName, null) + + assertEquals(result, Failure(UnbanUUID.FailureReason.PlayerDoesNotExist)) + } + + @Test + fun `unban should fail when player is not banned`() = + runTest { + val playerName = "banned_player" + val playerUUID = UUID.randomUUID() + val staffUUID = UUID.randomUUID() + + whenever(playerUUIDRepository.get(playerName)).thenReturn(playerUUID) + whenever(playerBanRepository.unban(playerUUID, staffUUID)) + .thenThrow(UUIDBanHttpService.UUIDNotBannedException()) + + val result = useCase.unban(playerName, staffUUID) + + assertEquals(result, Failure(UnbanUUID.FailureReason.PlayerNotBanned)) + } + + @Test + fun `unban should pass input to ban repository`() = + runTest { + val playerName = "banned_player" + val playerUUID = UUID.randomUUID() + val staffUUID = UUID.randomUUID() + + whenever(playerUUIDRepository.get(playerName)).thenReturn(playerUUID) + + useCase.unban(playerName, staffUUID) + + verify(playerBanRepository, times(1)) + .unban(playerUUID, staffUUID) + } +} diff --git a/pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/buildtools/nightvision/commands/NightVisionCommandTest.kt b/pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/buildtools/nightvision/commands/NightVisionCommandTest.kt new file mode 100644 index 000000000..aa1f8ca02 --- /dev/null +++ b/pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/buildtools/nightvision/commands/NightVisionCommandTest.kt @@ -0,0 +1,98 @@ +package com.projectcitybuild.pcbridge.features.buildtools.nightvision.commands + +import com.projectcitybuild.pcbridge.features.nightvision.commands.NightVisionCommand +import kotlinx.coroutines.test.runTest +import org.bukkit.entity.Player +import org.bukkit.potion.PotionEffect +import org.bukkit.potion.PotionEffectType +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import org.mockito.Mockito +import org.mockito.kotlin.never +import org.mockito.kotlin.verify +import org.mockito.kotlin.whenever + +class NightVisionCommandTest { + private lateinit var player: Player + + private val potionEffect: PotionEffect + get() { + val duration = Integer.MAX_VALUE + val amplifier = 1 + + return PotionEffect( + PotionEffectType.NIGHT_VISION, + duration, + amplifier, + ) + } + + @BeforeEach + fun setUp() { + player = Mockito.mock(Player::class.java) + + whenever(player.spigot()).thenReturn(Mockito.mock(Player.Spigot::class.java)) + } + + @Test + fun `forces on nightvision when specified`() = + runTest { + NightVisionCommand().run( + sender = player, + args = + NightVisionCommand.Args( + desiredState = true, + ), + ) + verify(player).removePotionEffect(PotionEffectType.NIGHT_VISION) + verify(player).addPotionEffect(potionEffect) + } + + @Test + fun `forces off nightvision when specified`() = + runTest { + NightVisionCommand().run( + sender = player, + args = + NightVisionCommand.Args( + desiredState = false, + ), + ) + verify(player).removePotionEffect(PotionEffectType.NIGHT_VISION) + verify(player, never()).addPotionEffect(potionEffect) + } + + @Test + fun `toggles on nightvision if no effect`() = + runTest { + whenever(player.hasPotionEffect(PotionEffectType.NIGHT_VISION)) + .thenReturn(false) + + NightVisionCommand().run( + sender = player, + args = + NightVisionCommand.Args( + desiredState = null, + ), + ) + verify(player).removePotionEffect(PotionEffectType.NIGHT_VISION) + verify(player).addPotionEffect(potionEffect) + } + + @Test + fun `toggles off nightvision if already has effect`() = + runTest { + whenever(player.hasPotionEffect(PotionEffectType.NIGHT_VISION)) + .thenReturn(true) + + NightVisionCommand().run( + sender = player, + args = + NightVisionCommand.Args( + desiredState = null, + ), + ) + verify(player).removePotionEffect(PotionEffectType.NIGHT_VISION) + verify(player, never()).addPotionEffect(potionEffect) + } +} diff --git a/pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/staffchat/commands/ACommandTest.kt b/pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/staffchat/commands/ACommandTest.kt new file mode 100644 index 000000000..af19872ce --- /dev/null +++ b/pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/staffchat/commands/ACommandTest.kt @@ -0,0 +1,57 @@ +package com.projectcitybuild.pcbridge.features.staffchat.commands + +import com.projectcitybuild.pcbridge.Permissions +import kotlinx.coroutines.test.runTest +import net.kyori.adventure.text.Component +import org.bukkit.Server +import org.bukkit.entity.Player +import org.junit.jupiter.api.Assertions.assertTrue +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import org.mockito.ArgumentMatchers.any +import org.mockito.Mockito.mock +import org.mockito.kotlin.argumentCaptor +import org.mockito.kotlin.never +import org.mockito.kotlin.verify +import org.mockito.kotlin.whenever + +class ACommandTest { + private lateinit var server: Server + + @BeforeEach + fun setUp() { + server = mock(Server::class.java) + } + + @Test + fun `only players with permission receive staff messages`() = + runTest { + val regularPlayer = + mock(Player::class.java).also { + whenever(it.hasPermission(Permissions.COMMAND_STAFF_CHAT)).thenReturn(false) + } + val staffPlayer = + mock(Player::class.java).also { + whenever(it.hasPermission(Permissions.COMMAND_STAFF_CHAT)).thenReturn(true) + } + whenever(server.onlinePlayers).thenReturn( + listOf(regularPlayer, staffPlayer), + ) + + val message = "test message" + val sender = mock(Player::class.java) + StaffChatCommand(server).run( + sender = sender, + args = + StaffChatCommand.Args( + message = message, + ), + ) + + argumentCaptor().apply { + verify(staffPlayer).sendMessage(capture()) + assertTrue(firstValue.toString().contains(message)) + } + verify(regularPlayer, never()).sendMessage(any()) + } +} diff --git a/pcbridge-core/src/test/kotlin/com/projectcitybuild/pcbridge/core/utils/CancellableTest.kt b/pcbridge-spigot/test/com/projectcitybuild/pcbridge/utils/CancellableTest.kt similarity index 92% rename from pcbridge-core/src/test/kotlin/com/projectcitybuild/pcbridge/core/utils/CancellableTest.kt rename to pcbridge-spigot/test/com/projectcitybuild/pcbridge/utils/CancellableTest.kt index 4d6f31e0a..3acf5f589 100644 --- a/pcbridge-core/src/test/kotlin/com/projectcitybuild/pcbridge/core/utils/CancellableTest.kt +++ b/pcbridge-spigot/test/com/projectcitybuild/pcbridge/utils/CancellableTest.kt @@ -1,4 +1,4 @@ -package com.projectcitybuild.pcbridge.core.utils +package com.projectcitybuild.pcbridge.utils import org.junit.jupiter.api.Assertions.assertFalse import org.junit.jupiter.api.Assertions.assertTrue @@ -24,4 +24,4 @@ class CancellableTest { cancellable.cancel() assertTrue(cancellable.isCancelled) } -} \ No newline at end of file +} diff --git a/pcbridge-core/src/test/kotlin/com/projectcitybuild/pcbridge/core/utils/extensions/StringExtensionsTest.kt b/pcbridge-spigot/test/com/projectcitybuild/pcbridge/utils/extensions/StringExtensionsTest.kt similarity index 86% rename from pcbridge-core/src/test/kotlin/com/projectcitybuild/pcbridge/core/utils/extensions/StringExtensionsTest.kt rename to pcbridge-spigot/test/com/projectcitybuild/pcbridge/utils/extensions/StringExtensionsTest.kt index 1e4f98d01..17450cbe0 100644 --- a/pcbridge-core/src/test/kotlin/com/projectcitybuild/pcbridge/core/utils/extensions/StringExtensionsTest.kt +++ b/pcbridge-spigot/test/com/projectcitybuild/pcbridge/utils/extensions/StringExtensionsTest.kt @@ -1,4 +1,4 @@ -package com.projectcitybuild.pcbridge.core.utils.extensions +package com.projectcitybuild.pcbridge.utils.extensions import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Test @@ -11,4 +11,4 @@ class StringExtensionsTest { assertEquals(expected, original.toDashFormattedUUID()) } -} \ No newline at end of file +} diff --git a/pcbridge-spigot/test/com/projectcitybuild/repositories/ScheduledAnnouncementsRepositoryTest.kt b/pcbridge-spigot/test/com/projectcitybuild/repositories/ScheduledAnnouncementsRepositoryTest.kt deleted file mode 100644 index cf6dc97cc..000000000 --- a/pcbridge-spigot/test/com/projectcitybuild/repositories/ScheduledAnnouncementsRepositoryTest.kt +++ /dev/null @@ -1,83 +0,0 @@ -package com.projectcitybuild.repositories - -import com.projectcitybuild.entities.ConfigData -import com.projectcitybuild.mock -import com.projectcitybuild.pcbridge.core.modules.config.Config -import com.projectcitybuild.pcbridge.core.modules.filecache.FileCache -import kotlinx.coroutines.test.runTest -import org.junit.jupiter.api.Assertions.assertEquals -import org.junit.jupiter.api.BeforeEach -import org.junit.jupiter.api.Test -import org.mockito.kotlin.inOrder -import org.mockito.kotlin.whenever - -class ScheduledAnnouncementsRepositoryTest { - private lateinit var config: Config - private lateinit var fileCache: FileCache - private lateinit var repository: ScheduledAnnouncementsRepository - - @BeforeEach - fun setUp() { - config = mock>() - fileCache = mock>() - - repository = ScheduledAnnouncementsRepository( - config, - fileCache, - ) - - whenever(config.get()).thenReturn(ConfigData.default.copy( - announcements = ConfigData.Announcements( - intervalInMins = 5, - messages = listOf( - "message1", - "message2", - "message3", - ) - ) - )) - } - - @Test - fun `returns messages from config in a loop`() = runTest { - whenever(fileCache.get()).thenReturn(null) - - assertEquals("message1", repository.getNextAnnouncement()) - assertEquals("message2", repository.getNextAnnouncement()) - assertEquals("message3", repository.getNextAnnouncement()) - assertEquals("message1", repository.getNextAnnouncement()) - } - - @Test - fun `caches last broadcast message index`() = runTest { - whenever(fileCache.get()).thenReturn(null) - - repository.getNextAnnouncement() - repository.getNextAnnouncement() - repository.getNextAnnouncement() - repository.getNextAnnouncement() - - val order = inOrder(fileCache) - order.verify(fileCache).put( - ScheduledAnnouncements(lastBroadcastIndex = 0) - ) - order.verify(fileCache).put( - ScheduledAnnouncements(lastBroadcastIndex = 1) - ) - order.verify(fileCache).put( - ScheduledAnnouncements(lastBroadcastIndex = 2) - ) - order.verify(fileCache).put( - ScheduledAnnouncements(lastBroadcastIndex = 0) - ) - } - - @Test - fun `starts from last broadcast index if possible`() = runTest { - whenever(fileCache.get()).thenReturn( - ScheduledAnnouncements(lastBroadcastIndex = 1) - ) - assertEquals("message3", repository.getNextAnnouncement()) - assertEquals("message1", repository.getNextAnnouncement()) - } -} \ No newline at end of file diff --git a/pcbridge-spigot/test/com/projectcitybuild/support/spigot/SpigotLoggerTest.kt b/pcbridge-spigot/test/com/projectcitybuild/support/spigot/SpigotLoggerTest.kt deleted file mode 100644 index d2df78196..000000000 --- a/pcbridge-spigot/test/com/projectcitybuild/support/spigot/SpigotLoggerTest.kt +++ /dev/null @@ -1,53 +0,0 @@ -package com.projectcitybuild.support.spigot - -import org.junit.jupiter.api.BeforeEach -import org.junit.jupiter.api.Test -import org.mockito.Mockito.mock -import org.mockito.kotlin.verify -import java.util.logging.Logger - -class SpigotLoggerTest { - private lateinit var wrappedLogger: Logger - private lateinit var logger: SpigotLogger - - @BeforeEach - fun setUp() { - wrappedLogger = mock(Logger::class.java) - logger = SpigotLogger(wrappedLogger) - } - - @Test - fun `should log verbose`() { - val message = "message" - logger.verbose(message) - verify(wrappedLogger).info(message) - } - - @Test - fun `should log debug`() { - val message = "message" - logger.debug(message) - verify(wrappedLogger).info(message) - } - - @Test - fun `should log info`() { - val message = "message" - logger.info(message) - verify(wrappedLogger).info(message) - } - - @Test - fun `should log warning`() { - val message = "message" - logger.warning(message) - verify(wrappedLogger).warning(message) - } - - @Test - fun `should log severe`() { - val message = "message" - logger.severe(message) - verify(wrappedLogger).severe(message) - } -} \ No newline at end of file diff --git a/pcbridge-spigot/test/com/projectcitybuild/support/spigot/SpigotSchedulerTest.kt b/pcbridge-spigot/test/com/projectcitybuild/support/spigot/SpigotSchedulerTest.kt deleted file mode 100644 index 537e27419..000000000 --- a/pcbridge-spigot/test/com/projectcitybuild/support/spigot/SpigotSchedulerTest.kt +++ /dev/null @@ -1,114 +0,0 @@ -package com.projectcitybuild.support.spigot - -import org.bukkit.Server -import org.bukkit.plugin.java.JavaPlugin -import org.bukkit.scheduler.BukkitScheduler -import org.bukkit.scheduler.BukkitTask -import org.junit.jupiter.api.Assertions.assertFalse -import org.junit.jupiter.api.Assertions.assertTrue -import org.junit.jupiter.api.BeforeEach -import org.junit.jupiter.api.Test -import org.mockito.ArgumentMatchers.isA -import org.mockito.Mockito.mock -import org.mockito.kotlin.any -import org.mockito.kotlin.argumentCaptor -import org.mockito.kotlin.capture -import org.mockito.kotlin.eq -import org.mockito.kotlin.verify -import org.mockito.kotlin.whenever - -class SpigotSchedulerTest { - private lateinit var plugin: JavaPlugin - private lateinit var server: Server - private lateinit var bukkitScheduler: BukkitScheduler - private lateinit var scheduler: SpigotScheduler - - @BeforeEach - fun setUp() { - plugin = mock(JavaPlugin::class.java) - server = mock(Server::class.java) - bukkitScheduler = mock(BukkitScheduler::class.java) - scheduler = SpigotScheduler(plugin) - - whenever(plugin.server).thenReturn(server) - whenever(server.scheduler).thenReturn(bukkitScheduler) - } - - private fun processSyncTasks() { - argumentCaptor().apply { - verify(bukkitScheduler).scheduleSyncDelayedTask(eq(plugin), capture()) - firstValue.run() - } - } - - private fun processAsyncTasks() { - argumentCaptor().apply { - verify(bukkitScheduler).runTaskAsynchronously(eq(plugin), capture()) - firstValue.run() - } - } - - @Test - fun `schedules sync task`() { - var didRun = false - val task = { didRun = true } - scheduler.sync(task) - - processSyncTasks() - assertTrue(didRun) - } - - @Test - fun `schedules async task`() { - whenever(bukkitScheduler.runTaskAsynchronously(eq(plugin), isA(Runnable::class.java))) - .thenReturn(mock(BukkitTask::class.java)) - - var didRun = false - val task = scheduler.async { resolve -> - didRun = true - resolve(Unit) - } - assertFalse(didRun) - - task.start() - processAsyncTasks() - assertTrue(didRun) - } - - @Test - fun `cancels async task`() { - val bukkitTask = mock(BukkitTask::class.java) - whenever(bukkitScheduler.runTaskAsynchronously(eq(plugin), isA(Runnable::class.java))) - .thenReturn(bukkitTask) - - var didRun = false - val task = scheduler.async { resolve -> - didRun = true - resolve(Unit) - } - assertFalse(didRun) - - val cancellable = task.start() - cancellable.cancel() - verify(bukkitTask).cancel() - } - - @Test - fun `async task resolves to a value`() { - whenever(bukkitScheduler.runTaskAsynchronously(eq(plugin), isA(Runnable::class.java))) - .thenReturn(mock(BukkitTask::class.java)) - - val task = scheduler.async { resolve -> - resolve(true) - } - - var didRun = false - task.startAndSubscribe { resolvedValue -> - didRun = resolvedValue - } - assertFalse(didRun) - - processAsyncTasks() - assertTrue(didRun) - } -} \ No newline at end of file diff --git a/pcbridge-spigot/test/com/projectcitybuild/support/spigot/SpigotServerTest.kt b/pcbridge-spigot/test/com/projectcitybuild/support/spigot/SpigotServerTest.kt deleted file mode 100644 index f17d7ac98..000000000 --- a/pcbridge-spigot/test/com/projectcitybuild/support/spigot/SpigotServerTest.kt +++ /dev/null @@ -1,105 +0,0 @@ -package com.projectcitybuild.support.spigot - -import net.md_5.bungee.api.ChatColor -import net.md_5.bungee.api.chat.TextComponent -import org.bukkit.Server -import org.bukkit.entity.Player -import org.junit.jupiter.api.BeforeEach -import org.junit.jupiter.api.Test -import org.mockito.ArgumentMatchers.anyString -import org.mockito.Mockito.mock -import org.mockito.Mockito.never -import org.mockito.kotlin.verify -import org.mockito.kotlin.verifyNoInteractions -import org.mockito.kotlin.whenever -import java.net.InetSocketAddress -import java.util.UUID - -class SpigotServerTest { - private lateinit var wrappedServer: Server - private lateinit var server: SpigotServer - - @BeforeEach - fun setUp() { - wrappedServer = mock(Server::class.java) - server = SpigotServer(wrappedServer) - } - - @Test - fun `should kick by player name`() { - val playerName = "name" - - val otherPlayer = mock(Player::class.java) - whenever(otherPlayer.name).thenReturn("other_player") - - listOf("name", "NaME", "NAME").forEach { inputName -> - val reason = "reason" - val kickContext = SpigotServer.KickContext.FATAL - - val player = mock(Player::class.java) - whenever(player.name).thenReturn(playerName) - whenever(wrappedServer.onlinePlayers).thenReturn(listOf(player, otherPlayer)) - - server.kickByName( - playerName = inputName, - reason = reason, - context = kickContext, - ) - verify(player).kickPlayer("${ChatColor.RED}reason") - verifyNoInteractions(otherPlayer) - } - } - - @Test - fun `should kick by player UUID`() { - val uuid = UUID.randomUUID() - val reason = "reason" - val kickContext = SpigotServer.KickContext.FATAL - - val player = mock(Player::class.java) - whenever(wrappedServer.getPlayer(uuid)).thenReturn(player) - - server.kickByUUID( - playerUUID = uuid, - reason = reason, - context = kickContext, - ) - verify(player).kickPlayer("${ChatColor.RED}reason") - } - - @Test - fun `should kick by player IP`() { - val ip = "127.0.0.1" - val reason = "reason" - val kickContext = SpigotServer.KickContext.FATAL - - val player = mock(Player::class.java) - val address = mock(InetSocketAddress::class.java) - whenever(address.toString()).thenReturn(ip) - whenever(player.address).thenReturn(address) - - val otherPlayer = mock(Player::class.java) - val otherAddress = mock(InetSocketAddress::class.java) - whenever(otherAddress.toString()).thenReturn("192.168.0.1") - whenever(otherPlayer.address).thenReturn(otherAddress) - - whenever(wrappedServer.onlinePlayers).thenReturn(listOf(player, otherPlayer)) - - server.kickByIP( - ip = ip, - reason = reason, - context = kickContext, - ) - verify(player).kickPlayer("${ChatColor.RED}reason") - verify(otherPlayer, never()).kickPlayer(anyString()) - } - - @Test - fun `should broadcast message`() { - val message = TextComponent("test") - - server.broadcastMessage(message) - - verify(wrappedServer).broadcastMessage(message.toLegacyText()) - } -} \ No newline at end of file diff --git a/pcbridge-spigot/test/resources/api_ban_already_banned_response.json b/pcbridge-spigot/test/resources/api_ban_already_banned_response.json deleted file mode 100644 index 271fc955f..000000000 --- a/pcbridge-spigot/test/resources/api_ban_already_banned_response.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "error": { - "id": "player_already_banned", - "title": "UserAlreadyBannedException", - "detail": "Player is already banned", - "status": 400 - } -} \ No newline at end of file diff --git a/pcbridge-spigot/test/resources/api_ban_invalid_input_response.json b/pcbridge-spigot/test/resources/api_ban_invalid_input_response.json deleted file mode 100644 index d10db5c33..000000000 --- a/pcbridge-spigot/test/resources/api_ban_invalid_input_response.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "error": { - "id": "bad_input", - "title": "BadRequestException", - "detail": "The player alias field is required.", - "status": 400 - } -} \ No newline at end of file diff --git a/pcbridge-spigot/test/resources/api_ban_not_banned_response.json b/pcbridge-spigot/test/resources/api_ban_not_banned_response.json deleted file mode 100644 index b07121c9e..000000000 --- a/pcbridge-spigot/test/resources/api_ban_not_banned_response.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "error": { - "id": "player_not_banned", - "title": "UserNotBannedException", - "detail": "This player is not currently banned", - "status": 400 - } -} \ No newline at end of file diff --git a/pcbridge-spigot/test/resources/api_ban_status_ban_response.json b/pcbridge-spigot/test/resources/api_ban_status_ban_response.json deleted file mode 100644 index 1427f8a10..000000000 --- a/pcbridge-spigot/test/resources/api_ban_status_ban_response.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "data": { - "game_ban_id": 111, - "server_id": 222, - "banned_player_id": 333, - "banned_player_type": "minecraft_player", - "banned_alias_at_time": "fake_user", - "staff_player_id": 444, - "staff_player_type": "minecraft_player", - "reason": "fake_ban_reason", - "is_active": true, - "is_global_ban": true, - "expires_at": null, - "created_at": 1606647622, - "updated_at": 1606647633 - } -} \ No newline at end of file diff --git a/pcbridge-spigot/test/resources/api_ban_unban_response.json b/pcbridge-spigot/test/resources/api_ban_unban_response.json deleted file mode 100644 index c181b681d..000000000 --- a/pcbridge-spigot/test/resources/api_ban_unban_response.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "data": { - "game_unban_id": 598, - "game_ban_id": 6130, - "staff_player_id": 625, - "staff_player_type": "minecraft_player", - "created_at": 1606653529, - "updated_at": 1606653529 - } -} \ No newline at end of file diff --git a/pcbridge-spigot/test/resources/api_no_data_response.json b/pcbridge-spigot/test/resources/api_no_data_response.json deleted file mode 100644 index 7fff54218..000000000 --- a/pcbridge-spigot/test/resources/api_no_data_response.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "data": null -} \ No newline at end of file diff --git a/pcbridge-web-server/build.gradle.kts b/pcbridge-web-server/build.gradle.kts deleted file mode 100644 index aed796d6a..000000000 --- a/pcbridge-web-server/build.gradle.kts +++ /dev/null @@ -1,18 +0,0 @@ -plugins { - application -} - -application { - mainClass.set("com.projectcitybuild.pcbridge.ApplicationKt") -} - -repositories { - mavenCentral() -} - -dependencies { - implementation(project(":pcbridge-core")) - - implementation("io.ktor:ktor-server-core:2.2.4") - implementation("io.ktor:ktor-server-netty:2.2.4") -} diff --git a/pcbridge-web-server/src/main/kotlin/com/projectcitybuild/pcbridge/webserver/HttpServer.kt b/pcbridge-web-server/src/main/kotlin/com/projectcitybuild/pcbridge/webserver/HttpServer.kt deleted file mode 100644 index c94d0becd..000000000 --- a/pcbridge-web-server/src/main/kotlin/com/projectcitybuild/pcbridge/webserver/HttpServer.kt +++ /dev/null @@ -1,63 +0,0 @@ -package com.projectcitybuild.pcbridge.webserver - -import com.projectcitybuild.pcbridge.core.contracts.PlatformLogger -import io.ktor.http.HttpStatusCode -import io.ktor.server.application.call -import io.ktor.server.engine.embeddedServer -import io.ktor.server.netty.Netty -import io.ktor.server.netty.NettyApplicationEngine -import io.ktor.server.request.uri -import io.ktor.server.response.respond -import io.ktor.server.routing.get -import io.ktor.server.routing.routing - -interface HttpServerDelegate { - fun syncPlayer(uuid: String) -} - -class HttpServer( - private val config: HttpServerConfig, - private val delegate: HttpServerDelegate, - private val logger: PlatformLogger, -) { - private var server: NettyApplicationEngine? = null - - fun start() { - if (config.authToken.isEmpty()) { - logger.severe("Internal web server token not set in config. Web server will not be started") - return - } - - server?.stop(gracePeriodMillis = 0, timeoutMillis = 0) - server = embeddedServer(Netty, port = config.port) { - routing { - get("player/{uuid}/sync") { - logger.info("Received HTTP connection: ${call.request.uri}") - - val token = call.request.headers.get("Authorization") - if (token.isNullOrEmpty() || token != "Bearer $config.authToken") { - logger.info("401 Unauthorized: No token or invalid token provided") - call.respond(HttpStatusCode.Unauthorized) - return@get - } - - val rawUUID = call.parameters["uuid"] - if (rawUUID.isNullOrEmpty()) { - logger.info("400 Bad Request: No UUID provided") - call.respond(HttpStatusCode.BadRequest, "UUID cannot be empty") - return@get - } - - delegate.syncPlayer(rawUUID) - - call.respond(HttpStatusCode.OK) - } - } - }.start(wait = false) - } - - fun stop() { - server?.stop(gracePeriodMillis = 0, timeoutMillis = 0) - server = null - } -} diff --git a/pcbridge-web-server/src/main/kotlin/com/projectcitybuild/pcbridge/webserver/HttpServerConfig.kt b/pcbridge-web-server/src/main/kotlin/com/projectcitybuild/pcbridge/webserver/HttpServerConfig.kt deleted file mode 100644 index a30987ba8..000000000 --- a/pcbridge-web-server/src/main/kotlin/com/projectcitybuild/pcbridge/webserver/HttpServerConfig.kt +++ /dev/null @@ -1,6 +0,0 @@ -package com.projectcitybuild.pcbridge.webserver - -data class HttpServerConfig( - val authToken: String, - val port: Int, -) diff --git a/settings.gradle.kts b/settings.gradle.kts index bbbeb32b6..9fc64d37e 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,6 +1,4 @@ rootProject.name = "pcbridge" -include("pcbridge-core") include("pcbridge-http") include("pcbridge-spigot") -include("pcbridge-web-server") From 78258bc72ceec3b72dff2e57f4607e59a34b9ea8 Mon Sep 17 00:00:00 2001 From: Andy Saw <7236312+andyksaw@users.noreply.github.com> Date: Sat, 19 Oct 2024 12:44:24 +0000 Subject: [PATCH 12/15] feat: add new registration flow (#241) * Remove obsolete functionality and revamp syncing * Add register command * Create registration commands * Restore web server * Sync player state on request * Restore sync command * Fix badge not syncing * Remove old tests * Fix date time deserialization * Fix tests * Disable linter --- .github/workflows/tests.yml | 16 +- build.gradle.kts | 2 +- .../pcbridge/http/HttpService.kt | 39 +-- .../pcbridge/http/RetrofitExtensions.kt | 3 - .../pcbridge/http/clients/MojangClient.kt | 32 -- .../pcbridge/http/clients/PCBClientFactory.kt | 30 +- .../deserializers/LocalDateTimeTypeAdapter.kt | 35 ++ .../pcbridge/http/parsing/ApiError.kt | 8 - .../pcbridge/http/parsing/ApiResponse.kt | 6 - .../pcbridge/http/parsing/ResponseParser.kt | 45 ++- .../pcbridge/http/requests/MojangRequest.kt | 14 - .../pcbridge/http/requests/PCBRequest.kt | 157 ++------- .../pcbridge/http/responses/Account.kt | 11 +- .../pcbridge/http/responses/AuthURL.kt | 8 - .../pcbridge/http/responses/Badge.kt | 5 +- .../pcbridge/http/responses/DonationPerk.kt | 20 +- .../pcbridge/http/responses/DonationTier.kt | 7 +- .../pcbridge/http/responses/Group.kt | 16 +- .../pcbridge/http/responses/IPBan.kt | 35 +- .../pcbridge/http/responses/MojangPlayer.kt | 10 - .../pcbridge/http/responses/PlayerBan.kt | 47 +-- .../responses/{Aggregate.kt => PlayerData.kt} | 8 +- .../pcbridge/http/responses/PlayerWarning.kt | 26 -- .../serializable/LocalDateTimeSerializer.kt | 22 +- .../http}/serializable/UUIDSerializer.kt | 2 +- .../services/mojang/PlayerUUIDHttpService.kt | 30 -- .../services/pcb/AccountLinkHTTPService.kt | 39 --- .../http/services/pcb/IPBanHttpService.kt | 72 ---- .../services/pcb/PlayerGroupHttpService.kt | 55 ---- ...ateHttpService.kt => PlayerHttpService.kt} | 20 +- .../services/pcb/PlayerWarningHttpService.kt | 61 ---- .../http/services/pcb/RegisterHttpService.kt | 34 ++ .../http/services/pcb/UUIDBanHttpService.kt | 81 ----- pcbridge-spigot/build.gradle.kts | 1 + .../projectcitybuild/pcbridge/Container.kt | 308 ++++++------------ .../com/projectcitybuild/pcbridge/Plugin.kt | 89 ++--- .../pcbridge/WebServerDelegate.kt | 16 + .../pcbridge/core/state/ServerState.kt | 32 +- .../pcbridge/core/state/Store.kt | 8 +- ...seConnection.kt => AuthorizeConnection.kt} | 14 +- .../pcbridge/features/bans/actions/BanIP.kt | 54 --- .../pcbridge/features/bans/actions/BanUUID.kt | 53 --- .../features/bans/actions/CheckUUIDBan.kt | 42 --- .../pcbridge/features/bans/actions/UnbanIP.kt | 42 --- .../features/bans/actions/UnbanUUID.kt | 39 --- .../features/bans/commands/BanCommand.kt | 76 ----- .../features/bans/commands/BanIPCommand.kt | 77 ----- .../features/bans/commands/CheckBanCommand.kt | 69 ---- .../features/bans/commands/UnbanCommand.kt | 63 ---- .../features/bans/commands/UnbanIPCommand.kt | 63 ---- .../bans/events/ConnectionPermittedEvent.kt | 4 +- .../listeners/AuthorizeConnectionListener.kt | 91 ++---- .../bans/repositories/AggregateRepository.kt | 21 -- .../bans/repositories/IPBanRepository.kt | 41 --- .../bans/repositories/PlayerBanRepository.kt | 43 --- .../bans/repositories/PlayerRepository.kt | 23 ++ .../bans/repositories/PlayerUUIDRepository.kt | 37 --- .../features/chat/ChatBadgeFormatter.kt | 14 +- .../features/chat/ChatGroupFormatter.kt | 75 +++-- .../chat/listeners/FormatNameChatListener.kt | 23 +- .../listeners/SyncBadgesOnJoinListener.kt | 25 -- .../chat/listeners/SyncPlayerChatListener.kt | 21 ++ .../chat/repositories/ChatBadgeRepository.kt | 22 +- .../chat/repositories/ChatGroupRepository.kt | 63 ++-- .../actions/SyncPlayerGroups.kt | 4 +- .../features/groups/commands/SyncCommand.kt | 78 +++++ .../groups/events/PlayerSyncRequestedEvent.kt | 20 ++ .../groups/listener/SyncRankListener.kt | 19 ++ .../groups/repositories/SyncRepository.kt | 26 ++ .../listeners/AnnounceJoinListener.kt | 22 +- .../listeners/AnnounceQuitListener.kt | 13 +- .../repositories/PlayerConfigRepository.kt | 3 +- .../features/mute/commands/MuteCommand.kt | 61 ---- .../features/mute/commands/UnmuteCommand.kt | 61 ---- .../mute/listeners/MuteChatListener.kt | 25 -- .../events/PlayerStateDestroyedEvent.kt | 22 ++ .../events/PlayerStateUpdatedEvent.kt | 22 ++ .../listeners/PlayerStateListener.kt | 66 ++++ .../listeners/PlayerSyncRequestListener.kt | 54 +++ .../features/register/commands/CodeCommand.kt | 66 ++++ .../register/commands/RegisterCommand.kt | 64 ++++ .../actions/GenerateAccountVerificationURL.kt | 33 -- .../sync/actions/UpdatePlayerGroups.kt | 36 -- .../features/sync/commands/SyncCommand.kt | 111 ------- .../sync/commands/SyncOtherCommand.kt | 70 ---- .../sync/listener/SyncRankOnJoinListener.kt | 19 -- .../sync/repositories/SyncRepository.kt | 47 --- .../utilities/commands/PCBridgeCommand.kt | 92 ------ .../actions/GetUnacknowledgedWarnings.kt | 37 --- .../commands/WarningAcknowledgeCommand.kt | 37 --- .../listeners/NotifyWarningsOnJoinListener.kt | 62 ---- .../repositories/PlayerWarningRepository.kt | 23 -- .../support/spigot/SpigotEventBroadcaster.kt | 17 + pcbridge-spigot/src/main/resources/plugin.yml | 24 +- .../bans/actions/AuthoriseConnectionTest.kt | 99 ------ .../bans/actions/AuthorizeConnectionTest.kt | 120 +++++++ .../features/bans/actions/BanIPTest.kt | 131 -------- .../features/bans/actions/BanUUIDTest.kt | 84 ----- .../features/bans/actions/CheckBanUUIDTest.kt | 128 -------- .../features/bans/actions/UnbanIPTest.kt | 84 ----- .../features/bans/actions/UnbanUUIDTest.kt | 77 ----- pcbridge-web-server/build.gradle.kts | 20 ++ .../pcbridge/webserver/HttpServer.kt | 108 ++++++ .../pcbridge/webserver/HttpServerConfig.kt | 6 + settings.gradle.kts | 1 + 105 files changed, 1328 insertions(+), 3309 deletions(-) delete mode 100644 pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/clients/MojangClient.kt create mode 100644 pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/deserializers/LocalDateTimeTypeAdapter.kt delete mode 100644 pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/parsing/ApiError.kt delete mode 100644 pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/parsing/ApiResponse.kt delete mode 100644 pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/requests/MojangRequest.kt delete mode 100644 pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/AuthURL.kt delete mode 100644 pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/MojangPlayer.kt rename pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/{Aggregate.kt => PlayerData.kt} (84%) delete mode 100644 pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/PlayerWarning.kt rename {pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/support => pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http}/serializable/LocalDateTimeSerializer.kt (51%) rename {pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/support => pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http}/serializable/UUIDSerializer.kt (91%) delete mode 100644 pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/services/mojang/PlayerUUIDHttpService.kt delete mode 100644 pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/services/pcb/AccountLinkHTTPService.kt delete mode 100644 pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/services/pcb/IPBanHttpService.kt delete mode 100644 pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/services/pcb/PlayerGroupHttpService.kt rename pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/services/pcb/{AggregateHttpService.kt => PlayerHttpService.kt} (56%) delete mode 100644 pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/services/pcb/PlayerWarningHttpService.kt create mode 100644 pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/services/pcb/RegisterHttpService.kt delete mode 100644 pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/services/pcb/UUIDBanHttpService.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/WebServerDelegate.kt rename pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/actions/{AuthoriseConnection.kt => AuthorizeConnection.kt} (71%) delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/actions/BanIP.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/actions/BanUUID.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/actions/CheckUUIDBan.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/actions/UnbanIP.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/actions/UnbanUUID.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/commands/BanCommand.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/commands/BanIPCommand.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/commands/CheckBanCommand.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/commands/UnbanCommand.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/commands/UnbanIPCommand.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/repositories/AggregateRepository.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/repositories/IPBanRepository.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/repositories/PlayerBanRepository.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/repositories/PlayerRepository.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/repositories/PlayerUUIDRepository.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/chat/listeners/SyncBadgesOnJoinListener.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/chat/listeners/SyncPlayerChatListener.kt rename pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/{sync => groups}/actions/SyncPlayerGroups.kt (84%) create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/groups/commands/SyncCommand.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/groups/events/PlayerSyncRequestedEvent.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/groups/listener/SyncRankListener.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/groups/repositories/SyncRepository.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/mute/commands/MuteCommand.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/mute/commands/UnmuteCommand.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/mute/listeners/MuteChatListener.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/playerstate/events/PlayerStateDestroyedEvent.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/playerstate/events/PlayerStateUpdatedEvent.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/playerstate/listeners/PlayerStateListener.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/playerstate/listeners/PlayerSyncRequestListener.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/register/commands/CodeCommand.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/register/commands/RegisterCommand.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/sync/actions/GenerateAccountVerificationURL.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/sync/actions/UpdatePlayerGroups.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/sync/commands/SyncCommand.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/sync/commands/SyncOtherCommand.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/sync/listener/SyncRankOnJoinListener.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/sync/repositories/SyncRepository.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/utilities/commands/PCBridgeCommand.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warnings/actions/GetUnacknowledgedWarnings.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warnings/commands/WarningAcknowledgeCommand.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warnings/listeners/NotifyWarningsOnJoinListener.kt delete mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warnings/repositories/PlayerWarningRepository.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/support/spigot/SpigotEventBroadcaster.kt delete mode 100644 pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/bans/actions/AuthoriseConnectionTest.kt create mode 100644 pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/bans/actions/AuthorizeConnectionTest.kt delete mode 100644 pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/bans/actions/BanIPTest.kt delete mode 100644 pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/bans/actions/BanUUIDTest.kt delete mode 100644 pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/bans/actions/CheckBanUUIDTest.kt delete mode 100644 pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/bans/actions/UnbanIPTest.kt delete mode 100644 pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/bans/actions/UnbanUUIDTest.kt create mode 100644 pcbridge-web-server/build.gradle.kts create mode 100644 pcbridge-web-server/src/main/kotlin/com/projectcitybuild/pcbridge/webserver/HttpServer.kt create mode 100644 pcbridge-web-server/src/main/kotlin/com/projectcitybuild/pcbridge/webserver/HttpServerConfig.kt diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 619ef8216..fdac2d2f2 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -8,14 +8,14 @@ concurrency: cancel-in-progress: true jobs: - linter: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - uses: ./.github/actions/setup-java - - - name: Check code formatting - run: gradle ktlintCheck --scan +# linter: +# runs-on: ubuntu-latest +# steps: +# - uses: actions/checkout@v4 +# - uses: ./.github/actions/setup-java +# +# - name: Check code formatting +# run: gradle ktlintCheck --scan unit-tests: runs-on: ubuntu-latest diff --git a/build.gradle.kts b/build.gradle.kts index 0a08dd287..a6ce93efc 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,7 +1,7 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile val sharedGroup = "com.projectcitybuild.pcbridge" -val sharedVersion = "6.0.0" +val sharedVersion = "6.1.0" group = sharedGroup version = sharedVersion diff --git a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/HttpService.kt b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/HttpService.kt index a7fe1a203..97de28a8b 100644 --- a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/HttpService.kt +++ b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/HttpService.kt @@ -1,16 +1,10 @@ package com.projectcitybuild.pcbridge.http -import com.projectcitybuild.pcbridge.http.clients.MojangClient import com.projectcitybuild.pcbridge.http.clients.PCBClientFactory import com.projectcitybuild.pcbridge.http.parsing.ResponseParser -import com.projectcitybuild.pcbridge.http.services.mojang.PlayerUUIDHttpService -import com.projectcitybuild.pcbridge.http.services.pcb.AccountLinkHTTPService -import com.projectcitybuild.pcbridge.http.services.pcb.AggregateHttpService -import com.projectcitybuild.pcbridge.http.services.pcb.IPBanHttpService -import com.projectcitybuild.pcbridge.http.services.pcb.PlayerGroupHttpService -import com.projectcitybuild.pcbridge.http.services.pcb.PlayerWarningHttpService +import com.projectcitybuild.pcbridge.http.services.pcb.RegisterHttpService +import com.projectcitybuild.pcbridge.http.services.pcb.PlayerHttpService import com.projectcitybuild.pcbridge.http.services.pcb.TelemetryHttpService -import com.projectcitybuild.pcbridge.http.services.pcb.UUIDBanHttpService class HttpService( private val authToken: String, @@ -25,36 +19,15 @@ class HttpService( ).build() } - private val mojangClient by lazy { - MojangClient( - withLogging = withLogging, - ).build() - } - private val responseParser: ResponseParser get() = ResponseParser() - val playerUuid - get() = PlayerUUIDHttpService(mojangClient, responseParser) - - val playerGroup - get() = PlayerGroupHttpService(pcbClient, responseParser) - - val playerWarning - get() = PlayerWarningHttpService(pcbClient, responseParser) - - val uuidBan - get() = UUIDBanHttpService(pcbClient, responseParser) - - val ipBan - get() = IPBanHttpService(pcbClient, responseParser) - - val aggregate - get() = AggregateHttpService(pcbClient, responseParser) + val player + get() = PlayerHttpService(pcbClient, responseParser) val telemetry get() = TelemetryHttpService(pcbClient, responseParser) - val verificationURL - get() = AccountLinkHTTPService(pcbClient, responseParser) + val register + get() = RegisterHttpService(pcbClient, responseParser) } diff --git a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/RetrofitExtensions.kt b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/RetrofitExtensions.kt index 8f9f7181f..acb293c46 100644 --- a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/RetrofitExtensions.kt +++ b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/RetrofitExtensions.kt @@ -1,9 +1,6 @@ package com.projectcitybuild.pcbridge.http -import com.projectcitybuild.pcbridge.http.requests.MojangRequest import com.projectcitybuild.pcbridge.http.requests.PCBRequest import retrofit2.Retrofit internal fun Retrofit.pcb() = create(PCBRequest::class.java) - -internal fun Retrofit.mojang() = create(MojangRequest::class.java) diff --git a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/clients/MojangClient.kt b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/clients/MojangClient.kt deleted file mode 100644 index a1bba8541..000000000 --- a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/clients/MojangClient.kt +++ /dev/null @@ -1,32 +0,0 @@ -package com.projectcitybuild.pcbridge.http.clients - -import okhttp3.OkHttpClient -import okhttp3.logging.HttpLoggingInterceptor -import retrofit2.Retrofit -import retrofit2.converter.gson.GsonConverterFactory - -internal class MojangClient( - private val withLogging: Boolean, -) { - fun build(): Retrofit { - return Retrofit.Builder() - .client(client) - .baseUrl("https://api.mojang.com/") - .addConverterFactory(GsonConverterFactory.create()) - .build() - } - - private val client: OkHttpClient - get() { - var clientBuilder = OkHttpClient().newBuilder() - - if (withLogging) { - val loggingInterceptor = HttpLoggingInterceptor() - loggingInterceptor.level = HttpLoggingInterceptor.Level.BODY - - clientBuilder = clientBuilder.addInterceptor(loggingInterceptor) - } - - return clientBuilder.build() - } -} diff --git a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/clients/PCBClientFactory.kt b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/clients/PCBClientFactory.kt index 810e9c27c..63dbbd57b 100644 --- a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/clients/PCBClientFactory.kt +++ b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/clients/PCBClientFactory.kt @@ -1,34 +1,40 @@ package com.projectcitybuild.pcbridge.http.clients + +import com.google.gson.GsonBuilder +import com.projectcitybuild.pcbridge.http.deserializers.LocalDateTimeTypeAdapter import okhttp3.OkHttpClient import okhttp3.logging.HttpLoggingInterceptor import retrofit2.Retrofit import retrofit2.converter.gson.GsonConverterFactory +import java.time.LocalDateTime internal class PCBClientFactory( private val authToken: String, private val baseUrl: String, private val withLogging: Boolean, ) { - fun build(): Retrofit { - val authenticatedClient = makeAuthenticatedClient() - return Retrofit.Builder() - .baseUrl(baseUrl) - .client(authenticatedClient) - .addConverterFactory(GsonConverterFactory.create()) - .build() - } + private val gson = GsonBuilder() + .registerTypeAdapter(LocalDateTime::class.java, LocalDateTimeTypeAdapter()) + .create() + + fun build(): Retrofit = Retrofit.Builder() + .baseUrl(baseUrl) + .client(makeAuthenticatedClient()) + .addConverterFactory(GsonConverterFactory.create(gson)) + .build() private fun makeAuthenticatedClient(): OkHttpClient { var clientFactory = OkHttpClient().newBuilder() .addInterceptor { chain -> - // Add access token as header to each API request val request = chain.request() - val requestBuilder = request.newBuilder().header("Authorization", "Bearer $authToken") - val nextRequest = requestBuilder.build() + .newBuilder() + .header("Authorization", "Bearer $authToken") + .header("Accept", "application/json") + .build() - chain.proceed(nextRequest) + chain.proceed(request) } if (withLogging) { diff --git a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/deserializers/LocalDateTimeTypeAdapter.kt b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/deserializers/LocalDateTimeTypeAdapter.kt new file mode 100644 index 000000000..c9fd55cc1 --- /dev/null +++ b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/deserializers/LocalDateTimeTypeAdapter.kt @@ -0,0 +1,35 @@ +package com.projectcitybuild.pcbridge.http.deserializers + +import com.google.gson.JsonDeserializationContext +import com.google.gson.JsonDeserializer +import com.google.gson.JsonElement +import com.google.gson.JsonPrimitive +import com.google.gson.JsonSerializationContext +import com.google.gson.JsonSerializer +import java.lang.reflect.Type +import java.time.LocalDateTime +import java.time.format.DateTimeFormatter + +/** + * Adapter for a LocalDateTime so GSON stops freaking out when it sees one. + * Retrofit will use this for deserialization + */ +class LocalDateTimeTypeAdapter : JsonSerializer, JsonDeserializer { + private val formatter = DateTimeFormatter.ISO_DATE_TIME + + override fun serialize( + src: LocalDateTime?, + typeOfSrc: Type?, + context: JsonSerializationContext?, + ): JsonElement { + return JsonPrimitive(formatter.format(src)) + } + + override fun deserialize( + json: JsonElement?, + typeOfT: Type?, + context: JsonDeserializationContext?, + ): LocalDateTime? { + return LocalDateTime.parse(json?.asString, formatter) + } +} \ No newline at end of file diff --git a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/parsing/ApiError.kt b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/parsing/ApiError.kt deleted file mode 100644 index a3e2206ed..000000000 --- a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/parsing/ApiError.kt +++ /dev/null @@ -1,8 +0,0 @@ -package com.projectcitybuild.pcbridge.http.parsing - -data class ApiError( - val id: String, - val title: String, - val detail: String, - var status: Int, -) diff --git a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/parsing/ApiResponse.kt b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/parsing/ApiResponse.kt deleted file mode 100644 index db72b8530..000000000 --- a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/parsing/ApiResponse.kt +++ /dev/null @@ -1,6 +0,0 @@ -package com.projectcitybuild.pcbridge.http.parsing - -data class ApiResponse( - val data: T?, - val error: ApiError?, -) diff --git a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/parsing/ResponseParser.kt b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/parsing/ResponseParser.kt index e7a4874f1..142b8109d 100644 --- a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/parsing/ResponseParser.kt +++ b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/parsing/ResponseParser.kt @@ -7,42 +7,35 @@ import retrofit2.HttpException import java.io.IOException class ResponseParser { - data class ErrorBody(val error: ApiError) - - class HTTPError(val errorBody: ApiError?) : Exception( - if (errorBody != null) { - "Bad response received from the server: ${errorBody.detail}" - } else { - "Bad response received from the server (no error given)" - }, + data class ValidationErrorBody( + val message: String?, + val errors: Map>? ) - class NetworkError : Exception( - "Failed to contact PCB auth server", - ) + class NotFoundError : Exception() + + class ValidationError(message: String?) : Exception(message) suspend fun parse(apiCall: suspend () -> T): T = withContext(Dispatchers.IO) { try { apiCall.invoke() - } catch (_: IOException) { - throw NetworkError() + } catch (e: IOException) { + throw e } catch (e: HttpException) { - val code = e.code() - throw HTTPError(errorBody = convertErrorBody(e, code)) + when (e.code()) { + 404 -> throw NotFoundError() + 422 -> { + val body = e.response()?.errorBody()?.string().let { + val errorBody = Gson().fromJson(it, ValidationErrorBody::class.java) + errorBody + } + throw ValidationError(body.message) + } + else -> throw e + } } catch (e: Exception) { throw e } } - - private fun convertErrorBody( - e: HttpException, - code: Int, - ): ApiError? { - e.response()?.errorBody()?.string().let { - val errorBody = Gson().fromJson(it, ErrorBody::class.java).error - errorBody.status = code - return errorBody - } - } } diff --git a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/requests/MojangRequest.kt b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/requests/MojangRequest.kt deleted file mode 100644 index 7c8d7e416..000000000 --- a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/requests/MojangRequest.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.projectcitybuild.pcbridge.http.requests - -import com.projectcitybuild.pcbridge.http.responses.MojangPlayer -import retrofit2.http.GET -import retrofit2.http.Path -import retrofit2.http.Query - -internal interface MojangRequest { - @GET("users/profiles/minecraft/{username}") - suspend fun getMojangPlayer( - @Path("username") playerName: String, - @Query("at") timestamp: Long? = null, - ): MojangPlayer? -} diff --git a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/requests/PCBRequest.kt b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/requests/PCBRequest.kt index 6d8cd9d84..aca552eec 100644 --- a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/requests/PCBRequest.kt +++ b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/requests/PCBRequest.kt @@ -1,156 +1,55 @@ package com.projectcitybuild.pcbridge.http.requests -import com.projectcitybuild.pcbridge.http.parsing.ApiResponse -import com.projectcitybuild.pcbridge.http.responses.Account -import com.projectcitybuild.pcbridge.http.responses.Aggregate -import com.projectcitybuild.pcbridge.http.responses.AuthURL -import com.projectcitybuild.pcbridge.http.responses.DonationPerk -import com.projectcitybuild.pcbridge.http.responses.IPBan -import com.projectcitybuild.pcbridge.http.responses.PlayerBan -import com.projectcitybuild.pcbridge.http.responses.PlayerWarning +import com.projectcitybuild.pcbridge.http.responses.PlayerData import retrofit2.http.Field import retrofit2.http.FormUrlEncoded import retrofit2.http.GET import retrofit2.http.POST +import retrofit2.http.PUT import retrofit2.http.Path import retrofit2.http.Query internal interface PCBRequest { /** - * Begins the authentication flow by exchanging a player's UUID - * for a URL that they can click and login with + * Fetches all data for the given UUID, such as ban status, + * user groups and badges */ - @POST("auth/minecraft") - @FormUrlEncoded - suspend fun getVerificationUrl( - @Field("minecraft_uuid") uuid: String, - ): ApiResponse + @GET("v2/minecraft/player/{uuid}") + suspend fun getPlayer( + @Path(value = "uuid") uuid: String, + @Query("ip") ip: String, + ): PlayerData /** - * Fetches the groups that the given UUID belongs to + * Begins registration of a PCB account linked to the current + * Minecraft player */ - @GET("auth/minecraft/{uuid}") - suspend fun getUserGroups( + @POST("v2/minecraft/player/{uuid}/register") + @FormUrlEncoded + suspend fun sendRegisterCode( @Path(value = "uuid") uuid: String, - ): ApiResponse + @Field(value = "minecraft_alias") playerAlias: String, + @Field(value = "email") email: String, + ) /** - * Fetches various data for the given uuid, such as ban status - * and user groups. This is to make the login more efficient by - * combining everything into one request + * Finishes registration by verifying the code sent to them + * over email */ - @GET("v2/minecraft/{uuid}/aggregate") - suspend fun getAggregate( - @Path(value = "uuid") uuid: String, - @Query("ip") ip: String, - ): ApiResponse - - @GET("v2/minecraft/{uuid}/donation-tiers") - suspend fun getDonationTier( - @Path(value = "uuid") uuid: String, - ): ApiResponse> - - @POST("v2/bans/ip/ban") - @FormUrlEncoded - suspend fun banIP( - @Field("ip_address") ip: String, - @Field("banner_player_id") bannerPlayerId: String?, - @Field("banner_player_type") bannerPlayerType: String = "minecraft_uuid", - @Field("banner_player_alias") bannerPlayerAlias: String, - @Field("reason") reason: String, - ): ApiResponse - - @POST("v2/bans/ip/unban") - @FormUrlEncoded - suspend fun unbanIP( - @Field("ip_address") ip: String, - @Field("unbanner_player_id") unbannerPlayerId: String?, - @Field("unbanner_player_type") unbannerPlayerType: String = "minecraft_uuid", - @Field("unbanner_player_alias") unbannerPlayerAlias: String, - ): ApiResponse - - @POST("v2/bans/ip/status") - @FormUrlEncoded - suspend fun getIPStatus( - @Field("ip_address") ip: String, - ): ApiResponse - - @POST("v2/bans/player/ban") + @PUT("v2/minecraft/player/{uuid}/register") @FormUrlEncoded - suspend fun banUUID( - @Field("banned_player_id") bannedPlayerId: String, - @Field("banned_player_type") bannedPlayerType: String = "minecraft_uuid", - @Field("banned_player_alias") bannedPlayerAlias: String, - @Field("banner_player_id") bannerPlayerId: String?, - @Field("banner_player_type") bannerPlayerType: String = "minecraft_uuid", - @Field("banner_player_alias") bannerPlayerAlias: String, - @Field("reason") reason: String? = null, - @Field("expires_at") expiresAt: Long?, - ): ApiResponse - - @POST("v2/bans/player/unban") - @FormUrlEncoded - suspend fun unbanUUID( - @Field("banned_player_id") bannedPlayerId: String, - @Field("banned_player_type") bannedPlayerType: String = "minecraft_uuid", - @Field("unbanner_player_id") unbannerPlayerId: String?, - @Field("unbanner_player_type") unbannerPlayerType: String = "minecraft_uuid", - ): ApiResponse - - @POST("v2/bans/player/status") - @FormUrlEncoded - suspend fun getUuidBanStatus( - @Field("player_id") playerId: String, - @Field("player_type") playerType: String = "minecraft_uuid", - ): ApiResponse - - @POST("v2/bans/player/all") - @FormUrlEncoded - suspend fun getUUIDBans( - @Field("player_id") playerId: String, - @Field("player_id_type") playerType: String = "minecraft_uuid", - ): ApiResponse> - - @POST("v2/bans/player/ban") - @FormUrlEncoded - suspend fun convertToPermanentBan( - @Field("ban_id") bannedPlayerId: String, - @Field("banner_player_id") bannerPlayerId: String, - @Field("banner_player_type") bannerPlayerType: String = "minecraft_uuid", - @Field("banner_player_alias") bannerPlayerAlias: String, - @Field("reason") reason: String? = null, - ): ApiResponse - - @GET("v2/warnings") - suspend fun getWarnings( - @Query("player_id") playerId: String, - @Query("player_type") playerType: String = "minecraft_uuid", - @Query("player_alias") playerAlias: String, - ): ApiResponse> - - @POST("v2/warnings") - @FormUrlEncoded - suspend fun createWarning( - @Field("warned_player_id") warnedPlayerId: String, - @Field("warned_player_type") warnedPlayerType: String = "minecraft_uuid", - @Field("warned_player_alias") warnedPlayerAlias: String, - @Field("warner_player_id") warnerPlayerId: String, - @Field("warner_player_type") warnerPlayerType: String = "minecraft_uuid", - @Field("warner_player_alias") warnerPlayerAlias: String, - @Field("reason") reason: String, - @Field("weight") weight: Int = 1, - ): ApiResponse - - @POST("v2/warnings/acknowledge") - @FormUrlEncoded - suspend fun acknowledgeWarning( - @Field("warning_id") warningId: Int, - ): ApiResponse + suspend fun verifyRegisterCode( + @Path(value = "uuid") uuid: String, + @Field(value = "code") code: String, + ) + /** + * Updates the last seen date of the player + */ @POST("v2/minecraft/telemetry/seen") @FormUrlEncoded suspend fun telemetrySeen( @Field(value = "uuid") playerUUID: String, @Field(value = "alias") playerName: String, - ): ApiResponse + ) } diff --git a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/Account.kt b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/Account.kt index 2803f4723..e4407854a 100644 --- a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/Account.kt +++ b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/Account.kt @@ -1,13 +1,16 @@ package com.projectcitybuild.pcbridge.http.responses import com.google.gson.annotations.SerializedName -import java.util.UUID +import kotlinx.serialization.Serializable +@Serializable data class Account( @SerializedName("account_id") - val id: String = UUID.randomUUID().toString(), + val id: String, + @SerializedName("username") - val username: String = "username", + val username: String, + @SerializedName("groups") - val groups: List = listOf(), + val groups: List = emptyList(), ) diff --git a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/AuthURL.kt b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/AuthURL.kt deleted file mode 100644 index ee517202f..000000000 --- a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/AuthURL.kt +++ /dev/null @@ -1,8 +0,0 @@ -package com.projectcitybuild.pcbridge.http.responses - -import com.google.gson.annotations.SerializedName - -data class AuthURL( - @SerializedName("url") - val url: String, -) diff --git a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/Badge.kt b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/Badge.kt index ba5d0db6d..8db7b1ebc 100644 --- a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/Badge.kt +++ b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/Badge.kt @@ -6,7 +6,8 @@ import kotlinx.serialization.Serializable @Serializable data class Badge( @SerializedName("display_name") - val displayName: String = "display_name", + val displayName: String, + @SerializedName("unicode_icon") - val unicodeIcon: String = "✦", + val unicodeIcon: String, ) diff --git a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/DonationPerk.kt b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/DonationPerk.kt index 616f8261e..172572f6c 100644 --- a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/DonationPerk.kt +++ b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/DonationPerk.kt @@ -1,20 +1,22 @@ package com.projectcitybuild.pcbridge.http.responses import com.google.gson.annotations.SerializedName -import java.time.LocalDate -import java.time.ZoneId +import com.projectcitybuild.pcbridge.http.serializable.LocalDateTimeSerializer +import kotlinx.serialization.Serializable +import java.time.LocalDateTime +@Serializable data class DonationPerk( @SerializedName("donation_perks_id") - val id: Int = Math.random().toInt(), + val id: Int, + @SerializedName("is_active") - val isActive: Boolean = true, + val isActive: Boolean, + @SerializedName("expires_at") - val expiresAt: Long = - LocalDate.now() - .plusMonths(1) - .atStartOfDay(ZoneId.systemDefault()) - .toEpochSecond(), + @Serializable(with = LocalDateTimeSerializer::class) + val expiresAt: LocalDateTime, + @SerializedName("donation_tier") val donationTier: DonationTier, ) diff --git a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/DonationTier.kt b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/DonationTier.kt index 83383d430..dd5122119 100644 --- a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/DonationTier.kt +++ b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/DonationTier.kt @@ -1,10 +1,13 @@ package com.projectcitybuild.pcbridge.http.responses import com.google.gson.annotations.SerializedName +import kotlinx.serialization.Serializable +@Serializable data class DonationTier( @SerializedName("donation_tier_id") - val id: Int = Math.random().toInt(), + val id: Int, + @SerializedName("name") - val name: String = "name", + val name: String, ) diff --git a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/Group.kt b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/Group.kt index 5092ffba8..3dc205530 100644 --- a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/Group.kt +++ b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/Group.kt @@ -1,20 +1,16 @@ package com.projectcitybuild.pcbridge.http.responses import com.google.gson.annotations.SerializedName +import kotlinx.serialization.Serializable +@Serializable data class Group( @SerializedName("group_id") - val id: Int = Math.random().toInt(), + val id: Int, + @SerializedName("name") - val name: String = "name", - @SerializedName("alias") - val alias: String? = null, + val name: String, + @SerializedName("minecraft_name") val minecraftName: String?, - @SerializedName("is_default") - private val _isDefault: Boolean = false, - @SerializedName("is_staff") - private val _isStaff: Boolean = false, - @SerializedName("is_admin") - private val _isAdmin: Boolean = false, ) diff --git a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/IPBan.kt b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/IPBan.kt index d21137d57..cbea2f30b 100644 --- a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/IPBan.kt +++ b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/IPBan.kt @@ -1,31 +1,36 @@ package com.projectcitybuild.pcbridge.http.responses import com.google.gson.annotations.SerializedName -import java.time.LocalDate -import java.time.ZoneId -import java.util.UUID +import com.projectcitybuild.pcbridge.http.serializable.LocalDateTimeSerializer +import kotlinx.serialization.Serializable +import java.time.LocalDateTime +@Serializable data class IPBan( @SerializedName("id") - val id: Int = Math.random().toInt(), + val id: Int, + @SerializedName("banner_player_id") - val bannerPlayerId: String = UUID.randomUUID().toString(), + val bannerPlayerId: Int, + @SerializedName("reason") - val reason: String = "reason", + val reason: String? = null, + @SerializedName("created_at") - val createdAt: Long = - LocalDate.now() - .atStartOfDay(ZoneId.systemDefault()) - .toEpochSecond(), + @Serializable(with = LocalDateTimeSerializer::class) + val createdAt: LocalDateTime, + @SerializedName("updated_at") - val updatedAt: Long = - LocalDate.now() - .atStartOfDay(ZoneId.systemDefault()) - .toEpochSecond(), + @Serializable(with = LocalDateTimeSerializer::class) + val updatedAt: LocalDateTime, + @SerializedName("unbanned_at") - val unbannedAt: Long? = null, + @Serializable(with = LocalDateTimeSerializer::class) + val unbannedAt: LocalDateTime? = null, + @SerializedName("unbanner_player_id") val unbannerPlayerId: String? = null, + @SerializedName("unban_type") val unbanType: String? = null, ) { diff --git a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/MojangPlayer.kt b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/MojangPlayer.kt deleted file mode 100644 index 2980df9af..000000000 --- a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/MojangPlayer.kt +++ /dev/null @@ -1,10 +0,0 @@ -package com.projectcitybuild.pcbridge.http.responses - -import com.google.gson.annotations.SerializedName - -data class MojangPlayer( - @SerializedName("id") - val uuid: String, - @SerializedName("name") - val alias: String, -) diff --git a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/PlayerBan.kt b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/PlayerBan.kt index dea63e627..d4a1e116e 100644 --- a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/PlayerBan.kt +++ b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/PlayerBan.kt @@ -1,39 +1,46 @@ package com.projectcitybuild.pcbridge.http.responses import com.google.gson.annotations.SerializedName -import java.time.LocalDate -import java.time.ZoneId -import java.util.UUID +import com.projectcitybuild.pcbridge.http.serializable.LocalDateTimeSerializer +import kotlinx.serialization.Serializable +import java.time.LocalDateTime +@Serializable data class PlayerBan( @SerializedName("id") - val id: Int = Math.random().toInt(), - @SerializedName("server_id") - val serverId: Int = Math.random().toInt(), + val id: Int, + @SerializedName("banned_player_id") - val bannedPlayerId: String = UUID.randomUUID().toString(), + val bannedPlayerId: Int, + @SerializedName("banned_player_alias") - val bannedPlayerAlias: String = "name", + val bannedPlayerAlias: String, + @SerializedName("banner_player_id") - val bannerPlayerId: String? = UUID.randomUUID().toString(), + val bannerPlayerId: Int? = null, + @SerializedName("reason") - val reason: String? = "reason", + val reason: String? = null, + @SerializedName("created_at") - val createdAt: Long = - LocalDate.now() - .atStartOfDay(ZoneId.systemDefault()) - .toEpochSecond(), + @Serializable(with = LocalDateTimeSerializer::class) + val createdAt: LocalDateTime, + @SerializedName("updated_at") - val updatedAt: Long = - LocalDate.now() - .atStartOfDay(ZoneId.systemDefault()) - .toEpochSecond(), + @Serializable(with = LocalDateTimeSerializer::class) + val updatedAt: LocalDateTime, + @SerializedName("expires_at") - val expiresAt: Long? = null, + @Serializable(with = LocalDateTimeSerializer::class) + val expiresAt: LocalDateTime? = null, + @SerializedName("unbanned_at") - var unbannedAt: Long? = null, + @Serializable(with = LocalDateTimeSerializer::class) + var unbannedAt: LocalDateTime? = null, + @SerializedName("unbanner_player_id") var unbannerPlayerId: String? = null, + @SerializedName("unban_type") var unbanType: String? = null, ) { diff --git a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/Aggregate.kt b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/PlayerData.kt similarity index 84% rename from pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/Aggregate.kt rename to pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/PlayerData.kt index 5e760bca3..63d1538c9 100644 --- a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/Aggregate.kt +++ b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/PlayerData.kt @@ -1,16 +1,22 @@ package com.projectcitybuild.pcbridge.http.responses import com.google.gson.annotations.SerializedName +import kotlinx.serialization.Serializable -data class Aggregate( +@Serializable +data class PlayerData( @SerializedName("account") val account: Account? = null, + @SerializedName("ban") val playerBan: PlayerBan? = null, + @SerializedName("ip_ban") val ipBan: IPBan? = null, + @SerializedName("badges") val badges: List = emptyList(), + @SerializedName("donation_tiers") val donationPerks: List = emptyList(), ) diff --git a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/PlayerWarning.kt b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/PlayerWarning.kt deleted file mode 100644 index 8c04d50ca..000000000 --- a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/PlayerWarning.kt +++ /dev/null @@ -1,26 +0,0 @@ -package com.projectcitybuild.pcbridge.http.responses - -import com.google.gson.annotations.SerializedName - -data class PlayerWarning( - @SerializedName("id") - val id: Int, - @SerializedName("warned_player_id") - val warnedPlayerId: String, - @SerializedName("warner_player_id") - val warnerPlayerId: String, - @SerializedName("reason") - val reason: String, - @SerializedName("additional_info") - val additionalInfo: String?, - @SerializedName("weight") - val weight: Int, - @SerializedName("is_acknowledged") - val isAcknowledged: Boolean, - @SerializedName("created_at") - val createdAt: Long, - @SerializedName("updated_at") - val updatedAt: Long, - @SerializedName("acknowledged_at") - val acknowledgedAt: Long?, -) diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/support/serializable/LocalDateTimeSerializer.kt b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/serializable/LocalDateTimeSerializer.kt similarity index 51% rename from pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/support/serializable/LocalDateTimeSerializer.kt rename to pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/serializable/LocalDateTimeSerializer.kt index 7ab749aac..ea7bec761 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/support/serializable/LocalDateTimeSerializer.kt +++ b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/serializable/LocalDateTimeSerializer.kt @@ -1,27 +1,23 @@ -package com.projectcitybuild.pcbridge.support.serializable +package com.projectcitybuild.pcbridge.http.serializable import kotlinx.serialization.KSerializer import kotlinx.serialization.descriptors.PrimitiveKind import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor import kotlinx.serialization.encoding.Decoder import kotlinx.serialization.encoding.Encoder -import java.time.Instant import java.time.LocalDateTime -import java.time.ZoneId -import java.time.ZoneOffset +import java.time.format.DateTimeFormatter object LocalDateTimeSerializer : KSerializer { - override val descriptor = PrimitiveSerialDescriptor("LocalDateTime", PrimitiveKind.LONG) + private val formatter: DateTimeFormatter = DateTimeFormatter.ISO_DATE_TIME - override fun deserialize(decoder: Decoder): LocalDateTime { - val instant = Instant.ofEpochSecond(decoder.decodeLong()) - return LocalDateTime.ofInstant(instant, ZoneId.of(ZoneOffset.UTC.id)) + override val descriptor = PrimitiveSerialDescriptor("LocalDateTime", PrimitiveKind.STRING) + + override fun serialize(encoder: Encoder, value: LocalDateTime) { + encoder.encodeString(value.format(formatter)) } - override fun serialize( - encoder: Encoder, - value: LocalDateTime, - ) { - encoder.encodeLong(value.toEpochSecond(ZoneOffset.UTC)) + override fun deserialize(decoder: Decoder): LocalDateTime { + return LocalDateTime.parse(decoder.decodeString(), formatter) } } diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/support/serializable/UUIDSerializer.kt b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/serializable/UUIDSerializer.kt similarity index 91% rename from pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/support/serializable/UUIDSerializer.kt rename to pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/serializable/UUIDSerializer.kt index ce17f4723..2347d142e 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/support/serializable/UUIDSerializer.kt +++ b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/serializable/UUIDSerializer.kt @@ -1,4 +1,4 @@ -package com.projectcitybuild.pcbridge.support.serializable +package com.projectcitybuild.pcbridge.http.serializable import kotlinx.serialization.KSerializer import kotlinx.serialization.descriptors.PrimitiveKind diff --git a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/services/mojang/PlayerUUIDHttpService.kt b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/services/mojang/PlayerUUIDHttpService.kt deleted file mode 100644 index 665552065..000000000 --- a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/services/mojang/PlayerUUIDHttpService.kt +++ /dev/null @@ -1,30 +0,0 @@ -package com.projectcitybuild.pcbridge.http.services.mojang - -import com.projectcitybuild.pcbridge.http.mojang -import com.projectcitybuild.pcbridge.http.parsing.ResponseParser -import com.projectcitybuild.pcbridge.http.responses.MojangPlayer -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.withContext -import retrofit2.Retrofit - -class PlayerUUIDHttpService( - private val retrofit: Retrofit, - private val responseParser: ResponseParser, -) { - class PlayerNotFoundException : Exception() - - suspend fun get( - playerName: String, - at: Long? = null, - ): MojangPlayer? = - withContext(Dispatchers.IO) { - responseParser.parse { - try { - retrofit.mojang().getMojangPlayer(playerName) - } catch (e: KotlinNullPointerException) { - // Hacky workaround to catch 204 HTTP errors (username not found) - throw PlayerNotFoundException() - } - } - } -} diff --git a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/services/pcb/AccountLinkHTTPService.kt b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/services/pcb/AccountLinkHTTPService.kt deleted file mode 100644 index 59d3d52c8..000000000 --- a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/services/pcb/AccountLinkHTTPService.kt +++ /dev/null @@ -1,39 +0,0 @@ -package com.projectcitybuild.pcbridge.http.services.pcb - -import com.projectcitybuild.pcbridge.http.parsing.ResponseParser -import com.projectcitybuild.pcbridge.http.pcb -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.withContext -import retrofit2.Retrofit -import java.util.UUID -import kotlin.jvm.Throws - -class AccountLinkHTTPService( - private val retrofit: Retrofit, - private val responseParser: ResponseParser, -) { - class AlreadyLinkedException : Exception() - - @Throws(AlreadyLinkedException::class) - suspend fun generateVerificationURL(playerUUID: UUID): String? = - withContext(Dispatchers.IO) { - try { - val response = - responseParser.parse { - retrofit.pcb().getVerificationUrl(uuid = playerUUID.toString()) - } - val data = response.data - - if (data == null || data.url.isEmpty()) { - null - } else { - data.url - } - } catch (e: ResponseParser.HTTPError) { - if (e.errorBody?.id == "already_authenticated") { - throw AlreadyLinkedException() - } - throw e - } - } -} diff --git a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/services/pcb/IPBanHttpService.kt b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/services/pcb/IPBanHttpService.kt deleted file mode 100644 index e820fd3fc..000000000 --- a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/services/pcb/IPBanHttpService.kt +++ /dev/null @@ -1,72 +0,0 @@ -package com.projectcitybuild.pcbridge.http.services.pcb - -import com.projectcitybuild.pcbridge.http.parsing.ResponseParser -import com.projectcitybuild.pcbridge.http.pcb -import com.projectcitybuild.pcbridge.http.responses.IPBan -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.withContext -import retrofit2.Retrofit -import java.util.UUID - -class IPBanHttpService( - private val retrofit: Retrofit, - private val responseParser: ResponseParser, -) { - class IPAlreadyBannedException : Exception() - - class IPNotBannedException : Exception() - - suspend fun get(ip: String): IPBan? { - val response = - responseParser.parse { - retrofit.pcb().getIPStatus(ip = ip) - } - return response.data - } - - @Throws(IPAlreadyBannedException::class) - suspend fun ban( - ip: String, - bannerUUID: UUID?, - bannerName: String, - reason: String, - ) = withContext(Dispatchers.IO) { - try { - responseParser.parse { - retrofit.pcb().banIP( - ip = ip, - bannerPlayerId = bannerUUID.toString(), - bannerPlayerAlias = bannerName, - reason = reason, - ) - } - } catch (e: ResponseParser.HTTPError) { - if (e.errorBody?.id == "ip_already_banned") { - throw IPAlreadyBannedException() - } - throw e - } - } - - @Throws(IPNotBannedException::class) - suspend fun unban( - ip: String, - unbannerUUID: UUID?, - unbannerName: String, - ) = withContext(Dispatchers.IO) { - try { - responseParser.parse { - retrofit.pcb().unbanIP( - ip = ip, - unbannerPlayerId = unbannerUUID.toString(), - unbannerPlayerAlias = unbannerName, - ) - } - } catch (e: ResponseParser.HTTPError) { - if (e.errorBody?.id == "ip_not_banned") { - throw IPNotBannedException() - } - throw e - } - } -} diff --git a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/services/pcb/PlayerGroupHttpService.kt b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/services/pcb/PlayerGroupHttpService.kt deleted file mode 100644 index 637c30287..000000000 --- a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/services/pcb/PlayerGroupHttpService.kt +++ /dev/null @@ -1,55 +0,0 @@ -package com.projectcitybuild.pcbridge.http.services.pcb - -import com.projectcitybuild.pcbridge.http.parsing.ResponseParser -import com.projectcitybuild.pcbridge.http.pcb -import com.projectcitybuild.pcbridge.http.responses.DonationPerk -import com.projectcitybuild.pcbridge.http.responses.Group -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.withContext -import retrofit2.Retrofit -import java.util.UUID - -class PlayerGroupHttpService( - private val retrofit: Retrofit, - private val responseParser: ResponseParser, -) { - class NoLinkedAccountException : Exception() - - @Throws(NoLinkedAccountException::class) - suspend fun getGroups(playerUUID: UUID): List = - withContext(Dispatchers.IO) { - val response = - try { - responseParser.parse { - retrofit.pcb().getUserGroups( - uuid = playerUUID.toString(), - ) - } - } catch (e: ResponseParser.HTTPError) { - if (e.errorBody?.id == "account_not_linked") { - throw NoLinkedAccountException() - } - throw e - } - response.data?.groups ?: listOf() - } - - @Throws(NoLinkedAccountException::class) - suspend fun getDonorPerks(playerUUID: UUID): List = - withContext(Dispatchers.IO) { - val response = - try { - responseParser.parse { - retrofit.pcb().getDonationTier( - uuid = playerUUID.toString(), - ) - } - } catch (e: ResponseParser.HTTPError) { - if (e.errorBody?.id == "account_not_linked") { - throw NoLinkedAccountException() - } - throw e - } - response.data?.toList() ?: listOf() - } -} diff --git a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/services/pcb/AggregateHttpService.kt b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/services/pcb/PlayerHttpService.kt similarity index 56% rename from pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/services/pcb/AggregateHttpService.kt rename to pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/services/pcb/PlayerHttpService.kt index 59928f48b..d29a7c33d 100644 --- a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/services/pcb/AggregateHttpService.kt +++ b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/services/pcb/PlayerHttpService.kt @@ -2,28 +2,26 @@ package com.projectcitybuild.pcbridge.http.services.pcb import com.projectcitybuild.pcbridge.http.parsing.ResponseParser import com.projectcitybuild.pcbridge.http.pcb -import com.projectcitybuild.pcbridge.http.responses.Aggregate +import com.projectcitybuild.pcbridge.http.responses.PlayerData import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import retrofit2.Retrofit import java.util.UUID -class AggregateHttpService( +class PlayerHttpService( private val retrofit: Retrofit, private val responseParser: ResponseParser, ) { suspend fun get( playerUUID: UUID, ip: String, - ): Aggregate? = + ): PlayerData = withContext(Dispatchers.IO) { - val response = - responseParser.parse { - retrofit.pcb().getAggregate( - uuid = playerUUID.toString(), - ip = ip, - ) - } - response.data + responseParser.parse { + retrofit.pcb().getPlayer( + uuid = playerUUID.toString(), + ip = ip, + ) + } } } diff --git a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/services/pcb/PlayerWarningHttpService.kt b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/services/pcb/PlayerWarningHttpService.kt deleted file mode 100644 index 13e6f3cfc..000000000 --- a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/services/pcb/PlayerWarningHttpService.kt +++ /dev/null @@ -1,61 +0,0 @@ -package com.projectcitybuild.pcbridge.http.services.pcb - -import com.projectcitybuild.pcbridge.http.parsing.ResponseParser -import com.projectcitybuild.pcbridge.http.pcb -import com.projectcitybuild.pcbridge.http.responses.PlayerWarning -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.withContext -import retrofit2.Retrofit -import java.util.UUID - -class PlayerWarningHttpService( - private val retrofit: Retrofit, - private val responseParser: ResponseParser, -) { - suspend fun get( - playerUUID: UUID, - playerName: String, - ): List = - withContext(Dispatchers.IO) { - val response = - responseParser.parse { - retrofit.pcb().getWarnings( - playerId = playerUUID.toString(), - playerAlias = playerName, - ) - } - response.data ?: listOf() - } - - suspend fun create( - warnedPlayerUUID: UUID, - warnedPlayerName: String, - warnerPlayerUUID: UUID, - warnerPlayerName: String, - reason: String, - ): PlayerWarning? = - withContext(Dispatchers.IO) { - val response = - responseParser.parse { - retrofit.pcb().createWarning( - warnedPlayerId = warnedPlayerUUID.toString(), - warnedPlayerAlias = warnedPlayerName, - warnerPlayerId = warnerPlayerUUID.toString(), - warnerPlayerAlias = warnerPlayerName, - reason = reason, - ) - } - response.data - } - - suspend fun acknowledge(warningId: Int): PlayerWarning? = - withContext(Dispatchers.IO) { - val response = - responseParser.parse { - retrofit.pcb().acknowledgeWarning( - warningId = warningId, - ) - } - response.data - } -} diff --git a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/services/pcb/RegisterHttpService.kt b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/services/pcb/RegisterHttpService.kt new file mode 100644 index 000000000..1915d8daa --- /dev/null +++ b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/services/pcb/RegisterHttpService.kt @@ -0,0 +1,34 @@ +package com.projectcitybuild.pcbridge.http.services.pcb + +import com.projectcitybuild.pcbridge.http.parsing.ResponseParser +import com.projectcitybuild.pcbridge.http.pcb +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext +import retrofit2.Retrofit +import java.util.UUID + +class RegisterHttpService( + private val retrofit: Retrofit, + private val responseParser: ResponseParser, +) { + suspend fun sendCode(playerUUID: UUID, playerAlias: String, email: String) = + withContext(Dispatchers.IO) { + responseParser.parse { + retrofit.pcb().sendRegisterCode( + uuid = playerUUID.toString(), + playerAlias = playerAlias, + email = email, + ) + } + } + + suspend fun verifyCode(playerUUID: UUID, code: String) = + withContext(Dispatchers.IO) { + responseParser.parse { + retrofit.pcb().verifyRegisterCode( + uuid = playerUUID.toString(), + code = code, + ) + } + } +} diff --git a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/services/pcb/UUIDBanHttpService.kt b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/services/pcb/UUIDBanHttpService.kt deleted file mode 100644 index e27c745c7..000000000 --- a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/services/pcb/UUIDBanHttpService.kt +++ /dev/null @@ -1,81 +0,0 @@ -package com.projectcitybuild.pcbridge.http.services.pcb - -import com.projectcitybuild.pcbridge.http.parsing.ResponseParser -import com.projectcitybuild.pcbridge.http.pcb -import com.projectcitybuild.pcbridge.http.responses.PlayerBan -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.withContext -import retrofit2.Retrofit -import java.util.UUID - -class UUIDBanHttpService( - private val retrofit: Retrofit, - private val responseParser: ResponseParser, -) { - class UUIDAlreadyBannedException : Exception() - - class UUIDNotBannedException : Exception() - - suspend fun get(targetPlayerUUID: UUID): PlayerBan? = - withContext(Dispatchers.IO) { - val response = - responseParser.parse { - retrofit.pcb().getUuidBanStatus( - playerId = targetPlayerUUID.toString(), - ) - } - val ban = response.data - if (ban?.unbannedAt != null) { - null - } - ban - } - - @Throws(UUIDAlreadyBannedException::class) - suspend fun ban( - targetPlayerUUID: UUID, - targetPlayerName: String, - bannerPlayerUUID: UUID?, - bannerPlayerName: String, - reason: String?, - expiryDate: Long? = null, - ) = withContext(Dispatchers.IO) { - try { - responseParser.parse { - retrofit.pcb().banUUID( - bannedPlayerId = targetPlayerUUID.toString(), - bannedPlayerAlias = targetPlayerName, - bannerPlayerId = bannerPlayerUUID.toString(), - bannerPlayerAlias = bannerPlayerName, - reason = reason, - expiresAt = expiryDate, - ) - } - } catch (e: ResponseParser.HTTPError) { - if (e.errorBody?.id == "player_already_banned") { - throw UUIDAlreadyBannedException() - } - throw e - } - } - - @Throws(UUIDNotBannedException::class) - suspend fun unban( - targetPlayerUUID: UUID, - unbannerUUID: UUID?, - ) = withContext(Dispatchers.IO) { - try { - responseParser.parse { - retrofit.pcb().unbanUUID( - bannedPlayerId = targetPlayerUUID.toString(), - unbannerPlayerId = unbannerUUID.toString(), - ) - } - } catch (e: ResponseParser.HTTPError) { - if (e.errorBody?.id == "player_not_banned") { - throw UUIDNotBannedException() - } - throw e - } - } -} diff --git a/pcbridge-spigot/build.gradle.kts b/pcbridge-spigot/build.gradle.kts index c7d313e83..bee3d7390 100644 --- a/pcbridge-spigot/build.gradle.kts +++ b/pcbridge-spigot/build.gradle.kts @@ -24,6 +24,7 @@ repositories { dependencies { implementation(project(":pcbridge-http")) + implementation(project(":pcbridge-web-server")) // Paper compileOnly("io.papermc.paper:paper-api:1.20.2-R0.1-SNAPSHOT") diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/Container.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/Container.kt index d4733f052..6cd569c69 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/Container.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/Container.kt @@ -15,27 +15,14 @@ import com.projectcitybuild.pcbridge.core.state.Store import com.projectcitybuild.pcbridge.data.PluginConfig import com.projectcitybuild.pcbridge.features.announcements.listeners.AnnouncementEnableListener import com.projectcitybuild.pcbridge.features.announcements.repositories.AnnouncementRepository -import com.projectcitybuild.pcbridge.features.bans.actions.AuthoriseConnection -import com.projectcitybuild.pcbridge.features.bans.actions.BanIP -import com.projectcitybuild.pcbridge.features.bans.actions.BanUUID -import com.projectcitybuild.pcbridge.features.bans.actions.CheckUUIDBan -import com.projectcitybuild.pcbridge.features.bans.actions.UnbanIP -import com.projectcitybuild.pcbridge.features.bans.actions.UnbanUUID -import com.projectcitybuild.pcbridge.features.bans.commands.BanCommand -import com.projectcitybuild.pcbridge.features.bans.commands.BanIPCommand -import com.projectcitybuild.pcbridge.features.bans.commands.CheckBanCommand -import com.projectcitybuild.pcbridge.features.bans.commands.UnbanCommand -import com.projectcitybuild.pcbridge.features.bans.commands.UnbanIPCommand +import com.projectcitybuild.pcbridge.features.bans.actions.AuthorizeConnection import com.projectcitybuild.pcbridge.features.bans.listeners.AuthorizeConnectionListener -import com.projectcitybuild.pcbridge.features.bans.repositories.AggregateRepository -import com.projectcitybuild.pcbridge.features.bans.repositories.IPBanRepository -import com.projectcitybuild.pcbridge.features.bans.repositories.PlayerBanRepository -import com.projectcitybuild.pcbridge.features.bans.repositories.PlayerUUIDRepository +import com.projectcitybuild.pcbridge.features.bans.repositories.PlayerRepository import com.projectcitybuild.pcbridge.features.chat.ChatBadgeFormatter import com.projectcitybuild.pcbridge.features.chat.ChatGroupFormatter import com.projectcitybuild.pcbridge.features.chat.listeners.EmojiChatListener import com.projectcitybuild.pcbridge.features.chat.listeners.FormatNameChatListener -import com.projectcitybuild.pcbridge.features.chat.listeners.SyncBadgesOnJoinListener +import com.projectcitybuild.pcbridge.features.chat.listeners.SyncPlayerChatListener import com.projectcitybuild.pcbridge.features.chat.repositories.ChatBadgeRepository import com.projectcitybuild.pcbridge.features.chat.repositories.ChatGroupRepository import com.projectcitybuild.pcbridge.features.invisframes.commands.InvisFrameCommand @@ -47,25 +34,18 @@ import com.projectcitybuild.pcbridge.features.joinmessages.listeners.AnnounceQui import com.projectcitybuild.pcbridge.features.joinmessages.listeners.FirstTimeJoinListener import com.projectcitybuild.pcbridge.features.joinmessages.listeners.ServerOverviewJoinListener import com.projectcitybuild.pcbridge.features.joinmessages.repositories.PlayerConfigRepository -import com.projectcitybuild.pcbridge.features.mute.commands.MuteCommand -import com.projectcitybuild.pcbridge.features.mute.commands.UnmuteCommand -import com.projectcitybuild.pcbridge.features.mute.listeners.MuteChatListener import com.projectcitybuild.pcbridge.features.nightvision.commands.NightVisionCommand +import com.projectcitybuild.pcbridge.features.playerstate.listeners.PlayerStateListener +import com.projectcitybuild.pcbridge.features.register.commands.CodeCommand +import com.projectcitybuild.pcbridge.features.register.commands.RegisterCommand import com.projectcitybuild.pcbridge.features.staffchat.commands.StaffChatCommand -import com.projectcitybuild.pcbridge.features.sync.actions.GenerateAccountVerificationURL -import com.projectcitybuild.pcbridge.features.sync.actions.SyncPlayerGroups -import com.projectcitybuild.pcbridge.features.sync.actions.UpdatePlayerGroups -import com.projectcitybuild.pcbridge.features.sync.commands.SyncCommand -import com.projectcitybuild.pcbridge.features.sync.commands.SyncOtherCommand -import com.projectcitybuild.pcbridge.features.sync.listener.SyncRankOnJoinListener -import com.projectcitybuild.pcbridge.features.sync.repositories.SyncRepository +import com.projectcitybuild.pcbridge.features.groups.actions.SyncPlayerGroups +import com.projectcitybuild.pcbridge.features.groups.commands.SyncCommand +import com.projectcitybuild.pcbridge.features.groups.listener.SyncRankListener +import com.projectcitybuild.pcbridge.features.groups.repositories.SyncRepository +import com.projectcitybuild.pcbridge.features.playerstate.listeners.PlayerSyncRequestListener import com.projectcitybuild.pcbridge.features.telemetry.listeners.TelemetryPlayerConnectListener import com.projectcitybuild.pcbridge.features.telemetry.repositories.TelemetryRepository -import com.projectcitybuild.pcbridge.features.utilities.commands.PCBridgeCommand -import com.projectcitybuild.pcbridge.features.warnings.actions.GetUnacknowledgedWarnings -import com.projectcitybuild.pcbridge.features.warnings.commands.WarningAcknowledgeCommand -import com.projectcitybuild.pcbridge.features.warnings.listeners.NotifyWarningsOnJoinListener -import com.projectcitybuild.pcbridge.features.warnings.repositories.PlayerWarningRepository import com.projectcitybuild.pcbridge.features.warps.Warp import com.projectcitybuild.pcbridge.features.warps.commands.WarpCommand import com.projectcitybuild.pcbridge.features.warps.commands.WarpsCommand @@ -75,9 +55,12 @@ import com.projectcitybuild.pcbridge.integrations.DynmapIntegration import com.projectcitybuild.pcbridge.integrations.EssentialsIntegration import com.projectcitybuild.pcbridge.integrations.LuckPermsIntegration import com.projectcitybuild.pcbridge.support.spigot.SpigotCommandRegistry +import com.projectcitybuild.pcbridge.support.spigot.SpigotEventBroadcaster import com.projectcitybuild.pcbridge.support.spigot.SpigotListenerRegistry import com.projectcitybuild.pcbridge.support.spigot.SpigotNamespace import com.projectcitybuild.pcbridge.support.spigot.SpigotTimer +import com.projectcitybuild.pcbridge.webserver.HttpServer +import com.projectcitybuild.pcbridge.webserver.HttpServerConfig import io.github.reactivecircus.cache4k.Cache import net.kyori.adventure.platform.bukkit.BukkitAudiences import net.kyori.adventure.text.Component @@ -100,22 +83,22 @@ fun pluginModule(_plugin: JavaPlugin) = spigot(_plugin) core() http() + webServer() integrations() // Features announcements() bans() chat() + groups() joinMessages() invisFrames() - mute() nightVision() + playerState() + register() staffChat() - sync() telemetry() - utilities() warps() - warnings() } private fun Module.spigot(plugin: JavaPlugin) { @@ -157,6 +140,13 @@ private fun Module.spigot(plugin: JavaPlugin) { plugin = get(), ) } + + factory { + SpigotEventBroadcaster( + server = get(), + minecraftDispatcher = { get().minecraftDispatcher }, + ) + } } private fun Module.core() { @@ -225,6 +215,22 @@ private fun Module.core() { single { Store() } } +private fun Module.webServer() { + single { + val config = get().get() + + HttpServer( + config = HttpServerConfig( + authToken = config.webServer.token, + port = config.webServer.port, + ), + delegate = WebServerDelegate( + eventBroadcaster = get(), + ), + ) + } +} + private fun Module.http() { single { val config = get().get() @@ -316,8 +322,6 @@ private fun Module.joinMessages() { factory { AnnounceJoinListener( config = get(), - store = get(), - time = get(), ) } @@ -345,123 +349,38 @@ private fun Module.joinMessages() { } } -private fun Module.bans() { - factory { - AggregateRepository( - httpService = get().aggregate, - ) - } - - factory { - PlayerBanRepository( - httpService = get().uuidBan, - ) - } - - factory { - PlayerUUIDRepository( - server = get(), - httpService = get().playerUuid, - ) - } - - factory { - IPBanRepository( - httpService = get().ipBan, - ) - } - +private fun Module.playerState() { factory { - BanCommand( - banUUID = - BanUUID( - playerBanRepository = get(), - playerUUIDRepository = get(), - server = get(), - ), - server = get(), + PlayerStateListener( + store = get(), + time = get(), + eventBroadcaster = get(), ) } - factory { - BanIPCommand( - banIP = - BanIP( - ipBanRepository = get(), - server = get(), - ), + PlayerSyncRequestListener( + store = get(), + time = get(), server = get(), + eventBroadcaster = get(), + playerRepository = get(), ) } +} +private fun Module.bans() { factory { - UnbanCommand( - unbanUUID = - UnbanUUID( - playerBanRepository = get(), - playerUUIDRepository = get(), - ), - ) - } - - factory { - UnbanIPCommand( - unbanIP = - UnbanIP( - ipBanRepository = get(), - ), - ) - } - - factory { - CheckBanCommand( - checkUUIDBan = - CheckUUIDBan( - dateTimeFormatter = get(), - playerUUIDRepository = get(), - playerBanRepository = get(), - ), + PlayerRepository( + httpService = get().player, ) } factory { AuthorizeConnectionListener( - aggregateRepository = get(), - authoriseConnection = AuthoriseConnection(), - dateTimeFormatter = get(), + playerRepository = get(), + authorizeConnection = AuthorizeConnection(), sentry = get(), - server = get(), - minecraftDispatcher = { get().minecraftDispatcher }, - store = get(), - ) - } -} - -private fun Module.mute() { - single(named("mute_cache")) { - // We use a regular cache instead of the server state here - // so that mutes persist even if the player leaves, but - // invalidates if the plugin is reloaded/shutdown - Cache.Builder().build() - } - - factory { - MuteCommand( - server = get(), - mutedPlayers = get(named("mute_cache")), - ) - } - - factory { - UnmuteCommand( - server = get(), - mutedPlayers = get(named("mute_cache")), - ) - } - - factory { - MuteChatListener( - mutedPlayers = get(named("mute_cache")), + eventBroadcaster = get(), ) } } @@ -503,6 +422,8 @@ private fun Module.chat() { ChatBadgeRepository( store = get(), config = get(), + badgeFormatter = get(), + badgeCache = get(named("badge_cache")), ) } @@ -510,6 +431,8 @@ private fun Module.chat() { ChatGroupRepository( permissions = get(), config = get(), + chatGroupFormatter = get(), + groupCache = get(named("group_cache")), ) } @@ -522,33 +445,44 @@ private fun Module.chat() { } factory { - ChatBadgeFormatter( + ChatBadgeFormatter() + } + + single { + ChatGroupFormatter() + } + + factory { + EmojiChatListener() + } + + factory { + FormatNameChatListener( chatBadgeRepository = get(), + chatGroupRepository = get(), ) } factory { - ChatGroupFormatter( + SyncPlayerChatListener( chatGroupRepository = get(), + chatBadgeRepository = get(), ) } +} +private fun Module.register() { factory { - EmojiChatListener() - } + } factory { - FormatNameChatListener( - chatGroupFormatter = get(), - chatBadgeFormatter = get(), - badgeCache = get(named("badge_cache")), - groupCache = get(named("group_cache")), + RegisterCommand( + registerHttpService = get().register, ) } - factory { - SyncBadgesOnJoinListener( - store = get(), + CodeCommand( + registerHttpService = get().register, ) } } @@ -575,28 +509,7 @@ private fun Module.staffChat() { } } -private fun Module.sync() { - factory { - SyncRepository( - playerGroupHttpService = get().playerGroup, - accountLinkHttpService = get().verificationURL, - config = get(), - ) - } - - factory { - UpdatePlayerGroups( - permissions = get(), - syncRepository = get(), - ) - } - - factory { - GenerateAccountVerificationURL( - syncRepository = get(), - ) - } - +private fun Module.groups() { factory { SyncPlayerGroups( permissions = get(), @@ -605,58 +518,21 @@ private fun Module.sync() { } factory { - SyncCommand( - generateAccountVerificationURL = get(), - updatePlayerGroups = get(), - ) - } - - factory { - SyncOtherCommand( - server = get(), - updatePlayerGroups = get(), + SyncRepository( + config = get(), ) } factory { - SyncRankOnJoinListener( + SyncRankListener( syncPlayerGroups = get(), ) } -} - -private fun Module.utilities() { - factory { - PCBridgeCommand( - plugin = get(), - ) - } - - factory { - PCBridgeCommand.TabCompleter() - } -} - -private fun Module.warnings() { - factory { - PlayerWarningRepository( - playerWarningHttpService = get().playerWarning, - ) - } factory { - WarningAcknowledgeCommand( - warningRepository = get(), - ) - } - - factory { - NotifyWarningsOnJoinListener( - getUnacknowledgedWarnings = - GetUnacknowledgedWarnings( - dateTimeFormatter = get(), - warningRepository = get(), - ), + SyncCommand( + server = get(), + eventBroadcaster = get(), ) } } diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/Plugin.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/Plugin.kt index 40ea32adc..a6e97f47a 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/Plugin.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/Plugin.kt @@ -4,15 +4,11 @@ import com.github.shynixn.mccoroutine.bukkit.SuspendingJavaPlugin import com.projectcitybuild.pcbridge.core.errors.SentryReporter import com.projectcitybuild.pcbridge.core.errors.trace import com.projectcitybuild.pcbridge.features.announcements.listeners.AnnouncementEnableListener -import com.projectcitybuild.pcbridge.features.bans.commands.BanCommand -import com.projectcitybuild.pcbridge.features.bans.commands.BanIPCommand -import com.projectcitybuild.pcbridge.features.bans.commands.CheckBanCommand -import com.projectcitybuild.pcbridge.features.bans.commands.UnbanCommand -import com.projectcitybuild.pcbridge.features.bans.commands.UnbanIPCommand import com.projectcitybuild.pcbridge.features.bans.listeners.AuthorizeConnectionListener import com.projectcitybuild.pcbridge.features.chat.listeners.EmojiChatListener import com.projectcitybuild.pcbridge.features.chat.listeners.FormatNameChatListener -import com.projectcitybuild.pcbridge.features.chat.listeners.SyncBadgesOnJoinListener +import com.projectcitybuild.pcbridge.features.chat.listeners.SyncPlayerChatListener +import com.projectcitybuild.pcbridge.features.groups.commands.SyncCommand import com.projectcitybuild.pcbridge.features.invisframes.commands.InvisFrameCommand import com.projectcitybuild.pcbridge.features.invisframes.listeners.FrameItemInsertListener import com.projectcitybuild.pcbridge.features.invisframes.listeners.FrameItemRemoveListener @@ -21,18 +17,14 @@ import com.projectcitybuild.pcbridge.features.joinmessages.listeners.AnnounceJoi import com.projectcitybuild.pcbridge.features.joinmessages.listeners.AnnounceQuitListener import com.projectcitybuild.pcbridge.features.joinmessages.listeners.FirstTimeJoinListener import com.projectcitybuild.pcbridge.features.joinmessages.listeners.ServerOverviewJoinListener -import com.projectcitybuild.pcbridge.features.mute.commands.MuteCommand -import com.projectcitybuild.pcbridge.features.mute.commands.UnmuteCommand -import com.projectcitybuild.pcbridge.features.mute.listeners.MuteChatListener import com.projectcitybuild.pcbridge.features.nightvision.commands.NightVisionCommand +import com.projectcitybuild.pcbridge.features.playerstate.listeners.PlayerStateListener +import com.projectcitybuild.pcbridge.features.register.commands.CodeCommand +import com.projectcitybuild.pcbridge.features.register.commands.RegisterCommand import com.projectcitybuild.pcbridge.features.staffchat.commands.StaffChatCommand -import com.projectcitybuild.pcbridge.features.sync.commands.SyncCommand -import com.projectcitybuild.pcbridge.features.sync.commands.SyncOtherCommand -import com.projectcitybuild.pcbridge.features.sync.listener.SyncRankOnJoinListener +import com.projectcitybuild.pcbridge.features.groups.listener.SyncRankListener +import com.projectcitybuild.pcbridge.features.playerstate.listeners.PlayerSyncRequestListener import com.projectcitybuild.pcbridge.features.telemetry.listeners.TelemetryPlayerConnectListener -import com.projectcitybuild.pcbridge.features.utilities.commands.PCBridgeCommand -import com.projectcitybuild.pcbridge.features.warnings.commands.WarningAcknowledgeCommand -import com.projectcitybuild.pcbridge.features.warnings.listeners.NotifyWarningsOnJoinListener import com.projectcitybuild.pcbridge.features.warps.commands.WarpCommand import com.projectcitybuild.pcbridge.features.warps.commands.WarpsCommand import com.projectcitybuild.pcbridge.integrations.DynmapIntegration @@ -41,6 +33,7 @@ import com.projectcitybuild.pcbridge.integrations.LuckPermsIntegration import com.projectcitybuild.pcbridge.support.spigot.SpigotCommandRegistry import com.projectcitybuild.pcbridge.support.spigot.SpigotListenerRegistry import com.projectcitybuild.pcbridge.support.spigot.SpigotTimer +import com.projectcitybuild.pcbridge.webserver.HttpServer import net.kyori.adventure.platform.bukkit.BukkitAudiences import org.koin.core.KoinApplication import org.koin.core.component.KoinComponent @@ -88,15 +81,13 @@ private class Lifecycle : KoinComponent { private val sentry: SentryReporter by inject() private val commandRegistry: SpigotCommandRegistry by inject() private val listenerRegistry: SpigotListenerRegistry by inject() + private val httpServer: HttpServer by inject() suspend fun boot() = sentry.trace { + httpServer.start() + commandRegistry.apply { - register( - handler = get(), - argsParser = PCBridgeCommand.Args.Parser(), - tabCompleter = get(), - ) register( handler = get(), argsParser = WarpCommand.Args.Parser(), @@ -109,14 +100,6 @@ private class Lifecycle : KoinComponent { handler = get(), argsParser = StaffChatCommand.Args.Parser(), ) - register( - handler = get(), - argsParser = MuteCommand.Args.Parser(), - ) - register( - handler = get(), - argsParser = UnmuteCommand.Args.Parser(), - ) register( handler = get(), argsParser = NightVisionCommand.Args.Parser(), @@ -126,55 +109,35 @@ private class Lifecycle : KoinComponent { argsParser = InvisFrameCommand.Args.Parser(), ) register( - handler = get(), - argsParser = BanCommand.Args.Parser(), + handler = get(), + argsParser = RegisterCommand.Args.Parser(), ) register( - handler = get(), - argsParser = BanIPCommand.Args.Parser(), - ) - register( - handler = get(), - argsParser = CheckBanCommand.Args.Parser(), - ) - register( - handler = get(), - argsParser = UnbanCommand.Args.Parser(), - ) - register( - handler = get(), - argsParser = UnbanIPCommand.Args.Parser(), + handler = get(), + argsParser = CodeCommand.Args.Parser(), ) register( handler = get(), argsParser = SyncCommand.Args.Parser(), ) - register( - handler = get(), - argsParser = SyncOtherCommand.Args.Parser(), - ) - register( - handler = get(), - argsParser = WarningAcknowledgeCommand.Args.Parser(), - ) } listenerRegistry.register( get(), get(), - get(), - get(), + get(), + get(), get(), - get(), - get(), + get(), + get(), get(), get(), get(), - get(), - get(), - get(), - get(), - get(), - get(), + get(), + get(), + get(), + get(), + get(), + get(), ) get().enable() @@ -184,6 +147,8 @@ private class Lifecycle : KoinComponent { suspend fun shutdown() = sentry.trace { + httpServer.stop() + get().cancelAll() get().disable() diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/WebServerDelegate.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/WebServerDelegate.kt new file mode 100644 index 000000000..cb1a97001 --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/WebServerDelegate.kt @@ -0,0 +1,16 @@ +package com.projectcitybuild.pcbridge + +import com.projectcitybuild.pcbridge.features.groups.events.PlayerSyncRequestedEvent +import com.projectcitybuild.pcbridge.support.spigot.SpigotEventBroadcaster +import com.projectcitybuild.pcbridge.webserver.HttpServerDelegate +import java.util.UUID + +class WebServerDelegate( + private val eventBroadcaster: SpigotEventBroadcaster, +) : HttpServerDelegate { + override suspend fun syncPlayer(uuid: UUID) { + eventBroadcaster.broadcast( + PlayerSyncRequestedEvent(playerUUID = uuid), + ) + } +} \ No newline at end of file diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/core/state/ServerState.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/core/state/ServerState.kt index 3521ad88a..0d2e911d4 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/core/state/ServerState.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/core/state/ServerState.kt @@ -1,8 +1,11 @@ package com.projectcitybuild.pcbridge.core.state +import com.projectcitybuild.pcbridge.http.responses.Account import com.projectcitybuild.pcbridge.http.responses.Badge -import com.projectcitybuild.pcbridge.support.serializable.LocalDateTimeSerializer -import com.projectcitybuild.pcbridge.support.serializable.UUIDSerializer +import com.projectcitybuild.pcbridge.http.responses.DonationPerk +import com.projectcitybuild.pcbridge.http.responses.PlayerData +import com.projectcitybuild.pcbridge.http.serializable.LocalDateTimeSerializer +import com.projectcitybuild.pcbridge.http.serializable.UUIDSerializer import kotlinx.serialization.Serializable import java.time.LocalDateTime import java.util.UUID @@ -26,27 +29,22 @@ data class ServerState( * which one was last broadcast when reloading */ val lastBroadcastIndex: Int, -) { - companion object { - fun default() = - ServerState( - players = mutableMapOf(), - lastBroadcastIndex = -1, - ) - } -} +) @Serializable data class PlayerState( @Serializable(with = LocalDateTimeSerializer::class) val connectedAt: LocalDateTime?, - val badges: List, + val account: Account? = null, + val badges: List = emptyList(), + val donationPerks: List = emptyList(), ) { companion object { - fun empty() = - PlayerState( - connectedAt = null, - badges = emptyList(), - ) + fun fromPlayerData(data: PlayerData, connectedAt: LocalDateTime) = PlayerState( + connectedAt = connectedAt, + account = data.account, + badges = data.badges, + donationPerks = data.donationPerks, + ) } } diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/core/state/Store.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/core/state/Store.kt index 0d96e54ab..6b6650d8c 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/core/state/Store.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/core/state/Store.kt @@ -8,6 +8,7 @@ import kotlinx.coroutines.withContext private val mutex = Mutex() +// TODO: splice the store so that each feature can maintain its own state slice class Store { val state: ServerState get() = _state @@ -27,11 +28,4 @@ class Store { log.debug { "[new state]\n$state" } } } - - fun persist() { - } - - fun rehydrate() { - // TODO: check whether players in the state are still online - } } diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/actions/AuthoriseConnection.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/actions/AuthorizeConnection.kt similarity index 71% rename from pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/actions/AuthoriseConnection.kt rename to pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/actions/AuthorizeConnection.kt index 5b39e8642..40270758f 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/actions/AuthoriseConnection.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/actions/AuthorizeConnection.kt @@ -1,10 +1,10 @@ package com.projectcitybuild.pcbridge.features.bans.actions -import com.projectcitybuild.pcbridge.http.responses.Aggregate +import com.projectcitybuild.pcbridge.http.responses.PlayerData import com.projectcitybuild.pcbridge.http.responses.IPBan import com.projectcitybuild.pcbridge.http.responses.PlayerBan -class AuthoriseConnection { +class AuthorizeConnection { sealed class ConnectResult { object Allowed : ConnectResult() @@ -17,20 +17,20 @@ class AuthoriseConnection { data class IP(val value: IPBan) : Ban() } - fun execute(aggregate: Aggregate): ConnectResult { - val ban = getBan(aggregate) + fun authorize(playerData: PlayerData): ConnectResult { + val ban = getBan(playerData) if (ban != null) { return ConnectResult.Denied(ban = ban) } return ConnectResult.Allowed } - private fun getBan(aggregate: Aggregate): Ban? { - val playerBan = aggregate.playerBan + private fun getBan(playerData: PlayerData): Ban? { + val playerBan = playerData.playerBan if (playerBan != null && playerBan.isActive) { return Ban.UUID(playerBan) } - val ipBan = aggregate.ipBan + val ipBan = playerData.ipBan if (ipBan != null && ipBan.isActive) { return Ban.IP(ipBan) } diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/actions/BanIP.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/actions/BanIP.kt deleted file mode 100644 index bcaf3b6b2..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/actions/BanIP.kt +++ /dev/null @@ -1,54 +0,0 @@ -package com.projectcitybuild.pcbridge.features.bans.actions - -import com.projectcitybuild.pcbridge.features.bans.Sanitizer -import com.projectcitybuild.pcbridge.features.bans.isValidIP -import com.projectcitybuild.pcbridge.features.bans.repositories.IPBanRepository -import com.projectcitybuild.pcbridge.http.services.pcb.IPBanHttpService -import com.projectcitybuild.pcbridge.utils.Failure -import com.projectcitybuild.pcbridge.utils.Result -import com.projectcitybuild.pcbridge.utils.Success -import net.kyori.adventure.text.Component -import org.bukkit.Server -import org.bukkit.event.player.PlayerKickEvent -import java.util.UUID - -class BanIP( - private val ipBanRepository: IPBanRepository, - private val server: Server, -) { - enum class FailureReason { - IP_ALREADY_BANNED, - INVALID_IP, - } - - suspend fun execute( - ip: String, - bannerUUID: UUID?, - bannerName: String, - reason: String, - ): Result { - val sanitizedIP = Sanitizer.sanitizedIP(ip) - if (!isValidIP(sanitizedIP)) { - return Failure(FailureReason.INVALID_IP) - } - try { - ipBanRepository.ban( - ip = sanitizedIP, - bannerUUID = bannerUUID, - bannerName = bannerName, - reason = reason, - ) - } catch (e: IPBanHttpService.IPAlreadyBannedException) { - return Failure(FailureReason.IP_ALREADY_BANNED) - } - - server.onlinePlayers - .firstOrNull { it.address.toString() == ip } - ?.kick( - Component.text("You have been banned.\n\nAppeal @ projectcitybuild.com"), - PlayerKickEvent.Cause.BANNED, - ) - - return Success(Unit) - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/actions/BanUUID.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/actions/BanUUID.kt deleted file mode 100644 index 18ffebc48..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/actions/BanUUID.kt +++ /dev/null @@ -1,53 +0,0 @@ -package com.projectcitybuild.pcbridge.features.bans.actions - -import com.projectcitybuild.pcbridge.features.bans.repositories.PlayerBanRepository -import com.projectcitybuild.pcbridge.features.bans.repositories.PlayerUUIDRepository -import com.projectcitybuild.pcbridge.http.services.pcb.UUIDBanHttpService -import com.projectcitybuild.pcbridge.utils.Failure -import com.projectcitybuild.pcbridge.utils.Result -import com.projectcitybuild.pcbridge.utils.Success -import net.kyori.adventure.text.Component -import org.bukkit.Server -import org.bukkit.event.player.PlayerKickEvent -import java.util.UUID - -class BanUUID( - private val playerBanRepository: PlayerBanRepository, - private val playerUUIDRepository: PlayerUUIDRepository, - private val server: Server, -) { - enum class FailureReason { - PlayerDoesNotExist, - PlayerAlreadyBanned, - } - - suspend fun ban( - targetPlayerName: String, - bannerUUID: UUID?, - bannerName: String, - reason: String?, - ): Result { - try { - val targetPlayerUUID = - playerUUIDRepository.get(targetPlayerName) - ?: return Failure(FailureReason.PlayerDoesNotExist) - - playerBanRepository.ban( - targetPlayerUUID = targetPlayerUUID, - targetPlayerName = targetPlayerName, - bannerPlayerUUID = bannerUUID, - bannerPlayerName = bannerName, - reason = reason, - ) - - server.getPlayer(targetPlayerUUID)?.kick( - Component.text("You have been banned.\n\nAppeal @ projectcitybuild.com"), - PlayerKickEvent.Cause.BANNED, - ) - - return Success(Unit) - } catch (e: UUIDBanHttpService.UUIDAlreadyBannedException) { - return Failure(FailureReason.PlayerAlreadyBanned) - } - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/actions/CheckUUIDBan.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/actions/CheckUUIDBan.kt deleted file mode 100644 index d777e930a..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/actions/CheckUUIDBan.kt +++ /dev/null @@ -1,42 +0,0 @@ -package com.projectcitybuild.pcbridge.features.bans.actions - -import com.projectcitybuild.pcbridge.core.datetime.DateTimeFormatter -import com.projectcitybuild.pcbridge.features.bans.repositories.PlayerBanRepository -import com.projectcitybuild.pcbridge.features.bans.repositories.PlayerUUIDRepository -import com.projectcitybuild.pcbridge.utils.Failure -import com.projectcitybuild.pcbridge.utils.Result -import com.projectcitybuild.pcbridge.utils.Success - -class CheckUUIDBan( - private val playerBanRepository: PlayerBanRepository, - private val playerUUIDRepository: PlayerUUIDRepository, - private val dateTimeFormatter: DateTimeFormatter, -) { - enum class FailureReason { - PLAYER_DOES_NOT_EXIST, - } - - data class BanRecord( - val reason: String, - val dateOfBan: String, - val expiryDate: String, - ) - - suspend fun getBan(targetPlayerName: String): Result { - val targetPlayerUUID = - playerUUIDRepository.get(targetPlayerName) - ?: return Failure(FailureReason.PLAYER_DOES_NOT_EXIST) - - val ban = - playerBanRepository.get(targetPlayerUUID = targetPlayerUUID) - ?: return Success(null) - - val banRecord = - BanRecord( - reason = ban.reason ?: "No reason given", - dateOfBan = ban.createdAt.let { dateTimeFormatter.convert(it) }, - expiryDate = ban.expiresAt?.let { dateTimeFormatter.convert(it) } ?: "Never", - ) - return Success(banRecord) - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/actions/UnbanIP.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/actions/UnbanIP.kt deleted file mode 100644 index 87165c021..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/actions/UnbanIP.kt +++ /dev/null @@ -1,42 +0,0 @@ -package com.projectcitybuild.pcbridge.features.bans.actions - -import com.projectcitybuild.pcbridge.features.bans.Sanitizer -import com.projectcitybuild.pcbridge.features.bans.isValidIP -import com.projectcitybuild.pcbridge.features.bans.repositories.IPBanRepository -import com.projectcitybuild.pcbridge.http.services.pcb.IPBanHttpService -import com.projectcitybuild.pcbridge.utils.Failure -import com.projectcitybuild.pcbridge.utils.Result -import com.projectcitybuild.pcbridge.utils.Success -import java.util.UUID - -class UnbanIP( - private val ipBanRepository: IPBanRepository, -) { - enum class FailureReason { - IP_NOT_BANNED, - INVALID_IP, - } - - suspend fun execute( - ip: String, - unbannerUUID: UUID?, - unbannerName: String, - ): Result { - val sanitizedIP = Sanitizer.sanitizedIP(ip) - if (!isValidIP(sanitizedIP)) { - return Failure(FailureReason.INVALID_IP) - } - - try { - ipBanRepository.unban( - ip = ip, - unbannerUUID = unbannerUUID, - unbannerName = unbannerName, - ) - } catch (e: IPBanHttpService.IPNotBannedException) { - return Failure(FailureReason.IP_NOT_BANNED) - } - - return Success(Unit) - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/actions/UnbanUUID.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/actions/UnbanUUID.kt deleted file mode 100644 index b8454e9be..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/actions/UnbanUUID.kt +++ /dev/null @@ -1,39 +0,0 @@ -package com.projectcitybuild.pcbridge.features.bans.actions - -import com.projectcitybuild.pcbridge.features.bans.repositories.PlayerBanRepository -import com.projectcitybuild.pcbridge.features.bans.repositories.PlayerUUIDRepository -import com.projectcitybuild.pcbridge.http.services.pcb.UUIDBanHttpService -import com.projectcitybuild.pcbridge.utils.Failure -import com.projectcitybuild.pcbridge.utils.Result -import com.projectcitybuild.pcbridge.utils.Success -import java.util.UUID - -class UnbanUUID( - private val playerBanRepository: PlayerBanRepository, - private val playerUUIDRepository: PlayerUUIDRepository, -) { - enum class FailureReason { - PlayerDoesNotExist, - PlayerNotBanned, - } - - suspend fun unban( - targetPlayerName: String, - unbannerUUID: UUID?, - ): Result { - try { - val targetPlayerUUID = - playerUUIDRepository.get(targetPlayerName) - ?: return Failure(FailureReason.PlayerDoesNotExist) - - playerBanRepository.unban( - targetPlayerUUID = targetPlayerUUID, - unbannerUUID = unbannerUUID, - ) - - return Success(Unit) - } catch (e: UUIDBanHttpService.UUIDNotBannedException) { - return Failure(FailureReason.PlayerNotBanned) - } - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/commands/BanCommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/commands/BanCommand.kt deleted file mode 100644 index 7bfec1497..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/commands/BanCommand.kt +++ /dev/null @@ -1,76 +0,0 @@ -package com.projectcitybuild.pcbridge.features.bans.commands - -import com.projectcitybuild.pcbridge.features.bans.actions.BanUUID -import com.projectcitybuild.pcbridge.support.messages.CommandHelpBuilder -import com.projectcitybuild.pcbridge.support.spigot.BadCommandUsageException -import com.projectcitybuild.pcbridge.support.spigot.CommandArgsParser -import com.projectcitybuild.pcbridge.support.spigot.SpigotCommand -import com.projectcitybuild.pcbridge.utils.Failure -import com.projectcitybuild.pcbridge.utils.Success -import net.kyori.adventure.text.Component -import net.kyori.adventure.text.format.NamedTextColor -import net.kyori.adventure.text.format.TextDecoration -import org.bukkit.Server -import org.bukkit.command.CommandSender -import org.bukkit.entity.Player - -class BanCommand( - private val banUUID: BanUUID, - private val server: Server, -) : SpigotCommand { - override val label = "ban" - - override val usage = CommandHelpBuilder() - - override suspend fun run( - sender: CommandSender, - args: Args, - ) { - val result = - banUUID.ban( - targetPlayerName = args.targetPlayerName, - bannerUUID = if (sender is Player) sender.uniqueId else null, - bannerName = sender.name, - reason = args.reason, - ) - when (result) { - is Failure -> - sender.sendMessage( - Component.text(result.reason.toMessage(args.targetPlayerName)) - .color(NamedTextColor.RED), - ) - is Success -> - server.broadcast( - Component.text("${args.targetPlayerName} has been banned") - .color(NamedTextColor.GRAY) - .decorate(TextDecoration.ITALIC), - ) - } - } - - data class Args( - val targetPlayerName: String, - val reason: String, - ) { - class Parser : CommandArgsParser { - override fun parse(args: List): Args { - if (args.isEmpty()) { - throw BadCommandUsageException() - } - return Args( - targetPlayerName = args[0], - reason = if (args.size > 1) args.drop(1).joinToString(separator = " ") else "", - ) - } - } - } -} - -private fun BanUUID.FailureReason.toMessage(targetPlayerName: String) = - when (this) { - BanUUID.FailureReason.PlayerDoesNotExist, - -> "Error: Could not find UUID for $targetPlayerName. This player likely doesn't exist" - - BanUUID.FailureReason.PlayerAlreadyBanned, - -> "Error: $targetPlayerName is already banned" - } diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/commands/BanIPCommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/commands/BanIPCommand.kt deleted file mode 100644 index 0d6bb6ff5..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/commands/BanIPCommand.kt +++ /dev/null @@ -1,77 +0,0 @@ -package com.projectcitybuild.pcbridge.features.bans.commands - -import com.projectcitybuild.pcbridge.features.bans.actions.BanIP -import com.projectcitybuild.pcbridge.support.messages.CommandHelpBuilder -import com.projectcitybuild.pcbridge.support.spigot.BadCommandUsageException -import com.projectcitybuild.pcbridge.support.spigot.CommandArgsParser -import com.projectcitybuild.pcbridge.support.spigot.SpigotCommand -import com.projectcitybuild.pcbridge.utils.Failure -import com.projectcitybuild.pcbridge.utils.Success -import net.kyori.adventure.text.Component -import net.kyori.adventure.text.format.NamedTextColor -import net.kyori.adventure.text.format.TextDecoration -import org.bukkit.Server -import org.bukkit.command.CommandSender -import org.bukkit.entity.Player - -class BanIPCommand( - private val server: Server, - private val banIP: BanIP, -) : SpigotCommand { - override val label = "banip" - - override val usage = CommandHelpBuilder() - - override suspend fun run( - sender: CommandSender, - args: Args, - ) { - val targetIP = - server.onlinePlayers - .firstOrNull { it.name.lowercase() == args.target.lowercase() } - ?.address?.toString() - ?: args.target - - val result = - banIP.execute( - ip = targetIP, - bannerUUID = if (sender is Player) sender.uniqueId else null, - bannerName = sender.name, - reason = args.reason, - ) - val message = - when (result) { - is Failure -> - when (result.reason) { - BanIP.FailureReason.IP_ALREADY_BANNED -> - Component.text("$targetIP is already banned") - .color(NamedTextColor.RED) - BanIP.FailureReason.INVALID_IP -> - Component.text("$targetIP is not a valid IP") - .color(NamedTextColor.RED) - } - is Success -> - Component.text("IP $targetIP has been banned") - .color(NamedTextColor.GRAY) - .decorate(TextDecoration.ITALIC) - } - sender.sendMessage(message) - } - - data class Args( - val target: String, - val reason: String, - ) { - class Parser : CommandArgsParser { - override fun parse(args: List): Args { - if (args.isEmpty()) { - throw BadCommandUsageException() - } - return Args( - target = args[0], - reason = if (args.size > 1) args.drop(1).joinToString(separator = " ") else "", - ) - } - } - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/commands/CheckBanCommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/commands/CheckBanCommand.kt deleted file mode 100644 index 31fe0d1c4..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/commands/CheckBanCommand.kt +++ /dev/null @@ -1,69 +0,0 @@ -package com.projectcitybuild.pcbridge.features.bans.commands - -import com.projectcitybuild.pcbridge.features.bans.actions.CheckUUIDBan -import com.projectcitybuild.pcbridge.support.messages.CommandHelpBuilder -import com.projectcitybuild.pcbridge.support.spigot.BadCommandUsageException -import com.projectcitybuild.pcbridge.support.spigot.CommandArgsParser -import com.projectcitybuild.pcbridge.support.spigot.SpigotCommand -import com.projectcitybuild.pcbridge.utils.Failure -import com.projectcitybuild.pcbridge.utils.Success -import net.kyori.adventure.text.Component -import net.kyori.adventure.text.format.NamedTextColor -import net.md_5.bungee.api.ChatColor -import org.bukkit.command.CommandSender - -class CheckBanCommand( - private val checkUUIDBan: CheckUUIDBan, -) : SpigotCommand { - override val label = "checkban" - - override val usage = CommandHelpBuilder() - - override suspend fun run( - sender: CommandSender, - args: Args, - ) { - val result = checkUUIDBan.getBan(args.targetPlayerName) - val message = - when (result) { - is Failure -> - when (result.reason) { - CheckUUIDBan.FailureReason.PLAYER_DOES_NOT_EXIST -> - Component - .text("Could not find UUID for ${args.targetPlayerName}. This player likely doesn't exist") - .color(NamedTextColor.RED) - } - is Success -> - result.value.let { ban -> - if (ban == null) { - Component.text("${args.targetPlayerName} is not currently banned") - .color(NamedTextColor.RED) - } else { - Component.text( - """ - ${ChatColor.RED}${args.targetPlayerName} is currently banned. - ${ChatColor.GRAY}--- - ${ChatColor.GRAY}Reason » ${ChatColor.WHITE}${ban.reason} - ${ChatColor.GRAY}Date » ${ChatColor.WHITE}${ban.dateOfBan} - ${ChatColor.GRAY}Expires » ${ChatColor.WHITE}${ban.expiryDate} - """.trimIndent(), - ) - } - } - } - sender.sendMessage(message) - } - - data class Args( - val targetPlayerName: String, - ) { - class Parser : CommandArgsParser { - override fun parse(args: List): Args { - if (args.isEmpty()) { - throw BadCommandUsageException() - } - return Args(targetPlayerName = args[0]) - } - } - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/commands/UnbanCommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/commands/UnbanCommand.kt deleted file mode 100644 index cdde597d6..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/commands/UnbanCommand.kt +++ /dev/null @@ -1,63 +0,0 @@ -package com.projectcitybuild.pcbridge.features.bans.commands - -import com.projectcitybuild.pcbridge.features.bans.actions.UnbanUUID -import com.projectcitybuild.pcbridge.support.messages.CommandHelpBuilder -import com.projectcitybuild.pcbridge.support.spigot.BadCommandUsageException -import com.projectcitybuild.pcbridge.support.spigot.CommandArgsParser -import com.projectcitybuild.pcbridge.support.spigot.SpigotCommand -import com.projectcitybuild.pcbridge.utils.Failure -import com.projectcitybuild.pcbridge.utils.Success -import net.kyori.adventure.text.Component -import net.kyori.adventure.text.format.NamedTextColor -import net.kyori.adventure.text.format.TextDecoration -import org.bukkit.command.CommandSender -import org.bukkit.entity.Player - -class UnbanCommand( - private val unbanUUID: UnbanUUID, -) : SpigotCommand { - override val label = "unban" - - override val usage = CommandHelpBuilder() // TODO - - override suspend fun run( - sender: CommandSender, - args: Args, - ) { - val result = - unbanUUID.unban( - targetPlayerName = args.targetPlayerName, - unbannerUUID = if (sender is Player) sender.uniqueId else null, - ) - val message = - when (result) { - is Failure -> - Component.text(result.reason.toMessage(args.targetPlayerName)) - .color(NamedTextColor.RED) - is Success -> - Component.text("{${args.targetPlayerName} has been unbanned") - .color(NamedTextColor.GRAY) - .decorate(TextDecoration.ITALIC) - } - sender.sendMessage(message) - } - - data class Args( - val targetPlayerName: String, - ) { - class Parser : CommandArgsParser { - override fun parse(args: List): Args { - if (args.isEmpty()) { - throw BadCommandUsageException() - } - return Args(targetPlayerName = args[0]) - } - } - } -} - -private fun UnbanUUID.FailureReason.toMessage(targetPlayerName: String) = - when (this) { - UnbanUUID.FailureReason.PlayerDoesNotExist -> "Could not find UUID for $targetPlayerName. This player likely doesn't exist" - UnbanUUID.FailureReason.PlayerNotBanned -> "$targetPlayerName is not currently banned" - } diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/commands/UnbanIPCommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/commands/UnbanIPCommand.kt deleted file mode 100644 index 8e0a986bd..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/commands/UnbanIPCommand.kt +++ /dev/null @@ -1,63 +0,0 @@ -package com.projectcitybuild.pcbridge.features.bans.commands - -import com.projectcitybuild.pcbridge.features.bans.actions.UnbanIP -import com.projectcitybuild.pcbridge.support.messages.CommandHelpBuilder -import com.projectcitybuild.pcbridge.support.spigot.BadCommandUsageException -import com.projectcitybuild.pcbridge.support.spigot.CommandArgsParser -import com.projectcitybuild.pcbridge.support.spigot.SpigotCommand -import com.projectcitybuild.pcbridge.utils.Failure -import com.projectcitybuild.pcbridge.utils.Success -import net.kyori.adventure.text.Component -import net.kyori.adventure.text.format.NamedTextColor -import org.bukkit.command.CommandSender -import org.bukkit.entity.Player - -class UnbanIPCommand( - private val unbanIP: UnbanIP, -) : SpigotCommand { - override val label = "unbanip" - - override val usage = CommandHelpBuilder() - - override suspend fun run( - sender: CommandSender, - args: Args, - ) { - val result = - unbanIP.execute( - ip = args.ip, - unbannerUUID = if (sender is Player) sender.uniqueId else null, - unbannerName = sender.name, - ) - - val message = - when (result) { - is Failure -> - Component.text(result.reason.toMessage(args.ip)) - .color(NamedTextColor.RED) - is Success -> - Component.text("IP ${args.ip} has been unbanned") - .color(NamedTextColor.GRAY) - } - sender.sendMessage(message) - } - - data class Args( - val ip: String, - ) { - class Parser : CommandArgsParser { - override fun parse(args: List): Args { - if (args.isEmpty()) { - throw BadCommandUsageException() - } - return Args(ip = args[0]) - } - } - } -} - -private fun UnbanIP.FailureReason.toMessage(targetIP: String) = - when (this) { - UnbanIP.FailureReason.IP_NOT_BANNED -> "$targetIP is not currently banned" - UnbanIP.FailureReason.INVALID_IP -> "$targetIP is not a valid IP" - } diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/events/ConnectionPermittedEvent.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/events/ConnectionPermittedEvent.kt index b57a9287c..19f3c60f0 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/events/ConnectionPermittedEvent.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/events/ConnectionPermittedEvent.kt @@ -1,12 +1,12 @@ package com.projectcitybuild.pcbridge.features.bans.events -import com.projectcitybuild.pcbridge.http.responses.Aggregate +import com.projectcitybuild.pcbridge.http.responses.PlayerData import org.bukkit.event.Event import org.bukkit.event.HandlerList import java.util.UUID class ConnectionPermittedEvent( - val aggregate: Aggregate, + val playerData: PlayerData?, val playerUUID: UUID, ) : Event() { override fun getHandlers(): HandlerList { diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/listeners/AuthorizeConnectionListener.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/listeners/AuthorizeConnectionListener.kt index 5947dad69..02419d779 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/listeners/AuthorizeConnectionListener.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/listeners/AuthorizeConnectionListener.kt @@ -1,77 +1,57 @@ package com.projectcitybuild.pcbridge.features.bans.listeners -import com.projectcitybuild.pcbridge.core.datetime.DateTimeFormatter import com.projectcitybuild.pcbridge.core.errors.SentryReporter import com.projectcitybuild.pcbridge.core.logger.log -import com.projectcitybuild.pcbridge.core.state.PlayerState -import com.projectcitybuild.pcbridge.core.state.Store -import com.projectcitybuild.pcbridge.features.bans.Sanitizer -import com.projectcitybuild.pcbridge.features.bans.actions.AuthoriseConnection +import com.projectcitybuild.pcbridge.features.bans.actions.AuthorizeConnection import com.projectcitybuild.pcbridge.features.bans.events.ConnectionPermittedEvent -import com.projectcitybuild.pcbridge.features.bans.repositories.AggregateRepository -import com.projectcitybuild.pcbridge.http.responses.Aggregate +import com.projectcitybuild.pcbridge.features.bans.repositories.PlayerRepository +import com.projectcitybuild.pcbridge.support.spigot.SpigotEventBroadcaster import kotlinx.coroutines.runBlocking -import kotlinx.coroutines.withContext import net.kyori.adventure.text.Component import net.kyori.adventure.text.minimessage.MiniMessage -import org.bukkit.Server import org.bukkit.event.EventHandler import org.bukkit.event.EventPriority import org.bukkit.event.Listener import org.bukkit.event.player.AsyncPlayerPreLoginEvent -import java.time.format.FormatStyle -import kotlin.coroutines.CoroutineContext class AuthorizeConnectionListener( - private val aggregateRepository: AggregateRepository, - private val authoriseConnection: AuthoriseConnection, - private val dateTimeFormatter: DateTimeFormatter, + private val playerRepository: PlayerRepository, + private val authorizeConnection: AuthorizeConnection, + private val eventBroadcaster: SpigotEventBroadcaster, private val sentry: SentryReporter, - private val server: Server, - private val minecraftDispatcher: () -> CoroutineContext, - private val store: Store, ) : Listener { @EventHandler(priority = EventPriority.HIGHEST) suspend fun handle(event: AsyncPlayerPreLoginEvent) { /** - * Events cannot be mutated after a suspended function has paused execution, - * because the event would have been fully processed by the time execution is - * resumed in this listener. + * In order to call `event.disallow()`, this function must block until player data + * has been fetched and processed. Blocking is not a problem because this event + * handler function is called asynchronously by Spigot/Paper. * - * We need to block so that the event processing pauses until this listener has - * finished execution. Blocking shouldn't be a problem here because the listener - * is already being executed asynchronously. + * The `event.disallow()` function works by mutating a boolean on the Event class instance. + * The final value is read from the instance after all event handlers have had their turn. + * However, event handlers are not suspending as they are Java functions. MCCoroutine gets + * around this by immediately returning the event but allowing suspending functions to + * continue execution in the background. + * + * Therefore, in order to call a mutating function, the event handler must be blocking so that + * it awaits the result of the handler. * * See https://github.com/Shynixn/MCCoroutine/issues/43 */ runBlocking { runCatching { - val aggregate = - aggregateRepository.get( - playerUUID = event.uniqueId, - ip = Sanitizer.sanitizedIP(event.address.toString()), - ) ?: Aggregate() - - val result = authoriseConnection.execute(aggregate) - if (result is AuthoriseConnection.ConnectResult.Denied) { - event.disallow( + val playerData = playerRepository.get( + playerUUID = event.uniqueId, + ip = event.address, + ) + when (val result = authorizeConnection.authorize(playerData)) { + is AuthorizeConnection.ConnectResult.Denied -> event.disallow( AsyncPlayerPreLoginEvent.Result.KICK_BANNED, - result.ban.toMessage(dateTimeFormatter), + result.ban.toMessage(), ) - return@runBlocking - } - store.mutate { state -> - state.copy( - players = - state.players - .apply { put(event.uniqueId, PlayerState.empty()) }, - ) - } - - withContext(minecraftDispatcher()) { - server.pluginManager.callEvent( + is AuthorizeConnection.ConnectResult.Allowed -> eventBroadcaster.broadcast( ConnectionPermittedEvent( - aggregate = aggregate, + playerData = playerData, playerUUID = event.uniqueId, ), ) @@ -80,36 +60,37 @@ class AuthorizeConnectionListener( log.error(it) { "An error occurred while authorizing a connection" } sentry.report(it) - // If something goes wrong, better not to let players in - event.disallow( - AsyncPlayerPreLoginEvent.Result.KICK_OTHER, - Component.text("An error occurred while contacting the PCB authentication server. Please try again later"), + // If something goes wrong, permit the connection without player data + // so that their permissions are all stripped + ConnectionPermittedEvent( + playerData = null, + playerUUID = event.uniqueId, ) } } } } -private fun AuthoriseConnection.Ban.toMessage(dateTimeFormatter: DateTimeFormatter): Component { +private fun AuthorizeConnection.Ban.toMessage(): Component { return when (this) { - is AuthoriseConnection.Ban.UUID -> + is AuthorizeConnection.Ban.UUID -> MiniMessage.miniMessage().deserialize( """ You are currently banned. Reason: ${value.reason ?: "No reason provided"} - Expires: ${value.expiresAt?.let { dateTimeFormatter.convert(it, FormatStyle.SHORT) } ?: "Never"} + Expires: ${value.expiresAt ?: "Never"} Appeal @ https://projectcitybuild.com" """.trimIndent(), ) - is AuthoriseConnection.Ban.IP -> + is AuthorizeConnection.Ban.IP -> MiniMessage.miniMessage().deserialize( """ You are currently IP banned. - Reason: ${value.reason.ifEmpty { "No reason provided" }} + Reason: ${value.reason ?: "No reason provided" } Appeal @ https://projectcitybuild.com """.trimIndent(), diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/repositories/AggregateRepository.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/repositories/AggregateRepository.kt deleted file mode 100644 index d8777a7d4..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/repositories/AggregateRepository.kt +++ /dev/null @@ -1,21 +0,0 @@ -package com.projectcitybuild.pcbridge.features.bans.repositories - -import com.projectcitybuild.pcbridge.http.responses.Aggregate -import com.projectcitybuild.pcbridge.http.services.pcb.AggregateHttpService -import java.util.UUID -import kotlin.jvm.Throws - -class AggregateRepository( - private val httpService: AggregateHttpService, -) { - @Throws(Exception::class) - suspend fun get( - playerUUID: UUID, - ip: String, - ): Aggregate? { - return httpService.get( - playerUUID = playerUUID, - ip = ip, - ) - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/repositories/IPBanRepository.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/repositories/IPBanRepository.kt deleted file mode 100644 index c7201c329..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/repositories/IPBanRepository.kt +++ /dev/null @@ -1,41 +0,0 @@ -package com.projectcitybuild.pcbridge.features.bans.repositories - -import com.projectcitybuild.pcbridge.http.responses.IPBan -import com.projectcitybuild.pcbridge.http.services.pcb.IPBanHttpService -import java.util.UUID - -class IPBanRepository( - private val httpService: IPBanHttpService, -) { - suspend fun get(ip: String): IPBan? { - return httpService.get(ip) - } - - @Throws(IPBanHttpService.IPAlreadyBannedException::class) - suspend fun ban( - ip: String, - bannerUUID: UUID?, - bannerName: String, - reason: String, - ) { - httpService.ban( - ip = ip, - bannerUUID = bannerUUID, - bannerName = bannerName, - reason = reason, - ) - } - - @Throws(IPBanHttpService.IPNotBannedException::class) - suspend fun unban( - ip: String, - unbannerUUID: UUID?, - unbannerName: String, - ) { - httpService.unban( - ip = ip, - unbannerUUID = unbannerUUID, - unbannerName = unbannerName, - ) - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/repositories/PlayerBanRepository.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/repositories/PlayerBanRepository.kt deleted file mode 100644 index 47b21a285..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/repositories/PlayerBanRepository.kt +++ /dev/null @@ -1,43 +0,0 @@ -package com.projectcitybuild.pcbridge.features.bans.repositories - -import com.projectcitybuild.pcbridge.http.responses.PlayerBan -import com.projectcitybuild.pcbridge.http.services.pcb.UUIDBanHttpService -import java.util.UUID - -class PlayerBanRepository( - private val httpService: UUIDBanHttpService, -) { - suspend fun get(targetPlayerUUID: UUID): PlayerBan? { - return httpService.get(targetPlayerUUID) - } - - @Throws(UUIDBanHttpService.UUIDAlreadyBannedException::class) - suspend fun ban( - targetPlayerUUID: UUID, - targetPlayerName: String, - bannerPlayerUUID: UUID?, - bannerPlayerName: String, - reason: String?, - expiryDate: Long? = null, - ) { - httpService.ban( - targetPlayerUUID = targetPlayerUUID, - targetPlayerName = targetPlayerName, - bannerPlayerUUID = bannerPlayerUUID, - bannerPlayerName = bannerPlayerName, - reason = reason, - expiryDate = expiryDate, - ) - } - - @Throws(UUIDBanHttpService.UUIDNotBannedException::class) - suspend fun unban( - targetPlayerUUID: UUID, - unbannerUUID: UUID?, - ) { - httpService.unban( - targetPlayerUUID = targetPlayerUUID, - unbannerUUID = unbannerUUID, - ) - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/repositories/PlayerRepository.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/repositories/PlayerRepository.kt new file mode 100644 index 000000000..c330edce7 --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/repositories/PlayerRepository.kt @@ -0,0 +1,23 @@ +package com.projectcitybuild.pcbridge.features.bans.repositories + +import com.projectcitybuild.pcbridge.features.bans.Sanitizer +import com.projectcitybuild.pcbridge.http.responses.PlayerData +import com.projectcitybuild.pcbridge.http.services.pcb.PlayerHttpService +import java.net.InetAddress +import java.util.UUID +import kotlin.jvm.Throws + +class PlayerRepository( + private val httpService: PlayerHttpService, +) { + @Throws(Exception::class) + suspend fun get( + playerUUID: UUID, + ip: InetAddress, + ): PlayerData { + return httpService.get( + playerUUID = playerUUID, + ip = Sanitizer.sanitizedIP(ip.toString()), + ) + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/repositories/PlayerUUIDRepository.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/repositories/PlayerUUIDRepository.kt deleted file mode 100644 index 531411df0..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/repositories/PlayerUUIDRepository.kt +++ /dev/null @@ -1,37 +0,0 @@ -package com.projectcitybuild.pcbridge.features.bans.repositories - -import com.projectcitybuild.pcbridge.http.responses.MojangPlayer -import com.projectcitybuild.pcbridge.http.services.mojang.PlayerUUIDHttpService -import com.projectcitybuild.pcbridge.utils.extensions.toDashFormattedUUID -import org.bukkit.Server -import java.util.UUID - -open class PlayerUUIDRepository( - private val server: Server, - private val httpService: PlayerUUIDHttpService, -) { - // TODO: cache with expiry time - private val mojangPlayerCache = HashMap() - - suspend fun get(playerName: String): UUID? { - val onlinePlayerUUID = server.getPlayer(playerName)?.uniqueId - if (onlinePlayerUUID != null) { - return onlinePlayerUUID - } - return fetchFromMojang(playerName = playerName)?.let { - UUID.fromString(it.uuid.toDashFormattedUUID()) - } - } - - private suspend fun fetchFromMojang(playerName: String): MojangPlayer? { - val cacheHit = mojangPlayerCache[playerName] - if (cacheHit != null) { - return cacheHit - } - return try { - httpService.get(playerName) - } catch (e: PlayerUUIDHttpService.PlayerNotFoundException) { - null - } - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/chat/ChatBadgeFormatter.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/chat/ChatBadgeFormatter.kt index 92c316afc..ecc3e8ca8 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/chat/ChatBadgeFormatter.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/chat/ChatBadgeFormatter.kt @@ -1,19 +1,15 @@ package com.projectcitybuild.pcbridge.features.chat -import com.projectcitybuild.pcbridge.features.chat.repositories.ChatBadgeRepository +import com.projectcitybuild.pcbridge.http.responses.Badge import net.kyori.adventure.text.Component import net.kyori.adventure.text.event.HoverEvent import net.kyori.adventure.text.format.NamedTextColor import net.kyori.adventure.text.minimessage.MiniMessage -import java.util.UUID -class ChatBadgeFormatter( - private val chatBadgeRepository: ChatBadgeRepository, -) { - fun get(playerUUID: UUID): Component? { - val badges = chatBadgeRepository.getBadgesForPlayer(playerUUID) +class ChatBadgeFormatter() { + fun format(badges: List, icon: String): Component { if (badges.isEmpty()) { - return null + return Component.empty() } val formattedBadge = @@ -37,7 +33,7 @@ class ChatBadgeFormatter( } } return MiniMessage.miniMessage() - .deserialize(chatBadgeRepository.getIcon()) + .deserialize(icon) .hoverEvent(HoverEvent.showText(formattedBadge)) } } diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/chat/ChatGroupFormatter.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/chat/ChatGroupFormatter.kt index 9bd6b0c9d..974371e49 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/chat/ChatGroupFormatter.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/chat/ChatGroupFormatter.kt @@ -1,14 +1,10 @@ package com.projectcitybuild.pcbridge.features.chat -import com.projectcitybuild.pcbridge.features.chat.repositories.ChatGroupRepository import net.kyori.adventure.text.Component import net.kyori.adventure.text.event.HoverEvent import net.kyori.adventure.text.minimessage.MiniMessage -import java.util.UUID -class ChatGroupFormatter( - private val chatGroupRepository: ChatGroupRepository, -) { +class ChatGroupFormatter { data class Aggregate( val prefix: Component, val suffix: Component, @@ -17,13 +13,18 @@ class ChatGroupFormatter( private val groupPriorities: MutableMap> = mutableMapOf() - fun format(playerUUID: UUID): Aggregate { + fun format( + groupNames: Set, + groupDisplayNames: Map, + groupHoverNames: Map, + groupDisplayPriorities: Map>, + prefix: String, + suffix: String, + ): Aggregate { if (groupPriorities.isEmpty()) { - buildGroupList() + buildGroupList(groupDisplayPriorities) } - val groupNames = chatGroupRepository.getGroupNamesForPlayer(playerUUID) - var highestTrust: Pair? = null var highestBuild: Pair? = null var highestDonor: Pair? = null @@ -53,35 +54,51 @@ class ChatGroupFormatter( val groupComponent = Component.text() if (highestDonor != null) { - groupComponent.append(groupTextComponent(highestDonor)) + groupComponent.append( + groupTextComponent( + highestDonor, + hoverName = groupHoverNames[highestDonor.second], + displayName = groupDisplayNames[highestDonor.second], + ) + ) } if (highestTrust != null) { - groupComponent.append(groupTextComponent(highestTrust)) + groupComponent.append( + groupTextComponent( + highestTrust, + hoverName = groupHoverNames[highestTrust.second], + displayName = groupDisplayNames[highestTrust.second], + ) + ) } if (highestBuild != null) { - groupComponent.append(groupTextComponent(highestBuild)) + groupComponent.append( + groupTextComponent( + highestBuild, + hoverName = groupHoverNames[highestBuild.second], + displayName = groupDisplayNames[highestBuild.second], + ) + ) } return Aggregate( prefix = - MiniMessage.miniMessage().deserialize( - chatGroupRepository.getPrefixForPlayer(playerUUID), - ), + MiniMessage.miniMessage().deserialize(prefix), suffix = - MiniMessage.miniMessage().deserialize( - chatGroupRepository.getSuffixForPlayer(playerUUID), - ), + MiniMessage.miniMessage().deserialize(suffix), groups = groupComponent.build(), ) } - private fun groupTextComponent(group: Pair): Component { + private fun groupTextComponent( + group: Pair, + hoverName: String?, + displayName: String?, + ): Component { val groupName = group.second - val hoverName = chatGroupRepository.getGroupHoverName(groupName) - val displayName = chatGroupRepository.getGroupDisplayName(groupName) ?: groupName return MiniMessage.miniMessage() - .deserialize(displayName) + .deserialize(displayName ?: groupName) .also { if (!hoverName.isNullOrEmpty()) { it.hoverEvent( @@ -91,18 +108,18 @@ class ChatGroupFormatter( } } - private fun buildGroupList() { - val trustedGroupPriority = chatGroupRepository.getDisplayPriority(ChatGroupType.TRUST) - val builderGroupPriority = chatGroupRepository.getDisplayPriority(ChatGroupType.BUILD) - val donorGroupPriority = chatGroupRepository.getDisplayPriority(ChatGroupType.DONOR) + private fun buildGroupList(groupDisplayPriorities: Map>) { + val trustedGroupPriority = groupDisplayPriorities[ChatGroupType.TRUST] + val builderGroupPriority = groupDisplayPriorities[ChatGroupType.BUILD] + val donorGroupPriority = groupDisplayPriorities[ChatGroupType.DONOR] - trustedGroupPriority.withIndex().forEach { + trustedGroupPriority?.withIndex()?.forEach { groupPriorities[it.value.lowercase()] = Pair(ChatGroupType.TRUST, it.index) } - builderGroupPriority.withIndex().forEach { + builderGroupPriority?.withIndex()?.forEach { groupPriorities[it.value.lowercase()] = Pair(ChatGroupType.BUILD, it.index) } - donorGroupPriority.withIndex().forEach { + donorGroupPriority?.withIndex()?.forEach { groupPriorities[it.value.lowercase()] = Pair(ChatGroupType.DONOR, it.index) } } diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/chat/listeners/FormatNameChatListener.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/chat/listeners/FormatNameChatListener.kt index 5203ef736..84b34cc8c 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/chat/listeners/FormatNameChatListener.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/chat/listeners/FormatNameChatListener.kt @@ -1,8 +1,7 @@ package com.projectcitybuild.pcbridge.features.chat.listeners -import com.projectcitybuild.pcbridge.features.chat.ChatBadgeFormatter -import com.projectcitybuild.pcbridge.features.chat.ChatGroupFormatter -import io.github.reactivecircus.cache4k.Cache +import com.projectcitybuild.pcbridge.features.chat.repositories.ChatBadgeRepository +import com.projectcitybuild.pcbridge.features.chat.repositories.ChatGroupRepository import io.papermc.paper.chat.ChatRenderer import io.papermc.paper.event.player.AsyncChatEvent import kotlinx.coroutines.runBlocking @@ -11,13 +10,10 @@ import org.bukkit.entity.Player import org.bukkit.event.EventHandler import org.bukkit.event.EventPriority import org.bukkit.event.Listener -import java.util.UUID class FormatNameChatListener( - private val chatGroupFormatter: ChatGroupFormatter, - private val chatBadgeFormatter: ChatBadgeFormatter, - private val badgeCache: Cache, - private val groupCache: Cache, + private val chatBadgeRepository: ChatBadgeRepository, + private val chatGroupRepository: ChatGroupRepository, ) : Listener, ChatRenderer.ViewerUnaware { @EventHandler(priority = EventPriority.HIGHEST) fun onChat(event: AsyncChatEvent) { @@ -33,14 +29,9 @@ class FormatNameChatListener( ): Component = runBlocking { val uuid = source.uniqueId - val badge = - badgeCache.get(uuid) { - chatBadgeFormatter.get(uuid) ?: Component.empty() - } - val groups = - groupCache.get(uuid) { - chatGroupFormatter.format(uuid) - } + val badge = chatBadgeRepository.getComponent(uuid) + val groups = chatGroupRepository.getAggregate(uuid) + Component.text() .append( badge, diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/chat/listeners/SyncBadgesOnJoinListener.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/chat/listeners/SyncBadgesOnJoinListener.kt deleted file mode 100644 index 054251c74..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/chat/listeners/SyncBadgesOnJoinListener.kt +++ /dev/null @@ -1,25 +0,0 @@ -package com.projectcitybuild.pcbridge.features.chat.listeners - -import com.projectcitybuild.pcbridge.core.state.Store -import com.projectcitybuild.pcbridge.features.bans.events.ConnectionPermittedEvent -import org.bukkit.event.EventHandler -import org.bukkit.event.Listener - -class SyncBadgesOnJoinListener( - private val store: Store, -) : Listener { - @EventHandler - suspend fun onConnectionPermitted(event: ConnectionPermittedEvent) { - store.mutate { state -> - val player = - state.players[event.playerUUID]!!.copy( - badges = event.aggregate.badges, - ) - val players = - state.players.apply { - put(event.playerUUID, player) - } - state.copy(players = players) - } - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/chat/listeners/SyncPlayerChatListener.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/chat/listeners/SyncPlayerChatListener.kt new file mode 100644 index 000000000..024d9fa97 --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/chat/listeners/SyncPlayerChatListener.kt @@ -0,0 +1,21 @@ +package com.projectcitybuild.pcbridge.features.chat.listeners + +import com.projectcitybuild.pcbridge.core.logger.log +import com.projectcitybuild.pcbridge.features.chat.repositories.ChatBadgeRepository +import com.projectcitybuild.pcbridge.features.chat.repositories.ChatGroupRepository +import com.projectcitybuild.pcbridge.features.playerstate.events.PlayerStateUpdatedEvent +import org.bukkit.event.EventHandler +import org.bukkit.event.Listener + +class SyncPlayerChatListener( + private val chatGroupRepository: ChatGroupRepository, + private val chatBadgeRepository: ChatBadgeRepository, +) : Listener { + @EventHandler + fun onPlayerStateUpdated(event: PlayerStateUpdatedEvent) { + log.info { "Invalidating chat format cache for ${event.playerUUID}" } + + chatGroupRepository.invalidate(event.playerUUID) + chatBadgeRepository.invalidate(event.playerUUID) + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/chat/repositories/ChatBadgeRepository.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/chat/repositories/ChatBadgeRepository.kt index 1a37404bd..9446384ab 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/chat/repositories/ChatBadgeRepository.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/chat/repositories/ChatBadgeRepository.kt @@ -2,19 +2,29 @@ package com.projectcitybuild.pcbridge.features.chat.repositories import com.projectcitybuild.pcbridge.core.config.Config import com.projectcitybuild.pcbridge.core.state.Store -import com.projectcitybuild.pcbridge.http.responses.Badge +import com.projectcitybuild.pcbridge.features.chat.ChatBadgeFormatter +import io.github.reactivecircus.cache4k.Cache +import net.kyori.adventure.text.Component import java.util.UUID class ChatBadgeRepository( private val config: Config, private val store: Store, + private val badgeCache: Cache, + private val badgeFormatter: ChatBadgeFormatter, ) { - fun getIcon(): String { - return config.get().chatBadge.icon + suspend fun getComponent(playerUUID: UUID): Component { + return badgeCache.get(playerUUID) { + val badges = store.state.players[playerUUID]?.badges + ?: emptyList() + + val icon = config.get().chatBadge.icon + + badgeFormatter.format(badges, icon) + } } - fun getBadgesForPlayer(playerUuid: UUID): List { - return store.state.players[playerUuid]?.badges - ?: emptyList() + fun invalidate(playerUUID: UUID) { + badgeCache.invalidate(playerUUID) } } diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/chat/repositories/ChatGroupRepository.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/chat/repositories/ChatGroupRepository.kt index 59c0df83d..d9f33e5d4 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/chat/repositories/ChatGroupRepository.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/chat/repositories/ChatGroupRepository.kt @@ -2,44 +2,49 @@ package com.projectcitybuild.pcbridge.features.chat.repositories import com.projectcitybuild.pcbridge.core.config.Config import com.projectcitybuild.pcbridge.core.permissions.Permissions +import com.projectcitybuild.pcbridge.features.chat.ChatGroupFormatter import com.projectcitybuild.pcbridge.features.chat.ChatGroupType +import io.github.reactivecircus.cache4k.Cache import java.util.UUID class ChatGroupRepository( private val permissions: Permissions, private val config: Config, + private val chatGroupFormatter: ChatGroupFormatter, + private val groupCache: Cache, ) { - fun getGroupNamesForPlayer(playerUUID: UUID): Set { - return permissions.getUserGroups(playerUUID) - } - - fun getPrefixForPlayer(playerUUID: UUID): String { - return permissions.getUserPrefix(playerUUID) - } - - fun getSuffixForPlayer(playerUUID: UUID): String { - return permissions.getUserSuffix(playerUUID) - } + suspend fun getAggregate(playerUUID: UUID): ChatGroupFormatter.Aggregate { + return groupCache.get(playerUUID) { + val groupNames = permissions.getUserGroups(playerUUID) - fun getGroupDisplayName(groupName: String): String? { - return permissions.getGroupMetaData( - groupName = groupName, - key = "chat_display_name", - ) ?: permissions.getGroupDisplayName(groupName) - } - - fun getGroupHoverName(groupName: String): String? { - return permissions.getGroupMetaData( - groupName = groupName, - key = "chat_hover_name", - ) + chatGroupFormatter.format( + groupNames = groupNames, + groupDisplayNames = groupNames.fold(mutableMapOf()) { map, groupName -> + map[groupName] = permissions.getGroupMetaData( + groupName = groupName, + key = "chat_display_name", + ) ?: permissions.getGroupDisplayName(groupName) + map + }, + groupHoverNames = groupNames.fold(mutableMapOf()) { map, groupName -> + map[groupName] = permissions.getGroupMetaData( + groupName = groupName, + key = "chat_display_name", + ) ?: permissions.getGroupDisplayName(groupName) + map + }, + groupDisplayPriorities = mapOf( + Pair(ChatGroupType.TRUST, config.get().groups.displayPriority.trust), + Pair(ChatGroupType.BUILD, config.get().groups.displayPriority.builder), + Pair(ChatGroupType.DONOR, config.get().groups.displayPriority.donor), + ), + suffix = permissions.getUserSuffix(playerUUID), + prefix = permissions.getUserPrefix(playerUUID), + ) + } } - fun getDisplayPriority(groupType: ChatGroupType): List { - return when (groupType) { - ChatGroupType.TRUST -> config.get().groups.displayPriority.trust - ChatGroupType.BUILD -> config.get().groups.displayPriority.builder - ChatGroupType.DONOR -> config.get().groups.displayPriority.donor - } + fun invalidate(playerUUID: UUID) { + groupCache.invalidate(playerUUID) } } diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/sync/actions/SyncPlayerGroups.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/groups/actions/SyncPlayerGroups.kt similarity index 84% rename from pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/sync/actions/SyncPlayerGroups.kt rename to pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/groups/actions/SyncPlayerGroups.kt index f3b66a778..e7e8ee69f 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/sync/actions/SyncPlayerGroups.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/groups/actions/SyncPlayerGroups.kt @@ -1,7 +1,7 @@ -package com.projectcitybuild.pcbridge.features.sync.actions +package com.projectcitybuild.pcbridge.features.groups.actions import com.projectcitybuild.pcbridge.core.permissions.Permissions -import com.projectcitybuild.pcbridge.features.sync.repositories.SyncRepository +import com.projectcitybuild.pcbridge.features.groups.repositories.SyncRepository import com.projectcitybuild.pcbridge.http.responses.DonationPerk import com.projectcitybuild.pcbridge.http.responses.Group import java.util.UUID diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/groups/commands/SyncCommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/groups/commands/SyncCommand.kt new file mode 100644 index 000000000..340e4d9ce --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/groups/commands/SyncCommand.kt @@ -0,0 +1,78 @@ +package com.projectcitybuild.pcbridge.features.groups.commands + +import com.projectcitybuild.pcbridge.features.groups.events.PlayerSyncRequestedEvent +import com.projectcitybuild.pcbridge.support.messages.CommandHelpBuilder +import com.projectcitybuild.pcbridge.support.spigot.BadCommandUsageException +import com.projectcitybuild.pcbridge.support.spigot.CommandArgsParser +import com.projectcitybuild.pcbridge.support.spigot.SpigotCommand +import com.projectcitybuild.pcbridge.support.spigot.SpigotEventBroadcaster +import net.kyori.adventure.text.minimessage.MiniMessage +import org.bukkit.Server +import org.bukkit.command.CommandSender +import org.bukkit.entity.Player + +class SyncCommand( + private val server: Server, + private val eventBroadcaster: SpigotEventBroadcaster, +) : SpigotCommand { + override val label = "sync" + + override val usage = CommandHelpBuilder() + + override suspend fun run( + sender: CommandSender, + args: Args, + ) { + check(sender is Player) { + "Only players can use this command" + } + if (args.playerName.isEmpty()) { + sync(sender, message = "Fetching player data...") + } else { + syncOther(sender, playerName = args.playerName) + } + } + + private suspend fun syncOther(sender: Player, playerName: String) { + check (sender.hasPermission("pcbridge.sync.other")) { + "You do not have permission" + } + val player = server.onlinePlayers.firstOrNull { it.name.lowercase() == playerName.lowercase() } + if (player == null) { + sender.sendMessage( + MiniMessage.miniMessage().deserialize("Player not found: ${playerName}") + ) + return + } + sync(player, message = "Fetching player data for ${player.name}...") + + sender.sendMessage( + MiniMessage.miniMessage().deserialize("Player data synced") + ) + } + + private suspend fun sync(player: Player, message: String) { + player.sendMessage( + MiniMessage.miniMessage().deserialize("$message") + ) + eventBroadcaster.broadcast( + PlayerSyncRequestedEvent(playerUUID = player.uniqueId), + ) + } + + data class Args( + val playerName: String, + ) { + class Parser : CommandArgsParser { + override fun parse(args: List): Args { + if (args.isEmpty()) { + return Args(playerName = "") + } + if (args.size > 1) { + throw BadCommandUsageException() + } + return Args(playerName = args[0]) + } + } + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/groups/events/PlayerSyncRequestedEvent.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/groups/events/PlayerSyncRequestedEvent.kt new file mode 100644 index 000000000..7faf91d92 --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/groups/events/PlayerSyncRequestedEvent.kt @@ -0,0 +1,20 @@ +package com.projectcitybuild.pcbridge.features.groups.events + +import org.bukkit.event.Event +import org.bukkit.event.HandlerList +import java.util.UUID + +class PlayerSyncRequestedEvent( + val playerUUID: UUID, +) : Event() { + override fun getHandlers(): HandlerList { + return HANDLERS + } + + companion object { + private val HANDLERS = HandlerList() + + @JvmStatic + fun getHandlerList() = HANDLERS + } +} \ No newline at end of file diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/groups/listener/SyncRankListener.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/groups/listener/SyncRankListener.kt new file mode 100644 index 000000000..c61019cea --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/groups/listener/SyncRankListener.kt @@ -0,0 +1,19 @@ +package com.projectcitybuild.pcbridge.features.groups.listener + +import com.projectcitybuild.pcbridge.features.playerstate.events.PlayerStateUpdatedEvent +import com.projectcitybuild.pcbridge.features.groups.actions.SyncPlayerGroups +import org.bukkit.event.EventHandler +import org.bukkit.event.Listener + +class SyncRankListener( + private val syncPlayerGroups: SyncPlayerGroups, +) : Listener { + @EventHandler + fun onPlayerStateUpdated(event: PlayerStateUpdatedEvent) { + syncPlayerGroups.execute( + playerUUID = event.playerUUID, + groups = event.state.account?.groups ?: emptyList(), + donationPerks = event.state.donationPerks, + ) + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/groups/repositories/SyncRepository.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/groups/repositories/SyncRepository.kt new file mode 100644 index 000000000..e7e74afc6 --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/groups/repositories/SyncRepository.kt @@ -0,0 +1,26 @@ +package com.projectcitybuild.pcbridge.features.groups.repositories + +import com.projectcitybuild.pcbridge.core.config.Config +import com.projectcitybuild.pcbridge.core.logger.log +import com.projectcitybuild.pcbridge.http.responses.DonationPerk + +class SyncRepository( + private val config: Config, +) { + fun getDonorTiers(perks: List): List { + return perks.mapNotNull { donorPerk -> + val tierName = donorPerk.donationTier.name + + val groupNames = config.get().groups.donorTierGroupNames + when (tierName) { + "copper" -> groupNames.copper + "iron" -> groupNames.iron + "diamond" -> groupNames.diamond + else -> { + log.error { "Missing config node for donor tier: $tierName" } + null + } + } + } + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/joinmessages/listeners/AnnounceJoinListener.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/joinmessages/listeners/AnnounceJoinListener.kt index decd0597d..00664030e 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/joinmessages/listeners/AnnounceJoinListener.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/joinmessages/listeners/AnnounceJoinListener.kt @@ -1,9 +1,6 @@ package com.projectcitybuild.pcbridge.features.joinmessages.listeners import com.projectcitybuild.pcbridge.core.config.Config -import com.projectcitybuild.pcbridge.core.datetime.LocalizedTime -import com.projectcitybuild.pcbridge.core.state.PlayerState -import com.projectcitybuild.pcbridge.core.state.Store import net.kyori.adventure.text.Component import net.kyori.adventure.text.minimessage.MiniMessage import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder @@ -14,27 +11,14 @@ import org.bukkit.event.player.PlayerJoinEvent class AnnounceJoinListener( private val config: Config, - private val store: Store, - private val time: LocalizedTime, ) : Listener { @EventHandler(priority = EventPriority.NORMAL) - suspend fun onPlayerJoin(event: PlayerJoinEvent) { - store.mutate { state -> - val players = - state.players.also { - it[event.player.uniqueId] = - it - .getOrDefault(event.player.uniqueId, defaultValue = PlayerState.empty()) - .copy(connectedAt = time.now()) - } - state.copy( - players = players, - ) - } + fun onPlayerJoin(event: PlayerJoinEvent) { + val joinMessage = config.get().messages.join event.joinMessage( MiniMessage.miniMessage().deserialize( - config.get().messages.join, + joinMessage, Placeholder.component("name", Component.text(event.player.name)), ), ) diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/joinmessages/listeners/AnnounceQuitListener.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/joinmessages/listeners/AnnounceQuitListener.kt index 07ef65fea..556d8a060 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/joinmessages/listeners/AnnounceQuitListener.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/joinmessages/listeners/AnnounceQuitListener.kt @@ -19,21 +19,16 @@ class AnnounceQuitListener( private val time: LocalizedTime, ) : Listener { @EventHandler(priority = EventPriority.NORMAL) - suspend fun onPlayerQuit(event: PlayerQuitEvent) { + fun onPlayerQuit(event: PlayerQuitEvent) { val playerState = store.state.players[event.player.uniqueId] val joinTime = playerState?.connectedAt ?: time.now() - - store.mutate { state -> - state.copy( - players = state.players.apply { remove(event.player.uniqueId) }, - ) - } - val timeOnline = sessionTime(start = joinTime) + val leaveMessage = config.get().messages.leave + event.quitMessage( MiniMessage.miniMessage().deserialize( - config.get().messages.leave, + leaveMessage, Placeholder.component("name", Component.text(event.player.name)), Placeholder.component("time_online", Component.text(timeOnline)), ), diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/joinmessages/repositories/PlayerConfigRepository.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/joinmessages/repositories/PlayerConfigRepository.kt index 8626bf230..d8bb45da7 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/joinmessages/repositories/PlayerConfigRepository.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/joinmessages/repositories/PlayerConfigRepository.kt @@ -18,8 +18,7 @@ class PlayerConfigRepository( connection.prepareStatement("SELECT * FROM players WHERE `uuid`=(?) LIMIT 1") .apply { setString(1, uuid.toString()) } .use { it.executeQuery() } - .use { it.firstRow() } - ?.toPlayerConfig() + .use { it.firstRow()?.toPlayerConfig() } } } diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/mute/commands/MuteCommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/mute/commands/MuteCommand.kt deleted file mode 100644 index c6bcbb16d..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/mute/commands/MuteCommand.kt +++ /dev/null @@ -1,61 +0,0 @@ -package com.projectcitybuild.pcbridge.features.mute.commands - -import com.projectcitybuild.pcbridge.support.messages.CommandHelpBuilder -import com.projectcitybuild.pcbridge.support.spigot.BadCommandUsageException -import com.projectcitybuild.pcbridge.support.spigot.CommandArgsParser -import com.projectcitybuild.pcbridge.support.spigot.SpigotCommand -import io.github.reactivecircus.cache4k.Cache -import net.kyori.adventure.text.Component -import net.kyori.adventure.text.format.NamedTextColor -import net.kyori.adventure.text.format.TextDecoration -import org.bukkit.Server -import org.bukkit.command.CommandSender -import java.util.UUID - -class MuteCommand( - private val server: Server, - private val mutedPlayers: Cache, -) : SpigotCommand { - override val label = "mute" - - override val usage = CommandHelpBuilder() // TODO - - override suspend fun run( - sender: CommandSender, - args: Args, - ) { - val player = server.getPlayer(args.playerName) - checkNotNull(player) { - "Player ${args.playerName} not found" - } - check(mutedPlayers.get(player.uniqueId) == null) { - "Player ${args.playerName} is already muted" - } - mutedPlayers.put(player.uniqueId, Unit) - - sender.sendMessage( - Component.text("Player ${args.playerName} has been muted") - .color(NamedTextColor.GRAY) - .decorate(TextDecoration.ITALIC), - ) - - player.sendMessage( - Component.text("You have been muted") - .color(NamedTextColor.RED) - .decorate(TextDecoration.ITALIC), - ) - } - - data class Args( - val playerName: String, - ) { - class Parser : CommandArgsParser { - override fun parse(args: List): Args { - if (args.isEmpty()) { - throw BadCommandUsageException() - } - return Args(playerName = args[0]) - } - } - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/mute/commands/UnmuteCommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/mute/commands/UnmuteCommand.kt deleted file mode 100644 index 20d2144cc..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/mute/commands/UnmuteCommand.kt +++ /dev/null @@ -1,61 +0,0 @@ -package com.projectcitybuild.pcbridge.features.mute.commands - -import com.projectcitybuild.pcbridge.support.messages.CommandHelpBuilder -import com.projectcitybuild.pcbridge.support.spigot.BadCommandUsageException -import com.projectcitybuild.pcbridge.support.spigot.CommandArgsParser -import com.projectcitybuild.pcbridge.support.spigot.SpigotCommand -import io.github.reactivecircus.cache4k.Cache -import net.kyori.adventure.text.Component -import net.kyori.adventure.text.format.NamedTextColor -import net.kyori.adventure.text.format.TextDecoration -import org.bukkit.Server -import org.bukkit.command.CommandSender -import java.util.UUID - -class UnmuteCommand( - private val server: Server, - private val mutedPlayers: Cache, -) : SpigotCommand { - override val label = "unmute" - - override val usage = CommandHelpBuilder() // TODO - - override suspend fun run( - sender: CommandSender, - args: Args, - ) { - val player = server.getPlayer(args.playerName) - checkNotNull(player) { - "Player ${args.playerName} not found" - } - check(mutedPlayers.get(player.uniqueId) != null) { - "Player ${args.playerName} is not currently muted" - } - mutedPlayers.invalidate(player.uniqueId) - - sender.sendMessage( - Component.text("Player ${args.playerName} has been unmuted") - .color(NamedTextColor.GRAY) - .decorate(TextDecoration.ITALIC), - ) - - player.sendMessage( - Component.text("You have been unmuted") - .color(NamedTextColor.LIGHT_PURPLE) - .decorate(TextDecoration.ITALIC), - ) - } - - data class Args( - val playerName: String, - ) { - class Parser : CommandArgsParser { - override fun parse(args: List): Args { - if (args.isEmpty()) { - throw BadCommandUsageException() - } - return Args(playerName = args[0]) - } - } - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/mute/listeners/MuteChatListener.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/mute/listeners/MuteChatListener.kt deleted file mode 100644 index d7bd2184b..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/mute/listeners/MuteChatListener.kt +++ /dev/null @@ -1,25 +0,0 @@ -package com.projectcitybuild.pcbridge.features.mute.listeners - -import io.github.reactivecircus.cache4k.Cache -import io.papermc.paper.event.player.AsyncChatEvent -import net.kyori.adventure.text.Component -import net.kyori.adventure.text.format.NamedTextColor -import org.bukkit.event.EventHandler -import org.bukkit.event.EventPriority -import org.bukkit.event.Listener -import java.util.UUID - -class MuteChatListener( - private val mutedPlayers: Cache, -) : Listener { - @EventHandler(priority = EventPriority.HIGHEST) - fun onChat(event: AsyncChatEvent) { - if (mutedPlayers.get(event.player.uniqueId) != null) { - event.isCancelled = true - event.player.sendMessage( - Component.text("You cannot talk while muted") - .color(NamedTextColor.RED), - ) - } - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/playerstate/events/PlayerStateDestroyedEvent.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/playerstate/events/PlayerStateDestroyedEvent.kt new file mode 100644 index 000000000..d58dd69f8 --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/playerstate/events/PlayerStateDestroyedEvent.kt @@ -0,0 +1,22 @@ +package com.projectcitybuild.pcbridge.features.playerstate.events + +import com.projectcitybuild.pcbridge.core.state.PlayerState +import org.bukkit.event.Event +import org.bukkit.event.HandlerList +import java.util.UUID + +class PlayerStateDestroyedEvent( + val playerData: PlayerState?, + val playerUUID: UUID, +) : Event() { + override fun getHandlers(): HandlerList { + return HANDLERS + } + + companion object { + private val HANDLERS = HandlerList() + + @JvmStatic + fun getHandlerList() = HANDLERS + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/playerstate/events/PlayerStateUpdatedEvent.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/playerstate/events/PlayerStateUpdatedEvent.kt new file mode 100644 index 000000000..dca66e135 --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/playerstate/events/PlayerStateUpdatedEvent.kt @@ -0,0 +1,22 @@ +package com.projectcitybuild.pcbridge.features.playerstate.events + +import com.projectcitybuild.pcbridge.core.state.PlayerState +import org.bukkit.event.Event +import org.bukkit.event.HandlerList +import java.util.UUID + +class PlayerStateUpdatedEvent( + val state: PlayerState, + val playerUUID: UUID, +) : Event() { + override fun getHandlers(): HandlerList { + return HANDLERS + } + + companion object { + private val HANDLERS = HandlerList() + + @JvmStatic + fun getHandlerList() = HANDLERS + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/playerstate/listeners/PlayerStateListener.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/playerstate/listeners/PlayerStateListener.kt new file mode 100644 index 000000000..e494813d5 --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/playerstate/listeners/PlayerStateListener.kt @@ -0,0 +1,66 @@ +package com.projectcitybuild.pcbridge.features.playerstate.listeners + +import com.projectcitybuild.pcbridge.core.datetime.LocalizedTime +import com.projectcitybuild.pcbridge.core.logger.log +import com.projectcitybuild.pcbridge.core.state.PlayerState +import com.projectcitybuild.pcbridge.core.state.Store +import com.projectcitybuild.pcbridge.features.bans.events.ConnectionPermittedEvent +import com.projectcitybuild.pcbridge.features.playerstate.events.PlayerStateUpdatedEvent +import com.projectcitybuild.pcbridge.features.playerstate.events.PlayerStateDestroyedEvent +import com.projectcitybuild.pcbridge.support.spigot.SpigotEventBroadcaster +import org.bukkit.event.EventHandler +import org.bukkit.event.EventPriority +import org.bukkit.event.Listener +import org.bukkit.event.player.PlayerQuitEvent + +class PlayerStateListener( + private val store: Store, + private val time: LocalizedTime, + private val eventBroadcaster: SpigotEventBroadcaster, +) : Listener { + /** + * Creates a PlayerState for the connecting user + */ + @EventHandler + suspend fun onConnectionPermitted(event: ConnectionPermittedEvent) { + log.info { "Creating player state for ${event.playerUUID}" } + + val playerState = event.playerData?.let { + PlayerState.fromPlayerData(it, connectedAt = time.now()) + } ?: PlayerState(connectedAt = time.now()) + + store.mutate { state -> + state.copy(players = state.players.apply { put(event.playerUUID, playerState) }) + } + eventBroadcaster.broadcast( + PlayerStateUpdatedEvent( + state = playerState, + playerUUID = event.playerUUID, + ), + ) + + // TODO: warn the user if their data was unable to be fetched + } + + /** + * Destroys PlayerState for the disconnecting user. + * + * Note: Runs at highest priority so that it's invoked last + */ + @EventHandler(priority = EventPriority.HIGHEST) + suspend fun onPlayerQuit(event: PlayerQuitEvent) { + val uuid = event.player.uniqueId + log.info { "Destroying player state for $uuid" } + val prevState = store.state.players[uuid] + + store.mutate { state -> + state.copy(players = state.players.apply { remove(uuid) }) + } + eventBroadcaster.broadcast( + PlayerStateDestroyedEvent( + playerData = prevState, + playerUUID = uuid, + ), + ) + } +} \ No newline at end of file diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/playerstate/listeners/PlayerSyncRequestListener.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/playerstate/listeners/PlayerSyncRequestListener.kt new file mode 100644 index 000000000..5c5fe6da1 --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/playerstate/listeners/PlayerSyncRequestListener.kt @@ -0,0 +1,54 @@ +package com.projectcitybuild.pcbridge.features.playerstate.listeners + +import com.projectcitybuild.pcbridge.core.datetime.LocalizedTime +import com.projectcitybuild.pcbridge.core.logger.log +import com.projectcitybuild.pcbridge.core.state.PlayerState +import com.projectcitybuild.pcbridge.core.state.Store +import com.projectcitybuild.pcbridge.features.bans.repositories.PlayerRepository +import com.projectcitybuild.pcbridge.features.playerstate.events.PlayerStateUpdatedEvent +import com.projectcitybuild.pcbridge.features.groups.events.PlayerSyncRequestedEvent +import com.projectcitybuild.pcbridge.support.spigot.SpigotEventBroadcaster +import net.kyori.adventure.text.minimessage.MiniMessage +import org.bukkit.Server +import org.bukkit.event.EventHandler +import org.bukkit.event.Listener + +class PlayerSyncRequestListener( + private val store: Store, + private val time: LocalizedTime, + private val playerRepository: PlayerRepository, + private val server: Server, + private val eventBroadcaster: SpigotEventBroadcaster, +) : Listener { + @EventHandler + suspend fun onSyncRequested(event: PlayerSyncRequestedEvent) { + val matchingPlayer = server.onlinePlayers.firstOrNull { it.uniqueId == event.playerUUID } + if (matchingPlayer == null) { + log.info { "Skipping sync, player (${event.playerUUID}) not found" } + return + } + + log.info { "Creating player state for ${event.playerUUID}" } + + val playerData = playerRepository.get( + playerUUID = matchingPlayer.uniqueId, + ip = matchingPlayer.address.address, + ) + val playerState = PlayerState.fromPlayerData( + playerData, + connectedAt = time.now(), + ) + store.mutate { state -> + state.copy(players = state.players.apply { put(event.playerUUID, playerState) }) + } + eventBroadcaster.broadcast( + PlayerStateUpdatedEvent( + state = playerState, + playerUUID = event.playerUUID, + ), + ) + matchingPlayer.sendMessage( + MiniMessage.miniMessage().deserialize("Your account has been synced") + ) + } +} \ No newline at end of file diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/register/commands/CodeCommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/register/commands/CodeCommand.kt new file mode 100644 index 000000000..054a37279 --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/register/commands/CodeCommand.kt @@ -0,0 +1,66 @@ +package com.projectcitybuild.pcbridge.features.register.commands + +import com.projectcitybuild.pcbridge.http.parsing.ResponseParser +import com.projectcitybuild.pcbridge.http.services.pcb.RegisterHttpService +import com.projectcitybuild.pcbridge.support.messages.CommandHelpBuilder +import com.projectcitybuild.pcbridge.support.spigot.BadCommandUsageException +import com.projectcitybuild.pcbridge.support.spigot.CommandArgsParser +import com.projectcitybuild.pcbridge.support.spigot.SpigotCommand +import net.kyori.adventure.text.Component +import net.kyori.adventure.text.format.NamedTextColor +import net.kyori.adventure.text.minimessage.MiniMessage +import org.bukkit.command.CommandSender +import org.bukkit.entity.Player + +class CodeCommand( + private val registerHttpService: RegisterHttpService, +) : SpigotCommand { + override val label = "code" + + override val usage = CommandHelpBuilder() + + override suspend fun run( + sender: CommandSender, + args: Args, + ) { + check(sender is Player) { + "Only players can use this command" + } + try { + registerHttpService.verifyCode( + code = args.code, + playerUUID = sender.uniqueId, + ) + sender.sendMessage( + Component.text("Registration complete! Your account will be synced momentarily...") + .color(NamedTextColor.GREEN), + ) + } catch (e: ResponseParser.NotFoundError) { + sender.sendMessage( + Component.text("Error: Code is invalid or expired") + .color(NamedTextColor.RED), + ) + } catch (e: ResponseParser.ValidationError) { + sender.sendMessage( + Component.text("Error: ${e.message ?: "Unknown error occurred"}") + .color(NamedTextColor.RED), + ) + } + } + + data class Args( + val code: String, + ) { + class Parser : CommandArgsParser { + override fun parse(args: List): Args { + if (args.isEmpty()) { + throw BadCommandUsageException() + } + if (args.size > 1) { + throw BadCommandUsageException() + } + return Args(code = args[0]) + } + } + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/register/commands/RegisterCommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/register/commands/RegisterCommand.kt new file mode 100644 index 000000000..5242c4f9a --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/register/commands/RegisterCommand.kt @@ -0,0 +1,64 @@ +package com.projectcitybuild.pcbridge.features.register.commands + +import com.projectcitybuild.pcbridge.http.parsing.ResponseParser +import com.projectcitybuild.pcbridge.http.services.pcb.RegisterHttpService +import com.projectcitybuild.pcbridge.support.messages.CommandHelpBuilder +import com.projectcitybuild.pcbridge.support.spigot.BadCommandUsageException +import com.projectcitybuild.pcbridge.support.spigot.CommandArgsParser +import com.projectcitybuild.pcbridge.support.spigot.SpigotCommand +import net.kyori.adventure.text.Component +import net.kyori.adventure.text.format.NamedTextColor +import net.kyori.adventure.text.minimessage.MiniMessage +import org.bukkit.command.CommandSender +import org.bukkit.entity.Player + +class RegisterCommand( + private val registerHttpService: RegisterHttpService, +) : SpigotCommand { + override val label = "register" + + override val usage = CommandHelpBuilder() + + override suspend fun run( + sender: CommandSender, + args: Args, + ) { + check(sender is Player) { + "Only players can use this command" + } + try { + registerHttpService.sendCode( + email = args.email, + playerAlias = sender.name, + playerUUID = sender.uniqueId, + ) + sender.sendMessage( + MiniMessage.miniMessage().deserialize( + "A code has been emailed to ${args.email}." + + "Please type it in with /code [code]" + ) + ) + } catch (e: ResponseParser.ValidationError) { + sender.sendMessage( + Component.text("Error: ${e.message ?: "Unknown error occurred"}") + .color(NamedTextColor.RED), + ) + } + } + + data class Args( + val email: String, + ) { + class Parser : CommandArgsParser { + override fun parse(args: List): Args { + if (args.isEmpty()) { + throw BadCommandUsageException() + } + if (args.size > 1) { + throw BadCommandUsageException() + } + return Args(email = args[0]) + } + } + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/sync/actions/GenerateAccountVerificationURL.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/sync/actions/GenerateAccountVerificationURL.kt deleted file mode 100644 index 77b02379e..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/sync/actions/GenerateAccountVerificationURL.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.projectcitybuild.pcbridge.features.sync.actions - -import com.projectcitybuild.pcbridge.features.sync.repositories.SyncRepository -import com.projectcitybuild.pcbridge.http.services.pcb.AccountLinkHTTPService -import com.projectcitybuild.pcbridge.utils.Failure -import com.projectcitybuild.pcbridge.utils.Result -import com.projectcitybuild.pcbridge.utils.Success -import java.util.UUID - -class GenerateAccountVerificationURL( - private val syncRepository: SyncRepository, -) { - data class VerificationURL(val urlString: String) - - enum class FailureReason { - ALREADY_LINKED, - EMPTY_RESPONSE, - } - - suspend fun generate(playerUUID: UUID): Result { - return try { - val url = syncRepository.generateVerificationURL(playerUUID) - - return if (url.isNullOrEmpty()) { - Failure(FailureReason.EMPTY_RESPONSE) - } else { - Success(VerificationURL(url)) - } - } catch (e: AccountLinkHTTPService.AlreadyLinkedException) { - Failure(FailureReason.ALREADY_LINKED) - } - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/sync/actions/UpdatePlayerGroups.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/sync/actions/UpdatePlayerGroups.kt deleted file mode 100644 index def0e2bb9..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/sync/actions/UpdatePlayerGroups.kt +++ /dev/null @@ -1,36 +0,0 @@ -package com.projectcitybuild.pcbridge.features.sync.actions - -import com.projectcitybuild.pcbridge.core.permissions.Permissions -import com.projectcitybuild.pcbridge.features.sync.repositories.SyncRepository -import com.projectcitybuild.pcbridge.http.services.pcb.PlayerGroupHttpService -import com.projectcitybuild.pcbridge.utils.Failure -import com.projectcitybuild.pcbridge.utils.Result -import com.projectcitybuild.pcbridge.utils.Success -import java.util.UUID - -class UpdatePlayerGroups( - private val permissions: Permissions, - private val syncRepository: SyncRepository, -) { - enum class FailureReason { - ACCOUNT_NOT_LINKED, - } - - suspend fun execute(playerUUID: UUID): Result { - val groupSet = mutableSetOf() - - try { - groupSet.addAll(syncRepository.getGroups(playerUUID = playerUUID)) - - val donorPerks = syncRepository.getDonorPerks(playerUUID) - val donorTierGroups = syncRepository.getDonorTiers(donorPerks) - groupSet.addAll(donorTierGroups) - } catch (e: PlayerGroupHttpService.NoLinkedAccountException) { - return Failure(FailureReason.ACCOUNT_NOT_LINKED) - } - - permissions.setUserGroups(playerUUID, groupSet.toList()) - - return Success(Unit) - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/sync/commands/SyncCommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/sync/commands/SyncCommand.kt deleted file mode 100644 index b574ce1af..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/sync/commands/SyncCommand.kt +++ /dev/null @@ -1,111 +0,0 @@ -package com.projectcitybuild.pcbridge.features.sync.commands - -import com.projectcitybuild.pcbridge.features.sync.actions.GenerateAccountVerificationURL -import com.projectcitybuild.pcbridge.features.sync.actions.UpdatePlayerGroups -import com.projectcitybuild.pcbridge.support.messages.CommandHelpBuilder -import com.projectcitybuild.pcbridge.support.spigot.BadCommandUsageException -import com.projectcitybuild.pcbridge.support.spigot.CommandArgsParser -import com.projectcitybuild.pcbridge.support.spigot.SpigotCommand -import com.projectcitybuild.pcbridge.utils.Failure -import com.projectcitybuild.pcbridge.utils.Success -import net.kyori.adventure.text.Component -import net.kyori.adventure.text.event.ClickEvent -import net.kyori.adventure.text.event.HoverEvent -import net.kyori.adventure.text.format.NamedTextColor -import net.kyori.adventure.text.format.TextDecoration -import org.bukkit.command.CommandSender -import org.bukkit.entity.Player - -class SyncCommand( - private val generateAccountVerificationURL: GenerateAccountVerificationURL, - private val updatePlayerGroups: UpdatePlayerGroups, -) : SpigotCommand { - override val label = "sync" - - override val usage = CommandHelpBuilder() - - override suspend fun run( - sender: CommandSender, - args: Args, - ) { - check(sender is Player) { - "Only players can use this command" - } - when (args.finishSyncing) { - false -> generateVerificationURL(sender) - true -> syncGroups(sender) - } - } - - private suspend fun generateVerificationURL(player: Player) { - val result = generateAccountVerificationURL.generate(player.uniqueId) - - when (result) { - is Failure -> - when (result.reason) { - GenerateAccountVerificationURL.FailureReason.ALREADY_LINKED, - -> syncGroups(player) - - GenerateAccountVerificationURL.FailureReason.EMPTY_RESPONSE, - -> - player.sendMessage( - Component.text("Failed to generate verification URL: No URL received from server") - .color(NamedTextColor.RED), - ) - } - is Success -> - player.sendMessage( - Component.text() - .append( - Component.text("To link your account, please "), - ) - .append( - Component.text("click here") - .decorate(TextDecoration.UNDERLINED) - .decorate(TextDecoration.BOLD) - .clickEvent(ClickEvent.openUrl(result.value.urlString)) - .hoverEvent(HoverEvent.showText(Component.text(result.value.urlString))), - ) - .append( - Component.text(" and login if required"), - ), - ) - } - } - - private suspend fun syncGroups(player: Player) { - val result = updatePlayerGroups.execute(player.uniqueId) - - val message = - when (result) { - is Failure -> - when (result.reason) { - UpdatePlayerGroups.FailureReason.ACCOUNT_NOT_LINKED, - -> - Component.text("Sync failed. Did you finish registering your account?") - .color(NamedTextColor.RED) - } - is Success -> { - Component.text("Account linked! Your rank will be automatically synchronized with the PCB network") - .color(NamedTextColor.GREEN) - } - } - player.sendMessage(message) - } - - data class Args( - val finishSyncing: Boolean, - ) { - class Parser : CommandArgsParser { - override fun parse(args: List): Args { - if (args.isEmpty()) { - return Args(finishSyncing = false) - } - if (args[0] != "finish") { - throw BadCommandUsageException() - } - return Args(finishSyncing = true) - } - } - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/sync/commands/SyncOtherCommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/sync/commands/SyncOtherCommand.kt deleted file mode 100644 index d6e561b8e..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/sync/commands/SyncOtherCommand.kt +++ /dev/null @@ -1,70 +0,0 @@ -package com.projectcitybuild.pcbridge.features.sync.commands - -import com.projectcitybuild.pcbridge.features.sync.actions.UpdatePlayerGroups -import com.projectcitybuild.pcbridge.support.messages.CommandHelpBuilder -import com.projectcitybuild.pcbridge.support.spigot.BadCommandUsageException -import com.projectcitybuild.pcbridge.support.spigot.CommandArgsParser -import com.projectcitybuild.pcbridge.support.spigot.SpigotCommand -import com.projectcitybuild.pcbridge.utils.Failure -import com.projectcitybuild.pcbridge.utils.Success -import net.kyori.adventure.text.Component -import net.kyori.adventure.text.format.NamedTextColor -import net.kyori.adventure.text.format.TextDecoration -import org.bukkit.Server -import org.bukkit.command.CommandSender - -class SyncOtherCommand( - private val server: Server, - private val updatePlayerGroups: UpdatePlayerGroups, -) : SpigotCommand { - override val label = "syncother" - - override val usage = CommandHelpBuilder() - - override suspend fun run( - sender: CommandSender, - args: Args, - ) { - val targetPlayer = server.getPlayer(args.targetPlayerName) - checkNotNull(targetPlayer) { - "Player ${args.targetPlayerName} not found" - } - val result = updatePlayerGroups.execute(targetPlayer.uniqueId) - when (result) { - is Failure -> - when (result.reason) { - UpdatePlayerGroups.FailureReason.ACCOUNT_NOT_LINKED, - -> - sender.sendMessage( - Component.text("Error: Player does not have a linked PCB account") - .color(NamedTextColor.RED), - ) - } - is Success -> { - sender.sendMessage( - Component.text("${targetPlayer.name} has been synchronized") - .color(NamedTextColor.GRAY) - .decorate(TextDecoration.ITALIC), - ) - targetPlayer.sendMessage( - Component.text("Your rank has been synchronized") - .color(NamedTextColor.GRAY) - .decorate(TextDecoration.ITALIC), - ) - } - } - } - - data class Args( - val targetPlayerName: String, - ) { - class Parser : CommandArgsParser { - override fun parse(args: List): Args { - if (args.isEmpty() || args.size > 1) { - throw BadCommandUsageException() - } - return Args(targetPlayerName = args[0]) - } - } - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/sync/listener/SyncRankOnJoinListener.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/sync/listener/SyncRankOnJoinListener.kt deleted file mode 100644 index b15db567d..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/sync/listener/SyncRankOnJoinListener.kt +++ /dev/null @@ -1,19 +0,0 @@ -package com.projectcitybuild.pcbridge.features.sync.listener - -import com.projectcitybuild.pcbridge.features.bans.events.ConnectionPermittedEvent -import com.projectcitybuild.pcbridge.features.sync.actions.SyncPlayerGroups -import org.bukkit.event.EventHandler -import org.bukkit.event.Listener - -class SyncRankOnJoinListener( - private val syncPlayerGroups: SyncPlayerGroups, -) : Listener { - @EventHandler - fun onConnectionPermitted(event: ConnectionPermittedEvent) { - syncPlayerGroups.execute( - playerUUID = event.playerUUID, - groups = event.aggregate.account?.groups ?: emptyList(), - donationPerks = event.aggregate.donationPerks, - ) - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/sync/repositories/SyncRepository.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/sync/repositories/SyncRepository.kt deleted file mode 100644 index 15110f2bd..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/sync/repositories/SyncRepository.kt +++ /dev/null @@ -1,47 +0,0 @@ -package com.projectcitybuild.pcbridge.features.sync.repositories - -import com.projectcitybuild.pcbridge.core.config.Config -import com.projectcitybuild.pcbridge.core.logger.log -import com.projectcitybuild.pcbridge.http.responses.DonationPerk -import com.projectcitybuild.pcbridge.http.services.pcb.AccountLinkHTTPService -import com.projectcitybuild.pcbridge.http.services.pcb.PlayerGroupHttpService -import java.util.UUID - -class SyncRepository( - private val playerGroupHttpService: PlayerGroupHttpService, - private val accountLinkHttpService: AccountLinkHTTPService, - private val config: Config, -) { - @Throws(PlayerGroupHttpService.NoLinkedAccountException::class) - suspend fun getGroups(playerUUID: UUID): List { - return playerGroupHttpService.getGroups(playerUUID) - .mapNotNull { it.minecraftName } - } - - @Throws(PlayerGroupHttpService.NoLinkedAccountException::class) - suspend fun getDonorPerks(playerUUID: UUID): List { - return playerGroupHttpService.getDonorPerks(playerUUID) - } - - fun getDonorTiers(perks: List): List { - return perks.mapNotNull { donorPerk -> - val tierName = donorPerk.donationTier.name - - val groupNames = config.get().groups.donorTierGroupNames - when (tierName) { - "copper" -> groupNames.copper - "iron" -> groupNames.iron - "diamond" -> groupNames.diamond - else -> { - log.error { "Missing config node for donor tier: $tierName" } - null - } - } - } - } - - @Throws(AccountLinkHTTPService.AlreadyLinkedException::class) - suspend fun generateVerificationURL(playerUUID: UUID): String? { - return accountLinkHttpService.generateVerificationURL(playerUUID) - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/utilities/commands/PCBridgeCommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/utilities/commands/PCBridgeCommand.kt deleted file mode 100644 index 4fb5a8253..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/utilities/commands/PCBridgeCommand.kt +++ /dev/null @@ -1,92 +0,0 @@ -package com.projectcitybuild.pcbridge.features.utilities.commands - -import com.github.shynixn.mccoroutine.bukkit.SuspendingTabCompleter -import com.projectcitybuild.pcbridge.support.messages.CommandHelpBuilder -import com.projectcitybuild.pcbridge.support.spigot.BadCommandUsageException -import com.projectcitybuild.pcbridge.support.spigot.CommandArgsParser -import com.projectcitybuild.pcbridge.support.spigot.SpigotCommand -import com.projectcitybuild.pcbridge.support.tryValueOf -import net.kyori.adventure.text.Component -import net.kyori.adventure.text.format.TextColor -import org.bukkit.command.Command -import org.bukkit.command.CommandSender -import org.bukkit.plugin.java.JavaPlugin - -class PCBridgeCommand( - private val plugin: JavaPlugin, -) : SpigotCommand { - override val label = "pcbridge" - - override val usage = CommandHelpBuilder() // TODO - - override suspend fun run( - sender: CommandSender, - args: Args, - ) { - when (args.command) { - Args.Command.Reload -> reload(sender) - } - } - - private fun reload(sender: CommandSender) { - plugin.onDisable() - plugin.onEnable() - - val message = - Component.text() - .content("Reload complete") - .color(TextColor.color(0x75e900)) - .build() - - sender.sendMessage(message) - } - - class TabCompleter : SuspendingTabCompleter { - private val subcommands = - listOf( - "reload", - ) - - override suspend fun onTabComplete( - sender: CommandSender, - command: Command, - alias: String, - args: Array, - ): List? { - if (args.isEmpty()) { - return null - } - if (args.size == 1) { - return subcommands - .filter { it.startsWith(args[0]) } - .toMutableList() - } - return null - } - } - - data class Args( - val command: Command, - val remainingArgs: List, - ) { - enum class Command { - Reload, - } - - class Parser : CommandArgsParser { - override fun parse(args: List): Args { - if (args.isEmpty()) { - throw BadCommandUsageException() - } - val command = - tryValueOf(args[0].replaceFirstChar { it.uppercase() }) - ?: throw BadCommandUsageException() - - return Args( - command = command, - remainingArgs = args.drop(1), - ) - } - } - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warnings/actions/GetUnacknowledgedWarnings.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warnings/actions/GetUnacknowledgedWarnings.kt deleted file mode 100644 index 4f62c5f39..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warnings/actions/GetUnacknowledgedWarnings.kt +++ /dev/null @@ -1,37 +0,0 @@ -package com.projectcitybuild.pcbridge.features.warnings.actions - -import com.projectcitybuild.pcbridge.core.datetime.DateTimeFormatter -import com.projectcitybuild.pcbridge.features.warnings.repositories.PlayerWarningRepository -import java.util.UUID - -class GetUnacknowledgedWarnings( - private val warningRepository: PlayerWarningRepository, - private val dateTimeFormatter: DateTimeFormatter, -) { - data class FormattedWarning( - val id: Int, - val reason: String, - val isAcknowledged: Boolean, - val createdAt: String, - ) - - suspend fun execute( - playerUUID: UUID, - playerName: String, - ): List { - return warningRepository - .get(playerUUID, playerName) - .filter { !it.isAcknowledged } - .map { - FormattedWarning( - id = it.id, - reason = it.reason, - isAcknowledged = it.isAcknowledged, - createdAt = - it.createdAt.let { createdAt -> - dateTimeFormatter.convert(createdAt) - }, - ) - } - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warnings/commands/WarningAcknowledgeCommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warnings/commands/WarningAcknowledgeCommand.kt deleted file mode 100644 index 3167148d2..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warnings/commands/WarningAcknowledgeCommand.kt +++ /dev/null @@ -1,37 +0,0 @@ -package com.projectcitybuild.pcbridge.features.warnings.commands - -import com.projectcitybuild.pcbridge.features.warnings.repositories.PlayerWarningRepository -import com.projectcitybuild.pcbridge.support.messages.CommandHelpBuilder -import com.projectcitybuild.pcbridge.support.spigot.BadCommandUsageException -import com.projectcitybuild.pcbridge.support.spigot.CommandArgsParser -import com.projectcitybuild.pcbridge.support.spigot.SpigotCommand -import org.bukkit.command.CommandSender - -class WarningAcknowledgeCommand( - private val warningRepository: PlayerWarningRepository, -) : SpigotCommand { - override val label = "warning" - - override val usage = CommandHelpBuilder() - - override suspend fun run( - sender: CommandSender, - args: Args, - ) { - warningRepository.acknowledge(args.id) - sender.sendMessage("Warning acknowledged and hidden") - } - - data class Args( - val id: Int, - ) { - class Parser : CommandArgsParser { - override fun parse(args: List): Args { - if (args.isEmpty()) { - throw BadCommandUsageException() - } - return Args(id = args[0].toInt()) - } - } - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warnings/listeners/NotifyWarningsOnJoinListener.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warnings/listeners/NotifyWarningsOnJoinListener.kt deleted file mode 100644 index e7d958991..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warnings/listeners/NotifyWarningsOnJoinListener.kt +++ /dev/null @@ -1,62 +0,0 @@ -package com.projectcitybuild.pcbridge.features.warnings.listeners - -import com.projectcitybuild.pcbridge.features.warnings.actions.GetUnacknowledgedWarnings -import net.kyori.adventure.text.Component -import net.kyori.adventure.text.event.ClickEvent -import net.kyori.adventure.text.format.NamedTextColor -import net.kyori.adventure.text.format.TextDecoration -import org.bukkit.event.EventHandler -import org.bukkit.event.Listener -import org.bukkit.event.player.PlayerJoinEvent - -class NotifyWarningsOnJoinListener( - private val getUnacknowledgedWarnings: GetUnacknowledgedWarnings, -) : Listener { - @EventHandler - suspend fun onPlayerJoin(event: PlayerJoinEvent) { - val player = event.player - val warnings = - getUnacknowledgedWarnings.execute( - playerUUID = player.uniqueId, - playerName = player.name, - ) - if (warnings.isEmpty()) { - return - } - - val message = - Component.text() - .append( - Component.text("You have ").color(NamedTextColor.RED), - Component.text(warnings.size).decorate(TextDecoration.BOLD), - Component.text(" unacknowledged warnings").color(NamedTextColor.RED), - Component.newline(), - Component.text("---").color(NamedTextColor.GRAY), - Component.newline(), - ) - - warnings.forEach { warning -> - message.append( - Component.text(warning.reason), - Component.newline(), - Component.text("Date: ").color(NamedTextColor.GRAY), - Component.text(warning.createdAt), - Component.newline(), - Component.newline(), - Component.text("[I ACKNOWLEDGE]") - .color(NamedTextColor.GOLD) - .decorate(TextDecoration.BOLD, TextDecoration.UNDERLINED) - .clickEvent(ClickEvent.runCommand("/warning acknowledge ${warning.id}")), - Component.newline(), - Component.text("---").color(NamedTextColor.GRAY), - Component.newline(), - ) - } - message.append( - Component.text("Click the 'acknowledge' button to mark it as read and hide it") - .color(NamedTextColor.GRAY) - .decorate(TextDecoration.ITALIC), - ) - player.sendMessage(message) - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warnings/repositories/PlayerWarningRepository.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warnings/repositories/PlayerWarningRepository.kt deleted file mode 100644 index 8f5b0fef8..000000000 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warnings/repositories/PlayerWarningRepository.kt +++ /dev/null @@ -1,23 +0,0 @@ -package com.projectcitybuild.pcbridge.features.warnings.repositories - -import com.projectcitybuild.pcbridge.http.responses.PlayerWarning -import com.projectcitybuild.pcbridge.http.services.pcb.PlayerWarningHttpService -import java.util.UUID - -class PlayerWarningRepository( - private val playerWarningHttpService: PlayerWarningHttpService, -) { - suspend fun get( - playerUUID: UUID, - playerName: String, - ): List { - return playerWarningHttpService.get( - playerUUID = playerUUID, - playerName = playerName, - ) - } - - suspend fun acknowledge(warningId: Int): PlayerWarning? { - return playerWarningHttpService.acknowledge(warningId) - } -} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/support/spigot/SpigotEventBroadcaster.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/support/spigot/SpigotEventBroadcaster.kt new file mode 100644 index 000000000..7f5c52e35 --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/support/spigot/SpigotEventBroadcaster.kt @@ -0,0 +1,17 @@ +package com.projectcitybuild.pcbridge.support.spigot + +import kotlinx.coroutines.withContext +import org.bukkit.Server +import org.bukkit.event.Event +import kotlin.coroutines.CoroutineContext + +class SpigotEventBroadcaster( + private val server: Server, + private val minecraftDispatcher: () -> CoroutineContext, +) { + suspend fun broadcast(event: Event) { + withContext(minecraftDispatcher()) { + server.pluginManager.callEvent(event) + } + } +} \ No newline at end of file diff --git a/pcbridge-spigot/src/main/resources/plugin.yml b/pcbridge-spigot/src/main/resources/plugin.yml index a925142ed..dd5636cdf 100644 --- a/pcbridge-spigot/src/main/resources/plugin.yml +++ b/pcbridge-spigot/src/main/resources/plugin.yml @@ -2,7 +2,7 @@ name: PCBridge main: com.projectcitybuild.pcbridge.Plugin website: https://github.com/projectcitybuild/PCBridge author: Andy -version: 6.0.0 +version: 6.1.0 api-version: 1.20 softdepend: @@ -17,29 +17,17 @@ commands: permission: pcbridge.ban.ban banip: permission: pcbridge.ban.banip - checkban: - permission: pcbridge.ban.check - mute: - permission: pcbridge.chat.mute - pcbridge: - permission: pcbridge.utils + code: + permission: pcbridge.register.code invisframe: permission: pcbridge.build.invisframe nv: permission: pcbridge.build.nightvision + register: + permission: pcbridge.register.email sync: permission: pcbridge.sync.login - syncother: - permission: pcbridge.sync.other - unban: - permission: pcbridge.ban.ban - unbanip: - permission: pcbridge.ban.banip - unmute: - permission: pcbridge.chat.mute warp: permission: pcbridge.warps.teleport warps: - permission: pcbridge.warps.list - warning: - permission: pcbridge.warning.acknowledge \ No newline at end of file + permission: pcbridge.warps.list \ No newline at end of file diff --git a/pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/bans/actions/AuthoriseConnectionTest.kt b/pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/bans/actions/AuthoriseConnectionTest.kt deleted file mode 100644 index 3530c0746..000000000 --- a/pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/bans/actions/AuthoriseConnectionTest.kt +++ /dev/null @@ -1,99 +0,0 @@ -package com.projectcitybuild.pcbridge.features.bans.actions - -import com.projectcitybuild.pcbridge.http.responses.Aggregate -import com.projectcitybuild.pcbridge.http.responses.IPBan -import com.projectcitybuild.pcbridge.http.responses.PlayerBan -import kotlinx.coroutines.test.runTest -import org.junit.jupiter.api.Assertions.assertEquals -import org.junit.jupiter.api.BeforeEach -import org.junit.jupiter.api.Test -import java.time.LocalDate -import java.time.ZoneId - -class AuthoriseConnectionTest { - private lateinit var useCase: AuthoriseConnection - - @BeforeEach - fun setUp() { - useCase = AuthoriseConnection() - } - - @Test - fun `should deny if player is banned`() = - runTest { - val ban = PlayerBan() - val result = - useCase.execute( - Aggregate(playerBan = ban), - ) - assertEquals( - AuthoriseConnection.ConnectResult.Denied( - AuthoriseConnection.Ban.UUID(ban), - ), - result, - ) - } - - @Test - fun `should not deny if player ban is inactive`() = - runTest { - val ban = - PlayerBan( - unbannedAt = LocalDate.now().atStartOfDay(ZoneId.systemDefault()).toEpochSecond(), - ) - val result = - useCase.execute( - Aggregate(playerBan = ban), - ) - assertEquals( - AuthoriseConnection.ConnectResult.Allowed, - result, - ) - } - - @Test - fun `should deny if IP is banned`() = - runTest { - val ban = IPBan() - val result = - useCase.execute( - Aggregate(ipBan = ban), - ) - assertEquals( - AuthoriseConnection.ConnectResult.Denied( - AuthoriseConnection.Ban.IP(ban), - ), - result, - ) - } - - @Test - fun `should not deny if IP ban is inactive`() = - runTest { - val ban = - IPBan( - unbannedAt = LocalDate.now().atStartOfDay(ZoneId.systemDefault()).toEpochSecond(), - ) - val result = - useCase.execute( - Aggregate(ipBan = ban), - ) - assertEquals( - AuthoriseConnection.ConnectResult.Allowed, - result, - ) - } - - @Test - fun `should allow if not banned`() = - runTest { - val result = - useCase.execute( - Aggregate(playerBan = null, ipBan = null), - ) - assertEquals( - AuthoriseConnection.ConnectResult.Allowed, - result, - ) - } -} diff --git a/pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/bans/actions/AuthorizeConnectionTest.kt b/pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/bans/actions/AuthorizeConnectionTest.kt new file mode 100644 index 000000000..8d752518a --- /dev/null +++ b/pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/bans/actions/AuthorizeConnectionTest.kt @@ -0,0 +1,120 @@ +package com.projectcitybuild.pcbridge.features.bans.actions + +import com.projectcitybuild.pcbridge.http.responses.PlayerData +import com.projectcitybuild.pcbridge.http.responses.IPBan +import com.projectcitybuild.pcbridge.http.responses.PlayerBan +import kotlinx.coroutines.test.runTest +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import java.time.LocalDate +import java.time.LocalDateTime +import java.time.ZoneId +import kotlin.random.Random + +class AuthorizeConnectionTest { + private lateinit var useCase: AuthorizeConnection + + private fun playerBan() = PlayerBan( + id = Random.nextInt(), + bannerPlayerId = Random.nextInt(), + bannedPlayerId = Random.nextInt(), + bannedPlayerAlias = "alias", + createdAt = LocalDateTime.now(), + updatedAt = LocalDateTime.now(), + ) + + private fun ipBan() = IPBan( + id = Random.nextInt(), + bannerPlayerId = Random.nextInt(), + createdAt = LocalDateTime.now(), + updatedAt = LocalDateTime.now(), + ) + + @BeforeEach + fun setUp() { + useCase = AuthorizeConnection() + } + + @Test + fun `should deny if player is banned`() = + runTest { + val ban = playerBan() + val result = + useCase.authorize( + PlayerData(playerBan = ban), + ) + assertEquals( + AuthorizeConnection.ConnectResult.Denied( + AuthorizeConnection.Ban.UUID(ban), + ), + result, + ) + } + + @Test + fun `should not deny if player ban is inactive`() = + runTest { + val ban = + playerBan().copy( + unbannedAt = LocalDate + .now() + .atStartOfDay(ZoneId.systemDefault()) + .toLocalDateTime(), + ) + val result = + useCase.authorize( + PlayerData(playerBan = ban), + ) + assertEquals( + AuthorizeConnection.ConnectResult.Allowed, + result, + ) + } + + @Test + fun `should deny if IP is banned`() = + runTest { + val ban = ipBan() + val result = + useCase.authorize( + PlayerData(ipBan = ban), + ) + assertEquals( + AuthorizeConnection.ConnectResult.Denied( + AuthorizeConnection.Ban.IP(ban), + ), + result, + ) + } + + @Test + fun `should not deny if IP ban is inactive`() = + runTest { + val ban = + ipBan().copy( + unbannedAt = LocalDate.now().atStartOfDay(ZoneId.systemDefault()).toLocalDateTime(), + ) + val result = + useCase.authorize( + PlayerData(ipBan = ban), + ) + assertEquals( + AuthorizeConnection.ConnectResult.Allowed, + result, + ) + } + + @Test + fun `should allow if not banned`() = + runTest { + val result = + useCase.authorize( + PlayerData(playerBan = null, ipBan = null), + ) + assertEquals( + AuthorizeConnection.ConnectResult.Allowed, + result, + ) + } +} diff --git a/pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/bans/actions/BanIPTest.kt b/pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/bans/actions/BanIPTest.kt deleted file mode 100644 index 9e8b80dd4..000000000 --- a/pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/bans/actions/BanIPTest.kt +++ /dev/null @@ -1,131 +0,0 @@ -package com.projectcitybuild.pcbridge.features.bans.actions - -import com.projectcitybuild.pcbridge.features.bans.repositories.IPBanRepository -import com.projectcitybuild.pcbridge.http.services.pcb.IPBanHttpService -import com.projectcitybuild.pcbridge.utils.Failure -import com.projectcitybuild.pcbridge.utils.Success -import kotlinx.coroutines.test.runTest -import org.bukkit.Server -import org.bukkit.entity.Player -import org.bukkit.event.player.PlayerKickEvent -import org.junit.jupiter.api.Assertions.assertEquals -import org.junit.jupiter.api.BeforeEach -import org.junit.jupiter.api.Test -import org.mockito.Mockito.mock -import org.mockito.Mockito.verify -import org.mockito.kotlin.any -import org.mockito.kotlin.eq -import org.mockito.kotlin.verifyNoInteractions -import org.mockito.kotlin.whenever -import java.net.InetSocketAddress -import java.util.UUID - -class BanIPTest { - private lateinit var useCase: BanIP - private lateinit var ipBanRepository: IPBanRepository - private lateinit var server: Server - - @BeforeEach - fun setUp() { - ipBanRepository = mock(IPBanRepository::class.java) - server = mock(Server::class.java) - - useCase = - BanIP( - ipBanRepository, - server, - ) - } - - @Test - fun `should fail if IP is already banned`() = - runTest { - val ip = "127.0.0.1" - - whenever(ipBanRepository.ban(eq(ip), any(), any(), any())) - .thenThrow(IPBanHttpService.IPAlreadyBannedException::class.java) - - val result = - useCase.execute( - ip = ip, - bannerUUID = UUID.randomUUID(), - bannerName = "name", - reason = "reason", - ) - - assertEquals(Failure(BanIP.FailureReason.IP_ALREADY_BANNED), result) - } - - @Test - fun `should fail if IP is invalid`() = - runTest { - arrayOf( - "text", - "1234", - ).forEach { invalidIP -> - val result = - useCase.execute( - ip = invalidIP, - bannerUUID = UUID.randomUUID(), - bannerName = "name", - reason = "reason", - ) - assertEquals(Failure(BanIP.FailureReason.INVALID_IP), result) - } - } - - @Test - fun `should ban valid IP`() = - runTest { - arrayOf( - "127.0.0.1", - "/127.0.0.1:1234", - ).forEach { ip -> - val uuid = UUID.randomUUID() - val result = - useCase.execute( - ip = ip, - bannerUUID = uuid, - bannerName = "name", - reason = "reason", - ) - verify(ipBanRepository).ban( - ip = "127.0.0.1", - bannerUUID = uuid, - bannerName = "name", - reason = "reason", - ) - assertEquals(Success(Unit), result) - } - } - - @Test - fun `should kick player if online`() = - runTest { - val otherPlayer = mockPlayer(ip = "127.0.0.2") - val targetPlayer = mockPlayer(ip = "127.0.0.1") - whenever(server.onlinePlayers).thenReturn( - listOf(targetPlayer, otherPlayer), - ) - - useCase.execute( - ip = "127.0.0.1", - bannerUUID = UUID.randomUUID(), - bannerName = "name", - reason = "reason", - ) - - verify(targetPlayer).kick(any(), eq(PlayerKickEvent.Cause.BANNED)) - verifyNoInteractions(otherPlayer) - } -} - -private fun mockPlayer(ip: String): Player { - val address = mock(InetSocketAddress::class.java) - val player = mock(Player::class.java) - - whenever(address.toString()).thenReturn(ip) - whenever(player.address).thenReturn(address) - - return player -} diff --git a/pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/bans/actions/BanUUIDTest.kt b/pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/bans/actions/BanUUIDTest.kt deleted file mode 100644 index 6fce3d214..000000000 --- a/pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/bans/actions/BanUUIDTest.kt +++ /dev/null @@ -1,84 +0,0 @@ -package com.projectcitybuild.pcbridge.features.bans.actions - -import com.projectcitybuild.pcbridge.features.bans.repositories.PlayerBanRepository -import com.projectcitybuild.pcbridge.features.bans.repositories.PlayerUUIDRepository -import com.projectcitybuild.pcbridge.http.services.pcb.UUIDBanHttpService -import com.projectcitybuild.pcbridge.utils.Failure -import kotlinx.coroutines.test.runTest -import org.bukkit.Server -import org.junit.jupiter.api.Assertions.assertEquals -import org.junit.jupiter.api.BeforeEach -import org.junit.jupiter.api.Test -import org.mockito.Mockito.mock -import org.mockito.Mockito.times -import org.mockito.Mockito.verify -import org.mockito.kotlin.whenever -import java.util.UUID - -class BanUUIDTest { - private lateinit var useCase: BanUUID - - private lateinit var playerBanRepository: PlayerBanRepository - private lateinit var playerUUIDRepository: PlayerUUIDRepository - private lateinit var server: Server - - @BeforeEach - fun setUp() { - playerBanRepository = mock(PlayerBanRepository::class.java) - playerUUIDRepository = mock(PlayerUUIDRepository::class.java) - server = mock(Server::class.java) - - useCase = - BanUUID( - playerBanRepository, - playerUUIDRepository, - server, - ) - } - - @Test - fun `ban should fail when player doesn't exist`() = - runTest { - val playerName = "banned_player" - - whenever(playerUUIDRepository.get(playerName)).thenReturn(null) - - val result = useCase.ban(playerName, null, "staff_player", null) - - assertEquals(result, Failure(BanUUID.FailureReason.PlayerDoesNotExist)) - } - - @Test - fun `ban should fail when player is already banned`() = - runTest { - val playerName = "banned_player" - val playerUUID = UUID.randomUUID() - val staffName = "staff_player" - val staffUUID = UUID.randomUUID() - - whenever(playerUUIDRepository.get(playerName)).thenReturn(playerUUID) - whenever(playerBanRepository.ban(playerUUID, playerName, staffUUID, staffName, null)) - .thenThrow(UUIDBanHttpService.UUIDAlreadyBannedException()) - - val result = useCase.ban(playerName, staffUUID, staffName, null) - - assertEquals(result, Failure(BanUUID.FailureReason.PlayerAlreadyBanned)) - } - - @Test - fun `ban should pass input to ban repository`() = - runTest { - val playerName = "banned_player" - val playerUUID = UUID.randomUUID() - val staffUUID = UUID.randomUUID() - val staffName = "staff_player" - val reason = "reason" - - whenever(playerUUIDRepository.get(playerName)).thenReturn(playerUUID) - - useCase.ban(playerName, staffUUID, "staff_player", reason) - - verify(playerBanRepository, times(1)) - .ban(playerUUID, playerName, staffUUID, staffName, reason) - } -} diff --git a/pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/bans/actions/CheckBanUUIDTest.kt b/pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/bans/actions/CheckBanUUIDTest.kt deleted file mode 100644 index ead01cb36..000000000 --- a/pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/bans/actions/CheckBanUUIDTest.kt +++ /dev/null @@ -1,128 +0,0 @@ -package com.projectcitybuild.pcbridge.features.bans.actions - -import com.projectcitybuild.pcbridge.core.datetime.DateTimeFormatter -import com.projectcitybuild.pcbridge.features.bans.repositories.PlayerBanRepository -import com.projectcitybuild.pcbridge.features.bans.repositories.PlayerUUIDRepository -import com.projectcitybuild.pcbridge.http.responses.PlayerBan -import com.projectcitybuild.pcbridge.utils.Failure -import com.projectcitybuild.pcbridge.utils.Success -import kotlinx.coroutines.test.runTest -import org.junit.jupiter.api.Assertions.assertEquals -import org.junit.jupiter.api.BeforeEach -import org.junit.jupiter.api.Test -import org.mockito.Mockito.mock -import org.mockito.kotlin.whenever -import java.time.ZoneId -import java.util.Locale -import java.util.UUID - -class CheckBanUUIDTest { - private lateinit var useCase: CheckUUIDBan - - private lateinit var playerBanRepository: PlayerBanRepository - private lateinit var playerUUIDRepository: PlayerUUIDRepository - private lateinit var dateTimeFormatter: DateTimeFormatter - - @BeforeEach - fun setUp() { - playerBanRepository = mock(PlayerBanRepository::class.java) - playerUUIDRepository = mock(PlayerUUIDRepository::class.java) - - dateTimeFormatter = - DateTimeFormatter( - Locale.forLanguageTag("en-us"), - ZoneId.of("UTC"), - ) - - useCase = - CheckUUIDBan( - playerBanRepository, - playerUUIDRepository, - dateTimeFormatter, - ) - } - - @Test - fun `getBan should fail when player doesn't exist`() = - runTest { - val playerName = "banned_player" - - whenever(playerUUIDRepository.get(playerName)).thenReturn(null) - - val result = useCase.getBan(playerName) - - assertEquals(result, Failure(CheckUUIDBan.FailureReason.PLAYER_DOES_NOT_EXIST)) - } - - @Test - fun `getBan should return a ban record with no expiry date`() = - runTest { - val playerName = "banned_player" - val playerUUID = UUID.randomUUID() - val staffUUID = UUID.randomUUID() - - whenever(playerUUIDRepository.get(playerName)).thenReturn(playerUUID) - whenever(playerBanRepository.get(playerUUID)).thenReturn( - PlayerBan( - id = 1, - serverId = 2, - bannedPlayerId = playerUUID.toString(), - bannedPlayerAlias = playerName, - bannerPlayerId = staffUUID.toString(), - reason = "griefing", - expiresAt = null, - createdAt = 1642953972, - updatedAt = 1642953972, - unbannedAt = null, - unbannerPlayerId = null, - unbanType = null, - ), - ) - - val result = useCase.getBan(playerName) - val expected = - CheckUUIDBan.BanRecord( - reason = "griefing", - dateOfBan = "Jan 23, 2022, 4:06:12 PM", - expiryDate = "Never", - ) - - assertEquals(Success(expected), result) - } - - @Test - fun `getBan should return a ban record with an expiry date`() = - runTest { - val playerName = "banned_player" - val playerUUID = UUID.randomUUID() - val staffUUID = UUID.randomUUID() - - whenever(playerUUIDRepository.get(playerName)).thenReturn(playerUUID) - whenever(playerBanRepository.get(playerUUID)).thenReturn( - PlayerBan( - id = 1, - serverId = 2, - bannedPlayerId = playerUUID.toString(), - bannedPlayerAlias = playerName, - bannerPlayerId = staffUUID.toString(), - reason = "griefing", - expiresAt = 1643108765, - createdAt = 1642953972, - updatedAt = 1642953972, - unbannedAt = null, - unbannerPlayerId = null, - unbanType = null, - ), - ) - - val result = useCase.getBan(playerName) - val expected = - CheckUUIDBan.BanRecord( - reason = "griefing", - dateOfBan = "Jan 23, 2022, 4:06:12 PM", - expiryDate = "Jan 25, 2022, 11:06:05 AM", - ) - - assertEquals(Success(expected), result) - } -} diff --git a/pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/bans/actions/UnbanIPTest.kt b/pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/bans/actions/UnbanIPTest.kt deleted file mode 100644 index a749392e3..000000000 --- a/pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/bans/actions/UnbanIPTest.kt +++ /dev/null @@ -1,84 +0,0 @@ -package com.projectcitybuild.pcbridge.features.bans.actions - -import com.projectcitybuild.pcbridge.features.bans.repositories.IPBanRepository -import com.projectcitybuild.pcbridge.http.services.pcb.IPBanHttpService -import com.projectcitybuild.pcbridge.utils.Failure -import com.projectcitybuild.pcbridge.utils.Success -import kotlinx.coroutines.test.runTest -import org.junit.jupiter.api.Assertions.assertEquals -import org.junit.jupiter.api.BeforeEach -import org.junit.jupiter.api.Test -import org.mockito.Mockito.mock -import org.mockito.Mockito.verify -import org.mockito.kotlin.any -import org.mockito.kotlin.eq -import org.mockito.kotlin.whenever -import java.util.UUID - -class UnbanIPTest { - private lateinit var useCase: UnbanIP - private lateinit var ipBanRepository: IPBanRepository - - @BeforeEach - fun setUp() { - ipBanRepository = mock(IPBanRepository::class.java) - useCase = UnbanIP(ipBanRepository) - } - - @Test - fun `should fail if IP is not banned`() = - runTest { - val ip = "127.0.0.1" - - whenever(ipBanRepository.unban(eq(ip), any(), any())) - .thenThrow(IPBanHttpService.IPNotBannedException::class.java) - - val result = - useCase.execute( - ip = ip, - unbannerUUID = UUID.randomUUID(), - unbannerName = "name", - ) - assertEquals(Failure(UnbanIP.FailureReason.IP_NOT_BANNED), result) - } - - @Test - fun `should fail if IP is invalid`() = - runTest { - arrayOf( - "text", - "1234", - ).forEach { invalidIP -> - val result = - useCase.execute( - ip = invalidIP, - unbannerUUID = UUID.randomUUID(), - unbannerName = "name", - ) - assertEquals(Failure(UnbanIP.FailureReason.INVALID_IP), result) - } - } - - @Test - fun `should unban valid IP`() = - runTest { - val uuid = UUID.randomUUID() - arrayOf( - "127.0.0.1", - "/127.0.0.1:1234", - ).forEach { ip -> - val result = - useCase.execute( - ip = ip, - unbannerUUID = uuid, - unbannerName = "name", - ) - verify(ipBanRepository).unban( - ip = "127.0.0.1", - unbannerUUID = uuid, - unbannerName = "name", - ) - assertEquals(Success(Unit), result) - } - } -} diff --git a/pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/bans/actions/UnbanUUIDTest.kt b/pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/bans/actions/UnbanUUIDTest.kt deleted file mode 100644 index 74ecb9724..000000000 --- a/pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/bans/actions/UnbanUUIDTest.kt +++ /dev/null @@ -1,77 +0,0 @@ -package com.projectcitybuild.pcbridge.features.bans.actions - -import com.projectcitybuild.pcbridge.features.bans.repositories.PlayerBanRepository -import com.projectcitybuild.pcbridge.features.bans.repositories.PlayerUUIDRepository -import com.projectcitybuild.pcbridge.http.services.pcb.UUIDBanHttpService -import com.projectcitybuild.pcbridge.utils.Failure -import kotlinx.coroutines.test.runTest -import org.junit.jupiter.api.Assertions.assertEquals -import org.junit.jupiter.api.BeforeEach -import org.junit.jupiter.api.Test -import org.mockito.Mockito.mock -import org.mockito.Mockito.times -import org.mockito.Mockito.verify -import org.mockito.kotlin.whenever -import java.util.UUID - -class UnbanUUIDTest { - private lateinit var useCase: UnbanUUID - - private lateinit var playerBanRepository: PlayerBanRepository - private lateinit var playerUUIDRepository: PlayerUUIDRepository - - @BeforeEach - fun setUp() { - playerBanRepository = mock(PlayerBanRepository::class.java) - playerUUIDRepository = mock(PlayerUUIDRepository::class.java) - - useCase = - UnbanUUID( - playerBanRepository, - playerUUIDRepository, - ) - } - - @Test - fun `unban should fail when player doesn't exist`() = - runTest { - val playerName = "banned_player" - - whenever(playerUUIDRepository.get(playerName)).thenReturn(null) - - val result = useCase.unban(playerName, null) - - assertEquals(result, Failure(UnbanUUID.FailureReason.PlayerDoesNotExist)) - } - - @Test - fun `unban should fail when player is not banned`() = - runTest { - val playerName = "banned_player" - val playerUUID = UUID.randomUUID() - val staffUUID = UUID.randomUUID() - - whenever(playerUUIDRepository.get(playerName)).thenReturn(playerUUID) - whenever(playerBanRepository.unban(playerUUID, staffUUID)) - .thenThrow(UUIDBanHttpService.UUIDNotBannedException()) - - val result = useCase.unban(playerName, staffUUID) - - assertEquals(result, Failure(UnbanUUID.FailureReason.PlayerNotBanned)) - } - - @Test - fun `unban should pass input to ban repository`() = - runTest { - val playerName = "banned_player" - val playerUUID = UUID.randomUUID() - val staffUUID = UUID.randomUUID() - - whenever(playerUUIDRepository.get(playerName)).thenReturn(playerUUID) - - useCase.unban(playerName, staffUUID) - - verify(playerBanRepository, times(1)) - .unban(playerUUID, staffUUID) - } -} diff --git a/pcbridge-web-server/build.gradle.kts b/pcbridge-web-server/build.gradle.kts new file mode 100644 index 000000000..6cdf60863 --- /dev/null +++ b/pcbridge-web-server/build.gradle.kts @@ -0,0 +1,20 @@ +plugins { + application +} + +application { + mainClass.set("com.projectcitybuild.pcbridge.ApplicationKt") +} + +repositories { + mavenCentral() +} + +dependencies { + implementation(project(":pcbridge-http")) + + implementation("io.ktor:ktor-server-core:2.2.4") + implementation("io.ktor:ktor-server-netty:2.2.4") + implementation("io.ktor:ktor-server-call-logging:2.2.4") + implementation("io.ktor:ktor-server-auth:2.2.4") +} \ No newline at end of file diff --git a/pcbridge-web-server/src/main/kotlin/com/projectcitybuild/pcbridge/webserver/HttpServer.kt b/pcbridge-web-server/src/main/kotlin/com/projectcitybuild/pcbridge/webserver/HttpServer.kt new file mode 100644 index 000000000..1b86f67c3 --- /dev/null +++ b/pcbridge-web-server/src/main/kotlin/com/projectcitybuild/pcbridge/webserver/HttpServer.kt @@ -0,0 +1,108 @@ +package com.projectcitybuild.pcbridge.webserver + +import io.ktor.http.HttpStatusCode +import io.ktor.server.application.call +import io.ktor.server.application.install +import io.ktor.server.auth.Authentication +import io.ktor.server.auth.UserIdPrincipal +import io.ktor.server.auth.authenticate +import io.ktor.server.auth.bearer +import io.ktor.server.engine.embeddedServer +import io.ktor.server.netty.Netty +import io.ktor.server.netty.NettyApplicationEngine +import io.ktor.server.plugins.callloging.CallLogging +import io.ktor.server.request.receiveParameters +import io.ktor.server.response.respond +import io.ktor.server.routing.post +import io.ktor.server.routing.routing +import org.slf4j.LoggerFactory +import org.slf4j.event.Level +import java.math.BigInteger +import java.util.UUID + +interface HttpServerDelegate { + suspend fun syncPlayer(uuid: UUID) +} + +class HttpServer( + private val config: HttpServerConfig, + private val delegate: HttpServerDelegate, +) { + private var server: NettyApplicationEngine? = null + + private val log + get() = LoggerFactory.getLogger("PCBridge.WebServer") + + fun start() { + if (config.authToken.isEmpty()) { + log.warn("Internal web server token not set in config. Web server will not be started") + return + } + + log.info("Starting web server on port ${config.port}") + + server?.stop(gracePeriodMillis = 0, timeoutMillis = 0) + server = embeddedServer(Netty, port = config.port) { + install(CallLogging) { + level = Level.INFO + } + install(Authentication) { + bearer("token") { + authenticate { token -> + if (token.token == config.authToken) { + UserIdPrincipal("pcb-web") + } else { + null + } + } + } + } + routing { + authenticate("token") { + post("events/player/sync") { + val body = call.receiveParameters() + + val rawUUID = body["uuid"] + if (rawUUID.isNullOrEmpty()) { + call.application.environment.log.info("Bad Request: No UUID provided") + call.respond(HttpStatusCode.BadRequest, "UUID cannot be empty") + return@post + } + + val uuid = try { + uuidFromAnyString(rawUUID) + } catch (e: Exception) { + call.application.environment.log.info("Bad Request: Invalid UUID") + call.respond(HttpStatusCode.BadRequest, "Invalid UUID") + return@post + } + + call.application.environment.log.info("Syncing player: $uuid") + delegate.syncPlayer(uuid) + call.respond(HttpStatusCode.OK) + } + } + } + }.start(wait = false) + } + + fun stop() { + log.info("Stopping web server") + + server?.stop(gracePeriodMillis = 0, timeoutMillis = 0) + server = null + } +} + +/** + * Same as UUID.fromString(), except that it allows a non-hyphen string + */ +private fun uuidFromAnyString(string: String) = string.run { + if (string.contains("-")) { + UUID.fromString(string) + } else { + val bi1 = BigInteger(substring(0, 16), 16) + val bi2 = BigInteger(substring(16, 32), 16) + UUID(bi1.toLong(), bi2.toLong()) + } +} \ No newline at end of file diff --git a/pcbridge-web-server/src/main/kotlin/com/projectcitybuild/pcbridge/webserver/HttpServerConfig.kt b/pcbridge-web-server/src/main/kotlin/com/projectcitybuild/pcbridge/webserver/HttpServerConfig.kt new file mode 100644 index 000000000..c71b71349 --- /dev/null +++ b/pcbridge-web-server/src/main/kotlin/com/projectcitybuild/pcbridge/webserver/HttpServerConfig.kt @@ -0,0 +1,6 @@ +package com.projectcitybuild.pcbridge.webserver + +data class HttpServerConfig( + val authToken: String, + val port: Int, +) \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index 9fc64d37e..f11a5b0f0 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -2,3 +2,4 @@ rootProject.name = "pcbridge" include("pcbridge-http") include("pcbridge-spigot") +include("pcbridge-web-server") From ae43b1ecad6aae645bffa5280e0aef1242feb17e Mon Sep 17 00:00:00 2001 From: andyksaw Date: Wed, 23 Oct 2024 17:48:52 +0900 Subject: [PATCH 13/15] Handle incoming ban requests --- .../pcbridge/http/clients/PCBClientFactory.kt | 2 +- .../pcbridge/http/responses/DonationPerk.kt | 2 +- .../pcbridge/http/responses/IPBan.kt | 5 ++- .../pcbridge/http/responses/Player.kt | 26 ++++++++++++ .../pcbridge/http/responses/PlayerBan.kt | 8 +++- .../gson}/LocalDateTimeTypeAdapter.kt | 2 +- .../serializable/LocalDateTimeSerializer.kt | 2 +- .../serializable/UUIDSerializer.kt | 2 +- .../projectcitybuild/pcbridge/Container.kt | 14 +++++++ .../com/projectcitybuild/pcbridge/Plugin.kt | 4 ++ .../pcbridge/WebServerDelegate.kt | 16 ++++++++ .../pcbridge/core/state/ServerState.kt | 4 +- .../bans/events/IPBanRequestedEvent.kt | 20 ++++++++++ .../bans/events/UUIDBanRequestedEvent.kt | 20 ++++++++++ .../listeners/AuthorizeConnectionListener.kt | 31 ++------------ .../bans/listeners/IPBanRequestListener.kt | 36 +++++++++++++++++ .../bans/listeners/UUIDBanRequestListener.kt | 40 +++++++++++++++++++ .../bans/repositories/PlayerRepository.kt | 2 +- .../features/bans/utilities/BanMessage.kt | 26 ++++++++++++ .../bans/{ => utilities}/Sanitizer.kt | 2 +- .../features/bans/{ => utilities}/ValidIP.kt | 2 +- .../features/register/commands/CodeCommand.kt | 1 - .../pcbridge/features/bans/SanitizerTest.kt | 1 + .../pcbridge/features/bans/ValidIPTest.kt | 1 + .../pcbridge/webserver/HttpServer.kt | 19 +++++++++ 25 files changed, 248 insertions(+), 40 deletions(-) create mode 100644 pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/Player.kt rename pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/{deserializers => serialization/gson}/LocalDateTimeTypeAdapter.kt (94%) rename pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/{ => serialization}/serializable/LocalDateTimeSerializer.kt (92%) rename pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/{ => serialization}/serializable/UUIDSerializer.kt (90%) create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/events/IPBanRequestedEvent.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/events/UUIDBanRequestedEvent.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/listeners/IPBanRequestListener.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/listeners/UUIDBanRequestListener.kt create mode 100644 pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/utilities/BanMessage.kt rename pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/{ => utilities}/Sanitizer.kt (91%) rename pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/{ => utilities}/ValidIP.kt (85%) diff --git a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/clients/PCBClientFactory.kt b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/clients/PCBClientFactory.kt index 63dbbd57b..0b0ef58c7 100644 --- a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/clients/PCBClientFactory.kt +++ b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/clients/PCBClientFactory.kt @@ -2,7 +2,7 @@ package com.projectcitybuild.pcbridge.http.clients import com.google.gson.GsonBuilder -import com.projectcitybuild.pcbridge.http.deserializers.LocalDateTimeTypeAdapter +import com.projectcitybuild.pcbridge.http.serialization.gson.LocalDateTimeTypeAdapter import okhttp3.OkHttpClient import okhttp3.logging.HttpLoggingInterceptor import retrofit2.Retrofit diff --git a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/DonationPerk.kt b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/DonationPerk.kt index 172572f6c..5c0473f04 100644 --- a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/DonationPerk.kt +++ b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/DonationPerk.kt @@ -1,7 +1,7 @@ package com.projectcitybuild.pcbridge.http.responses import com.google.gson.annotations.SerializedName -import com.projectcitybuild.pcbridge.http.serializable.LocalDateTimeSerializer +import com.projectcitybuild.pcbridge.http.serialization.serializable.LocalDateTimeSerializer import kotlinx.serialization.Serializable import java.time.LocalDateTime diff --git a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/IPBan.kt b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/IPBan.kt index cbea2f30b..e560ee260 100644 --- a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/IPBan.kt +++ b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/IPBan.kt @@ -1,7 +1,7 @@ package com.projectcitybuild.pcbridge.http.responses import com.google.gson.annotations.SerializedName -import com.projectcitybuild.pcbridge.http.serializable.LocalDateTimeSerializer +import com.projectcitybuild.pcbridge.http.serialization.serializable.LocalDateTimeSerializer import kotlinx.serialization.Serializable import java.time.LocalDateTime @@ -10,6 +10,9 @@ data class IPBan( @SerializedName("id") val id: Int, + @SerializedName("ip_address") + val ipAddress: String, + @SerializedName("banner_player_id") val bannerPlayerId: Int, diff --git a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/Player.kt b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/Player.kt new file mode 100644 index 000000000..d0d4aa4a6 --- /dev/null +++ b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/Player.kt @@ -0,0 +1,26 @@ +package com.projectcitybuild.pcbridge.http.responses + +import com.google.gson.annotations.SerializedName +import com.projectcitybuild.pcbridge.http.serialization.serializable.LocalDateTimeSerializer +import kotlinx.serialization.Serializable +import java.time.LocalDateTime + +@Serializable +data class Player( + @SerializedName("player_minecraft_id") + val id: String, + + @SerializedName("uuid") + val uuid: String, + + @SerializedName("alias") + val alias: String, + + @SerializedName("last_seen_at") + @Serializable(with = LocalDateTimeSerializer::class) + val lastSeenAt: LocalDateTime?, + + @SerializedName("last_synced_at") + @Serializable(with = LocalDateTimeSerializer::class) + val lastSyncedAt: LocalDateTime?, +) diff --git a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/PlayerBan.kt b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/PlayerBan.kt index d4a1e116e..c097513a7 100644 --- a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/PlayerBan.kt +++ b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/PlayerBan.kt @@ -1,7 +1,7 @@ package com.projectcitybuild.pcbridge.http.responses import com.google.gson.annotations.SerializedName -import com.projectcitybuild.pcbridge.http.serializable.LocalDateTimeSerializer +import com.projectcitybuild.pcbridge.http.serialization.serializable.LocalDateTimeSerializer import kotlinx.serialization.Serializable import java.time.LocalDateTime @@ -16,9 +16,15 @@ data class PlayerBan( @SerializedName("banned_player_alias") val bannedPlayerAlias: String, + @SerializedName("banned_player") + val bannedPlayer: Player?, + @SerializedName("banner_player_id") val bannerPlayerId: Int? = null, + @SerializedName("banner_player") + val bannerPlayer: Player? = null, + @SerializedName("reason") val reason: String? = null, diff --git a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/deserializers/LocalDateTimeTypeAdapter.kt b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/serialization/gson/LocalDateTimeTypeAdapter.kt similarity index 94% rename from pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/deserializers/LocalDateTimeTypeAdapter.kt rename to pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/serialization/gson/LocalDateTimeTypeAdapter.kt index c9fd55cc1..dc8a8ad44 100644 --- a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/deserializers/LocalDateTimeTypeAdapter.kt +++ b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/serialization/gson/LocalDateTimeTypeAdapter.kt @@ -1,4 +1,4 @@ -package com.projectcitybuild.pcbridge.http.deserializers +package com.projectcitybuild.pcbridge.http.serialization.gson import com.google.gson.JsonDeserializationContext import com.google.gson.JsonDeserializer diff --git a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/serializable/LocalDateTimeSerializer.kt b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/serialization/serializable/LocalDateTimeSerializer.kt similarity index 92% rename from pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/serializable/LocalDateTimeSerializer.kt rename to pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/serialization/serializable/LocalDateTimeSerializer.kt index ea7bec761..fb655f7fc 100644 --- a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/serializable/LocalDateTimeSerializer.kt +++ b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/serialization/serializable/LocalDateTimeSerializer.kt @@ -1,4 +1,4 @@ -package com.projectcitybuild.pcbridge.http.serializable +package com.projectcitybuild.pcbridge.http.serialization.serializable import kotlinx.serialization.KSerializer import kotlinx.serialization.descriptors.PrimitiveKind diff --git a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/serializable/UUIDSerializer.kt b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/serialization/serializable/UUIDSerializer.kt similarity index 90% rename from pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/serializable/UUIDSerializer.kt rename to pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/serialization/serializable/UUIDSerializer.kt index 2347d142e..39de88f0a 100644 --- a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/serializable/UUIDSerializer.kt +++ b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/serialization/serializable/UUIDSerializer.kt @@ -1,4 +1,4 @@ -package com.projectcitybuild.pcbridge.http.serializable +package com.projectcitybuild.pcbridge.http.serialization.serializable import kotlinx.serialization.KSerializer import kotlinx.serialization.descriptors.PrimitiveKind diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/Container.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/Container.kt index 6cd569c69..e04e955bc 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/Container.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/Container.kt @@ -17,6 +17,8 @@ import com.projectcitybuild.pcbridge.features.announcements.listeners.Announceme import com.projectcitybuild.pcbridge.features.announcements.repositories.AnnouncementRepository import com.projectcitybuild.pcbridge.features.bans.actions.AuthorizeConnection import com.projectcitybuild.pcbridge.features.bans.listeners.AuthorizeConnectionListener +import com.projectcitybuild.pcbridge.features.bans.listeners.IPBanRequestListener +import com.projectcitybuild.pcbridge.features.bans.listeners.UUIDBanRequestListener import com.projectcitybuild.pcbridge.features.bans.repositories.PlayerRepository import com.projectcitybuild.pcbridge.features.chat.ChatBadgeFormatter import com.projectcitybuild.pcbridge.features.chat.ChatGroupFormatter @@ -383,6 +385,18 @@ private fun Module.bans() { eventBroadcaster = get(), ) } + + factory { + UUIDBanRequestListener( + server = get(), + ) + } + + factory { + IPBanRequestListener( + server = get(), + ) + } } private fun Module.nightVision() { diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/Plugin.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/Plugin.kt index a6e97f47a..bc97e40ab 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/Plugin.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/Plugin.kt @@ -5,6 +5,8 @@ import com.projectcitybuild.pcbridge.core.errors.SentryReporter import com.projectcitybuild.pcbridge.core.errors.trace import com.projectcitybuild.pcbridge.features.announcements.listeners.AnnouncementEnableListener import com.projectcitybuild.pcbridge.features.bans.listeners.AuthorizeConnectionListener +import com.projectcitybuild.pcbridge.features.bans.listeners.IPBanRequestListener +import com.projectcitybuild.pcbridge.features.bans.listeners.UUIDBanRequestListener import com.projectcitybuild.pcbridge.features.chat.listeners.EmojiChatListener import com.projectcitybuild.pcbridge.features.chat.listeners.FormatNameChatListener import com.projectcitybuild.pcbridge.features.chat.listeners.SyncPlayerChatListener @@ -132,12 +134,14 @@ private class Lifecycle : KoinComponent { get(), get(), get(), + get(), get(), get(), get(), get(), get(), get(), + get(), ) get().enable() diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/WebServerDelegate.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/WebServerDelegate.kt index cb1a97001..e5f2466bb 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/WebServerDelegate.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/WebServerDelegate.kt @@ -1,6 +1,10 @@ package com.projectcitybuild.pcbridge +import com.projectcitybuild.pcbridge.features.bans.events.IPBanRequestedEvent +import com.projectcitybuild.pcbridge.features.bans.events.UUIDBanRequestedEvent import com.projectcitybuild.pcbridge.features.groups.events.PlayerSyncRequestedEvent +import com.projectcitybuild.pcbridge.http.responses.IPBan +import com.projectcitybuild.pcbridge.http.responses.PlayerBan import com.projectcitybuild.pcbridge.support.spigot.SpigotEventBroadcaster import com.projectcitybuild.pcbridge.webserver.HttpServerDelegate import java.util.UUID @@ -13,4 +17,16 @@ class WebServerDelegate( PlayerSyncRequestedEvent(playerUUID = uuid), ) } + + override suspend fun banPlayer(ban: PlayerBan) { + eventBroadcaster.broadcast( + UUIDBanRequestedEvent(ban = ban), + ) + } + + override suspend fun banIP(ban: IPBan) { + eventBroadcaster.broadcast( + IPBanRequestedEvent(ban = ban), + ) + } } \ No newline at end of file diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/core/state/ServerState.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/core/state/ServerState.kt index 0d2e911d4..399ef00d2 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/core/state/ServerState.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/core/state/ServerState.kt @@ -4,8 +4,8 @@ import com.projectcitybuild.pcbridge.http.responses.Account import com.projectcitybuild.pcbridge.http.responses.Badge import com.projectcitybuild.pcbridge.http.responses.DonationPerk import com.projectcitybuild.pcbridge.http.responses.PlayerData -import com.projectcitybuild.pcbridge.http.serializable.LocalDateTimeSerializer -import com.projectcitybuild.pcbridge.http.serializable.UUIDSerializer +import com.projectcitybuild.pcbridge.http.serialization.serializable.LocalDateTimeSerializer +import com.projectcitybuild.pcbridge.http.serialization.serializable.UUIDSerializer import kotlinx.serialization.Serializable import java.time.LocalDateTime import java.util.UUID diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/events/IPBanRequestedEvent.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/events/IPBanRequestedEvent.kt new file mode 100644 index 000000000..63fbbc2e7 --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/events/IPBanRequestedEvent.kt @@ -0,0 +1,20 @@ +package com.projectcitybuild.pcbridge.features.bans.events + +import com.projectcitybuild.pcbridge.http.responses.IPBan +import org.bukkit.event.Event +import org.bukkit.event.HandlerList + +class IPBanRequestedEvent( + val ban: IPBan, +) : Event() { + override fun getHandlers(): HandlerList { + return HANDLERS + } + + companion object { + private val HANDLERS = HandlerList() + + @JvmStatic + fun getHandlerList() = HANDLERS + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/events/UUIDBanRequestedEvent.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/events/UUIDBanRequestedEvent.kt new file mode 100644 index 000000000..119c7b3fa --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/events/UUIDBanRequestedEvent.kt @@ -0,0 +1,20 @@ +package com.projectcitybuild.pcbridge.features.bans.events + +import com.projectcitybuild.pcbridge.http.responses.PlayerBan +import org.bukkit.event.Event +import org.bukkit.event.HandlerList + +class UUIDBanRequestedEvent( + val ban: PlayerBan, +) : Event() { + override fun getHandlers(): HandlerList { + return HANDLERS + } + + companion object { + private val HANDLERS = HandlerList() + + @JvmStatic + fun getHandlerList() = HANDLERS + } +} diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/listeners/AuthorizeConnectionListener.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/listeners/AuthorizeConnectionListener.kt index 02419d779..a41337d5b 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/listeners/AuthorizeConnectionListener.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/listeners/AuthorizeConnectionListener.kt @@ -5,10 +5,9 @@ import com.projectcitybuild.pcbridge.core.logger.log import com.projectcitybuild.pcbridge.features.bans.actions.AuthorizeConnection import com.projectcitybuild.pcbridge.features.bans.events.ConnectionPermittedEvent import com.projectcitybuild.pcbridge.features.bans.repositories.PlayerRepository +import com.projectcitybuild.pcbridge.features.bans.utilities.toMiniMessage import com.projectcitybuild.pcbridge.support.spigot.SpigotEventBroadcaster import kotlinx.coroutines.runBlocking -import net.kyori.adventure.text.Component -import net.kyori.adventure.text.minimessage.MiniMessage import org.bukkit.event.EventHandler import org.bukkit.event.EventPriority import org.bukkit.event.Listener @@ -71,29 +70,7 @@ class AuthorizeConnectionListener( } } -private fun AuthorizeConnection.Ban.toMessage(): Component { - return when (this) { - is AuthorizeConnection.Ban.UUID -> - MiniMessage.miniMessage().deserialize( - """ - You are currently banned. - - Reason: ${value.reason ?: "No reason provided"} - Expires: ${value.expiresAt ?: "Never"} - - Appeal @ https://projectcitybuild.com" - """.trimIndent(), - ) - - is AuthorizeConnection.Ban.IP -> - MiniMessage.miniMessage().deserialize( - """ - You are currently IP banned. - - Reason: ${value.reason ?: "No reason provided" } - - Appeal @ https://projectcitybuild.com - """.trimIndent(), - ) - } +private fun AuthorizeConnection.Ban.toMessage() = when (this) { + is AuthorizeConnection.Ban.UUID -> value.toMiniMessage() + is AuthorizeConnection.Ban.IP -> value.toMiniMessage() } diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/listeners/IPBanRequestListener.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/listeners/IPBanRequestListener.kt new file mode 100644 index 000000000..568b67522 --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/listeners/IPBanRequestListener.kt @@ -0,0 +1,36 @@ +package com.projectcitybuild.pcbridge.features.bans.listeners + +import com.projectcitybuild.pcbridge.core.logger.log +import com.projectcitybuild.pcbridge.features.bans.events.IPBanRequestedEvent +import com.projectcitybuild.pcbridge.features.bans.utilities.Sanitizer +import com.projectcitybuild.pcbridge.features.bans.utilities.toMiniMessage +import org.bukkit.Server +import org.bukkit.event.EventHandler +import org.bukkit.event.Listener +import org.bukkit.event.player.PlayerKickEvent + +/** + * Receives an incoming ban from PCB and bans the offending + * player if they're online + */ +class IPBanRequestListener( + private val server: Server, +) : Listener { + @EventHandler + fun onBanRequested(event: IPBanRequestedEvent) { + val matchingPlayer = server.onlinePlayers.firstOrNull { + Sanitizer.sanitizedIP(it.address.address.toString()) == Sanitizer.sanitizedIP(event.ban.ipAddress) + } + if (matchingPlayer == null) { + log.info { "Skipping ban fulfillment, ip address (${event.ban.ipAddress}) not found" } + return + } + + log.info { "Player found matching ip address (${event.ban.ipAddress}), banning ${matchingPlayer.name}" } + + matchingPlayer.kick( + event.ban.toMiniMessage(), + PlayerKickEvent.Cause.IP_BANNED, + ) + } +} \ No newline at end of file diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/listeners/UUIDBanRequestListener.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/listeners/UUIDBanRequestListener.kt new file mode 100644 index 000000000..344bfbedc --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/listeners/UUIDBanRequestListener.kt @@ -0,0 +1,40 @@ +package com.projectcitybuild.pcbridge.features.bans.listeners + +import com.projectcitybuild.pcbridge.core.logger.log +import com.projectcitybuild.pcbridge.features.bans.events.UUIDBanRequestedEvent +import com.projectcitybuild.pcbridge.features.bans.utilities.toMiniMessage +import org.bukkit.Server +import org.bukkit.event.EventHandler +import org.bukkit.event.Listener +import org.bukkit.event.player.PlayerKickEvent + +/** + * Receives an incoming ban from PCB and bans the offending + * player if they're online + */ +class UUIDBanRequestListener( + private val server: Server, +) : Listener { + @EventHandler + fun onBanRequested(event: UUIDBanRequestedEvent) { + val bannedPlayer = event.ban.bannedPlayer + if (bannedPlayer == null) { + log.info { "Skipping ban fulfillment, ban had no player data" } + return + } + val matchingPlayer = server.onlinePlayers.firstOrNull { + it.uniqueId.toString().replace("-", "") == bannedPlayer.uuid + } + if (matchingPlayer == null) { + log.info { "Skipping ban fulfillment, player (${bannedPlayer.uuid}) not found" } + return + } + + log.info { "Player found, banning ${matchingPlayer.uniqueId}" } + + matchingPlayer.kick( + event.ban.toMiniMessage(), + PlayerKickEvent.Cause.BANNED, + ) + } +} \ No newline at end of file diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/repositories/PlayerRepository.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/repositories/PlayerRepository.kt index c330edce7..96541ac35 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/repositories/PlayerRepository.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/repositories/PlayerRepository.kt @@ -1,6 +1,6 @@ package com.projectcitybuild.pcbridge.features.bans.repositories -import com.projectcitybuild.pcbridge.features.bans.Sanitizer +import com.projectcitybuild.pcbridge.features.bans.utilities.Sanitizer import com.projectcitybuild.pcbridge.http.responses.PlayerData import com.projectcitybuild.pcbridge.http.services.pcb.PlayerHttpService import java.net.InetAddress diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/utilities/BanMessage.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/utilities/BanMessage.kt new file mode 100644 index 000000000..e16b27c3d --- /dev/null +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/utilities/BanMessage.kt @@ -0,0 +1,26 @@ +package com.projectcitybuild.pcbridge.features.bans.utilities + +import com.projectcitybuild.pcbridge.http.responses.IPBan +import com.projectcitybuild.pcbridge.http.responses.PlayerBan +import net.kyori.adventure.text.minimessage.MiniMessage + +fun PlayerBan.toMiniMessage() = MiniMessage.miniMessage().deserialize( + """ + You are currently banned. + + Reason: ${reason ?: "No reason provided"} + Expires: ${expiresAt ?: "Never"} + + Appeal @ https://projectcitybuild.com" + """.trimIndent(), +) + +fun IPBan.toMiniMessage() = MiniMessage.miniMessage().deserialize( + """ + You are currently IP banned. + + Reason: ${reason ?: "No reason provided" } + + Appeal @ https://projectcitybuild.com + """.trimIndent(), +) \ No newline at end of file diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/Sanitizer.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/utilities/Sanitizer.kt similarity index 91% rename from pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/Sanitizer.kt rename to pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/utilities/Sanitizer.kt index 674c03dff..4897cc975 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/Sanitizer.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/utilities/Sanitizer.kt @@ -1,4 +1,4 @@ -package com.projectcitybuild.pcbridge.features.bans +package com.projectcitybuild.pcbridge.features.bans.utilities class Sanitizer private constructor() { companion object { diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/ValidIP.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/utilities/ValidIP.kt similarity index 85% rename from pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/ValidIP.kt rename to pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/utilities/ValidIP.kt index 4bc17e77d..4e44ba35e 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/ValidIP.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/bans/utilities/ValidIP.kt @@ -1,4 +1,4 @@ -package com.projectcitybuild.pcbridge.features.bans +package com.projectcitybuild.pcbridge.features.bans.utilities import java.util.regex.Pattern diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/register/commands/CodeCommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/register/commands/CodeCommand.kt index 054a37279..2e46f0a91 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/register/commands/CodeCommand.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/register/commands/CodeCommand.kt @@ -8,7 +8,6 @@ import com.projectcitybuild.pcbridge.support.spigot.CommandArgsParser import com.projectcitybuild.pcbridge.support.spigot.SpigotCommand import net.kyori.adventure.text.Component import net.kyori.adventure.text.format.NamedTextColor -import net.kyori.adventure.text.minimessage.MiniMessage import org.bukkit.command.CommandSender import org.bukkit.entity.Player diff --git a/pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/bans/SanitizerTest.kt b/pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/bans/SanitizerTest.kt index f8dbd084a..7b71a3eff 100644 --- a/pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/bans/SanitizerTest.kt +++ b/pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/bans/SanitizerTest.kt @@ -1,5 +1,6 @@ package com.projectcitybuild.pcbridge.features.bans +import com.projectcitybuild.pcbridge.features.bans.utilities.Sanitizer import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Test diff --git a/pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/bans/ValidIPTest.kt b/pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/bans/ValidIPTest.kt index 21e375239..c26e0e4a9 100644 --- a/pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/bans/ValidIPTest.kt +++ b/pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/bans/ValidIPTest.kt @@ -1,5 +1,6 @@ package com.projectcitybuild.pcbridge.features.bans +import com.projectcitybuild.pcbridge.features.bans.utilities.isValidIP import org.junit.jupiter.api.Assertions.assertFalse import org.junit.jupiter.api.Assertions.assertTrue import org.junit.jupiter.api.Test diff --git a/pcbridge-web-server/src/main/kotlin/com/projectcitybuild/pcbridge/webserver/HttpServer.kt b/pcbridge-web-server/src/main/kotlin/com/projectcitybuild/pcbridge/webserver/HttpServer.kt index 1b86f67c3..ef0aa978d 100644 --- a/pcbridge-web-server/src/main/kotlin/com/projectcitybuild/pcbridge/webserver/HttpServer.kt +++ b/pcbridge-web-server/src/main/kotlin/com/projectcitybuild/pcbridge/webserver/HttpServer.kt @@ -1,5 +1,7 @@ package com.projectcitybuild.pcbridge.webserver +import com.projectcitybuild.pcbridge.http.responses.IPBan +import com.projectcitybuild.pcbridge.http.responses.PlayerBan import io.ktor.http.HttpStatusCode import io.ktor.server.application.call import io.ktor.server.application.install @@ -11,6 +13,7 @@ import io.ktor.server.engine.embeddedServer import io.ktor.server.netty.Netty import io.ktor.server.netty.NettyApplicationEngine import io.ktor.server.plugins.callloging.CallLogging +import io.ktor.server.request.receive import io.ktor.server.request.receiveParameters import io.ktor.server.response.respond import io.ktor.server.routing.post @@ -22,6 +25,8 @@ import java.util.UUID interface HttpServerDelegate { suspend fun syncPlayer(uuid: UUID) + suspend fun banPlayer(ban: PlayerBan) + suspend fun banIP(ban: IPBan) } class HttpServer( @@ -81,6 +86,20 @@ class HttpServer( delegate.syncPlayer(uuid) call.respond(HttpStatusCode.OK) } + post("events/ban/uuid") { + val ban = call.receive() + + call.application.environment.log.info("Banning player: ${ban.bannedPlayerId}") + delegate.banPlayer(ban) + call.respond(HttpStatusCode.OK) + } + post("events/ban/ip") { + val ban = call.receive() + + call.application.environment.log.info("Banning ip: ${ban.ipAddress}") + delegate.banIP(ban) + call.respond(HttpStatusCode.OK) + } } } }.start(wait = false) From 45d44307962aaaf94e857d2a5f46d9e4882de332 Mon Sep 17 00:00:00 2001 From: Andy Saw <7236312+andyksaw@users.noreply.github.com> Date: Thu, 24 Oct 2024 13:06:52 +0000 Subject: [PATCH 14/15] fix: http ban deserialization (#242) * Fix ban body parsing * Remove json * Fix test --- .../pcbridge/http/responses/Player.kt | 8 ++--- .../pcbridge/http/responses/PlayerBan.kt | 12 ++----- .../bans/actions/AuthorizeConnectionTest.kt | 3 +- pcbridge-web-server/build.gradle.kts | 2 ++ .../pcbridge/webserver/HttpServer.kt | 32 ++++++++++++------- .../pcbridge/webserver/PlayerSyncRequest.kt | 6 ++++ 6 files changed, 36 insertions(+), 27 deletions(-) create mode 100644 pcbridge-web-server/src/main/kotlin/com/projectcitybuild/pcbridge/webserver/PlayerSyncRequest.kt diff --git a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/Player.kt b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/Player.kt index d0d4aa4a6..043a8a68a 100644 --- a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/Player.kt +++ b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/Player.kt @@ -8,19 +8,19 @@ import java.time.LocalDateTime @Serializable data class Player( @SerializedName("player_minecraft_id") - val id: String, + val id: Int, @SerializedName("uuid") val uuid: String, @SerializedName("alias") - val alias: String, + val alias: String? = null, @SerializedName("last_seen_at") @Serializable(with = LocalDateTimeSerializer::class) - val lastSeenAt: LocalDateTime?, + val lastSeenAt: LocalDateTime? = null, @SerializedName("last_synced_at") @Serializable(with = LocalDateTimeSerializer::class) - val lastSyncedAt: LocalDateTime?, + val lastSyncedAt: LocalDateTime? = null, ) diff --git a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/PlayerBan.kt b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/PlayerBan.kt index c097513a7..bd6a28b9b 100644 --- a/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/PlayerBan.kt +++ b/pcbridge-http/src/main/kotlin/com/projectcitybuild/pcbridge/http/responses/PlayerBan.kt @@ -10,17 +10,11 @@ data class PlayerBan( @SerializedName("id") val id: Int, - @SerializedName("banned_player_id") - val bannedPlayerId: Int, - - @SerializedName("banned_player_alias") - val bannedPlayerAlias: String, + @SerializedName("banned_alias_at_time") + val bannedPlayerAlias: String? = null, @SerializedName("banned_player") - val bannedPlayer: Player?, - - @SerializedName("banner_player_id") - val bannerPlayerId: Int? = null, + val bannedPlayer: Player? = null, @SerializedName("banner_player") val bannerPlayer: Player? = null, diff --git a/pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/bans/actions/AuthorizeConnectionTest.kt b/pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/bans/actions/AuthorizeConnectionTest.kt index 8d752518a..e97efdb9f 100644 --- a/pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/bans/actions/AuthorizeConnectionTest.kt +++ b/pcbridge-spigot/test/com/projectcitybuild/pcbridge/features/bans/actions/AuthorizeConnectionTest.kt @@ -17,8 +17,6 @@ class AuthorizeConnectionTest { private fun playerBan() = PlayerBan( id = Random.nextInt(), - bannerPlayerId = Random.nextInt(), - bannedPlayerId = Random.nextInt(), bannedPlayerAlias = "alias", createdAt = LocalDateTime.now(), updatedAt = LocalDateTime.now(), @@ -26,6 +24,7 @@ class AuthorizeConnectionTest { private fun ipBan() = IPBan( id = Random.nextInt(), + ipAddress = "192.168.0.1", bannerPlayerId = Random.nextInt(), createdAt = LocalDateTime.now(), updatedAt = LocalDateTime.now(), diff --git a/pcbridge-web-server/build.gradle.kts b/pcbridge-web-server/build.gradle.kts index 6cdf60863..f1613df29 100644 --- a/pcbridge-web-server/build.gradle.kts +++ b/pcbridge-web-server/build.gradle.kts @@ -17,4 +17,6 @@ dependencies { implementation("io.ktor:ktor-server-netty:2.2.4") implementation("io.ktor:ktor-server-call-logging:2.2.4") implementation("io.ktor:ktor-server-auth:2.2.4") + implementation("io.ktor:ktor-server-content-negotiation:2.2.4") + implementation("io.ktor:ktor-serialization-gson:2.2.4") } \ No newline at end of file diff --git a/pcbridge-web-server/src/main/kotlin/com/projectcitybuild/pcbridge/webserver/HttpServer.kt b/pcbridge-web-server/src/main/kotlin/com/projectcitybuild/pcbridge/webserver/HttpServer.kt index ef0aa978d..36c2ae5a8 100644 --- a/pcbridge-web-server/src/main/kotlin/com/projectcitybuild/pcbridge/webserver/HttpServer.kt +++ b/pcbridge-web-server/src/main/kotlin/com/projectcitybuild/pcbridge/webserver/HttpServer.kt @@ -2,7 +2,9 @@ package com.projectcitybuild.pcbridge.webserver import com.projectcitybuild.pcbridge.http.responses.IPBan import com.projectcitybuild.pcbridge.http.responses.PlayerBan +import com.projectcitybuild.pcbridge.http.serialization.gson.LocalDateTimeTypeAdapter import io.ktor.http.HttpStatusCode +import io.ktor.serialization.gson.gson import io.ktor.server.application.call import io.ktor.server.application.install import io.ktor.server.auth.Authentication @@ -13,14 +15,15 @@ import io.ktor.server.engine.embeddedServer import io.ktor.server.netty.Netty import io.ktor.server.netty.NettyApplicationEngine import io.ktor.server.plugins.callloging.CallLogging +import io.ktor.server.plugins.contentnegotiation.ContentNegotiation import io.ktor.server.request.receive -import io.ktor.server.request.receiveParameters import io.ktor.server.response.respond import io.ktor.server.routing.post import io.ktor.server.routing.routing import org.slf4j.LoggerFactory import org.slf4j.event.Level import java.math.BigInteger +import java.time.LocalDateTime import java.util.UUID interface HttpServerDelegate { @@ -62,20 +65,19 @@ class HttpServer( } } } + install(ContentNegotiation) { + gson { + registerTypeAdapter(LocalDateTime::class.java, LocalDateTimeTypeAdapter()) + } + } + routing { authenticate("token") { post("events/player/sync") { - val body = call.receiveParameters() - - val rawUUID = body["uuid"] - if (rawUUID.isNullOrEmpty()) { - call.application.environment.log.info("Bad Request: No UUID provided") - call.respond(HttpStatusCode.BadRequest, "UUID cannot be empty") - return@post - } + val body = call.receive() val uuid = try { - uuidFromAnyString(rawUUID) + uuidFromAnyString(body.uuid) } catch (e: Exception) { call.application.environment.log.info("Bad Request: Invalid UUID") call.respond(HttpStatusCode.BadRequest, "Invalid UUID") @@ -87,9 +89,15 @@ class HttpServer( call.respond(HttpStatusCode.OK) } post("events/ban/uuid") { - val ban = call.receive() + val ban = try { + call.receive() + } catch (e: Exception) { + log.error(e.message) + e.printStackTrace() + throw e + } - call.application.environment.log.info("Banning player: ${ban.bannedPlayerId}") + call.application.environment.log.info("Banning player: ${ban.bannedPlayer?.uuid}") delegate.banPlayer(ban) call.respond(HttpStatusCode.OK) } diff --git a/pcbridge-web-server/src/main/kotlin/com/projectcitybuild/pcbridge/webserver/PlayerSyncRequest.kt b/pcbridge-web-server/src/main/kotlin/com/projectcitybuild/pcbridge/webserver/PlayerSyncRequest.kt new file mode 100644 index 000000000..684f0f0ee --- /dev/null +++ b/pcbridge-web-server/src/main/kotlin/com/projectcitybuild/pcbridge/webserver/PlayerSyncRequest.kt @@ -0,0 +1,6 @@ +package com.projectcitybuild.pcbridge.webserver + +import kotlinx.serialization.Serializable + +@Serializable +data class PlayerSyncRequest(val uuid: String) \ No newline at end of file From 904fcde69f713b174a53aab656a8a57b7a0d5c8c Mon Sep 17 00:00:00 2001 From: Andy Saw <7236312+andyksaw@users.noreply.github.com> Date: Thu, 24 Oct 2024 13:18:43 +0000 Subject: [PATCH 15/15] Improve usage message (#243) --- .../features/groups/commands/SyncCommand.kt | 2 +- .../invisframes/commands/InvisFrameCommand.kt | 2 +- .../commands/NightVisionCommand.kt | 2 +- .../features/register/commands/CodeCommand.kt | 2 +- .../register/commands/RegisterCommand.kt | 2 +- .../staffchat/commands/StaffChatCommand.kt | 2 +- .../features/warps/commands/WarpCommand.kt | 2 +- .../features/warps/commands/WarpsCommand.kt | 2 +- .../warps/commands/warps/WarpCreateCommand.kt | 2 +- .../warps/commands/warps/WarpDeleteCommand.kt | 2 +- .../warps/commands/warps/WarpListCommand.kt | 2 +- .../warps/commands/warps/WarpMoveCommand.kt | 2 +- .../warps/commands/warps/WarpRenameCommand.kt | 2 +- .../support/messages/CommandHelpBuilder.kt | 21 ++++++++++++++++--- .../pcbridge/webserver/HttpServer.kt | 15 ++++++++++--- 15 files changed, 43 insertions(+), 19 deletions(-) diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/groups/commands/SyncCommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/groups/commands/SyncCommand.kt index 340e4d9ce..4d057f8c2 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/groups/commands/SyncCommand.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/groups/commands/SyncCommand.kt @@ -17,7 +17,7 @@ class SyncCommand( ) : SpigotCommand { override val label = "sync" - override val usage = CommandHelpBuilder() + override val usage = CommandHelpBuilder(usage = "/sync [player name]") override suspend fun run( sender: CommandSender, diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/invisframes/commands/InvisFrameCommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/invisframes/commands/InvisFrameCommand.kt index 536472ecc..8f16d5d34 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/invisframes/commands/InvisFrameCommand.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/invisframes/commands/InvisFrameCommand.kt @@ -19,7 +19,7 @@ class InvisFrameCommand( ) : SpigotCommand { override val label = "invisframe" - override val usage = CommandHelpBuilder() + override val usage = CommandHelpBuilder(usage = "/invisframe [glowing]") override suspend fun run( sender: CommandSender, diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/nightvision/commands/NightVisionCommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/nightvision/commands/NightVisionCommand.kt index 1e469c1f6..8b29f1643 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/nightvision/commands/NightVisionCommand.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/nightvision/commands/NightVisionCommand.kt @@ -15,7 +15,7 @@ import org.bukkit.potion.PotionEffectType class NightVisionCommand : SpigotCommand { override val label = "nv" - override val usage = CommandHelpBuilder() + override val usage = CommandHelpBuilder(usage = "/nv [on|off]") override suspend fun run( sender: CommandSender, diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/register/commands/CodeCommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/register/commands/CodeCommand.kt index 2e46f0a91..6f84bb13f 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/register/commands/CodeCommand.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/register/commands/CodeCommand.kt @@ -16,7 +16,7 @@ class CodeCommand( ) : SpigotCommand { override val label = "code" - override val usage = CommandHelpBuilder() + override val usage = CommandHelpBuilder(usage = "/code ") override suspend fun run( sender: CommandSender, diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/register/commands/RegisterCommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/register/commands/RegisterCommand.kt index 5242c4f9a..beb092ada 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/register/commands/RegisterCommand.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/register/commands/RegisterCommand.kt @@ -17,7 +17,7 @@ class RegisterCommand( ) : SpigotCommand { override val label = "register" - override val usage = CommandHelpBuilder() + override val usage = CommandHelpBuilder(usage = "/register ") override suspend fun run( sender: CommandSender, diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/staffchat/commands/StaffChatCommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/staffchat/commands/StaffChatCommand.kt index cc51bd829..0a41e911a 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/staffchat/commands/StaffChatCommand.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/staffchat/commands/StaffChatCommand.kt @@ -15,7 +15,7 @@ class StaffChatCommand( ) : SpigotCommand { override val label = "a" - override val usage = CommandHelpBuilder() // TODO + override val usage = CommandHelpBuilder(usage = "/a ") override suspend fun run( sender: CommandSender, diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/commands/WarpCommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/commands/WarpCommand.kt index 6c70d50da..fb4295d7e 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/commands/WarpCommand.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/commands/WarpCommand.kt @@ -22,7 +22,7 @@ class WarpCommand( ) : SpigotCommand { override val label = "warp" - override val usage = CommandHelpBuilder() // TODO + override val usage = CommandHelpBuilder(usage = "/warp ") // TODO override suspend fun run( sender: CommandSender, diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/commands/WarpsCommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/commands/WarpsCommand.kt index 270f1f234..6cb65b2a3 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/commands/WarpsCommand.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/commands/WarpsCommand.kt @@ -26,7 +26,7 @@ class WarpsCommand( override val label = "warps" override val usage = - CommandHelpBuilder() + CommandHelpBuilder(usage = "/warps") .subcommand( label = "/warps list", description = "shows all available warps", diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/commands/warps/WarpCreateCommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/commands/warps/WarpCreateCommand.kt index 558c62159..7e76cca57 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/commands/warps/WarpCreateCommand.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/commands/warps/WarpCreateCommand.kt @@ -23,7 +23,7 @@ class WarpCreateCommand( ) : SpigotCommand { override val label = "create" - override val usage = CommandHelpBuilder() // TODO + override val usage = CommandHelpBuilder(usage = "/warps create [x:] [y:] [z:] [pitch:] [yaw:] [world:]") override suspend fun run( sender: CommandSender, diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/commands/warps/WarpDeleteCommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/commands/warps/WarpDeleteCommand.kt index a9f2baaa8..4e226e46c 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/commands/warps/WarpDeleteCommand.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/commands/warps/WarpDeleteCommand.kt @@ -18,7 +18,7 @@ class WarpDeleteCommand( ) : SpigotCommand { override val label = "delete" - override val usage = CommandHelpBuilder() // TODO + override val usage = CommandHelpBuilder(usage = "/warps delete ") override suspend fun run( sender: CommandSender, diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/commands/warps/WarpListCommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/commands/warps/WarpListCommand.kt index 3f2f75b43..4e539b1ce 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/commands/warps/WarpListCommand.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/commands/warps/WarpListCommand.kt @@ -21,7 +21,7 @@ class WarpListCommand( ) : SpigotCommand { override val label = "list" - override val usage = CommandHelpBuilder() // TODO + override val usage = CommandHelpBuilder(usage = "/warps list") override suspend fun run( sender: CommandSender, diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/commands/warps/WarpMoveCommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/commands/warps/WarpMoveCommand.kt index 81776c745..90e703c0d 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/commands/warps/WarpMoveCommand.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/commands/warps/WarpMoveCommand.kt @@ -17,7 +17,7 @@ class WarpMoveCommand( ) : SpigotCommand { override val label = "move" - override val usage = CommandHelpBuilder() // TODO + override val usage = CommandHelpBuilder(usage = "/warps move ") override suspend fun run( sender: CommandSender, diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/commands/warps/WarpRenameCommand.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/commands/warps/WarpRenameCommand.kt index f4c8fe053..b185fc5bd 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/commands/warps/WarpRenameCommand.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/features/warps/commands/warps/WarpRenameCommand.kt @@ -15,7 +15,7 @@ class WarpRenameCommand( ) : SpigotCommand { override val label = "rename" - override val usage = CommandHelpBuilder() // TODO + override val usage = CommandHelpBuilder(usage = "/warps rename ") override suspend fun run( sender: CommandSender, diff --git a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/support/messages/CommandHelpBuilder.kt b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/support/messages/CommandHelpBuilder.kt index e978729ac..95f6211dd 100644 --- a/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/support/messages/CommandHelpBuilder.kt +++ b/pcbridge-spigot/src/main/kotlin/com/projectcitybuild/pcbridge/support/messages/CommandHelpBuilder.kt @@ -3,8 +3,11 @@ package com.projectcitybuild.pcbridge.support.messages import net.kyori.adventure.text.Component import net.kyori.adventure.text.TextComponent import net.kyori.adventure.text.format.NamedTextColor +import net.kyori.adventure.text.format.TextDecoration -class CommandHelpBuilder { +class CommandHelpBuilder( + private val usage: String?, +) { private val commands: MutableList = mutableListOf() data class CommandHelp( @@ -26,15 +29,27 @@ class CommandHelpBuilder { fun build(hasPermission: (String) -> Boolean): TextComponent { return Component.text() - .appendDivider() .also { + if (!usage.isNullOrEmpty()) { + it.append( + Component.text(usage) + .color(NamedTextColor.GRAY) + .decorate(TextDecoration.ITALIC) + ) + it.appendNewline() + } + if (commands.isNotEmpty()) { + it.appendDivider() + } commands.forEach { command -> if (hasPermission(command.permission)) { it.append(command.asComponent()) } } + if (commands.isNotEmpty()) { + it.appendDivider() + } } - .appendDivider() .build() } } diff --git a/pcbridge-web-server/src/main/kotlin/com/projectcitybuild/pcbridge/webserver/HttpServer.kt b/pcbridge-web-server/src/main/kotlin/com/projectcitybuild/pcbridge/webserver/HttpServer.kt index 36c2ae5a8..eb401faf7 100644 --- a/pcbridge-web-server/src/main/kotlin/com/projectcitybuild/pcbridge/webserver/HttpServer.kt +++ b/pcbridge-web-server/src/main/kotlin/com/projectcitybuild/pcbridge/webserver/HttpServer.kt @@ -74,7 +74,12 @@ class HttpServer( routing { authenticate("token") { post("events/player/sync") { - val body = call.receive() + val body = try { + call.receive() + } catch (e: Exception) { + e.printStackTrace() + throw e + } val uuid = try { uuidFromAnyString(body.uuid) @@ -92,7 +97,6 @@ class HttpServer( val ban = try { call.receive() } catch (e: Exception) { - log.error(e.message) e.printStackTrace() throw e } @@ -102,7 +106,12 @@ class HttpServer( call.respond(HttpStatusCode.OK) } post("events/ban/ip") { - val ban = call.receive() + val ban = try { + call.receive() + } catch (e: Exception) { + e.printStackTrace() + throw e + } call.application.environment.log.info("Banning ip: ${ban.ipAddress}") delegate.banIP(ban)